(三)java从零开始(方法和堆栈)有待研究

来源:互联网 发布:淘宝客服沟通技巧简答 编辑:程序博客网 时间:2024/05/16 14:13

方法的引入

方法:完成特定功能的代码块

在其他语言中可能被叫做函数,其本质就是一种特定的功能

方法的格式 :

修饰符 返回值类型 方法名 (参数类型1 参数名1,参数类型2.。。){

方法体;

return 返回值;(void不需要)

}

参数名定义方法和调用方法可以不一样。调用方法如果有返回值需要接受返回值。

方法的分类:

有明确返回值的方法:有return返回语句

没有明确返回值的方法:返回值类型为void,不需要返回值,但可以有return用于结束方法。

方法的注意事项:

方法是平级的,不可以嵌套

如果返回值是一个明确的数据类型,那么必须有才return返回一个值

方法调用才生效

不接受返回值,单独调用没有意义,直接sysout一个数据(输出调用)意义不大,用变量接受返回值(赋值调用)有意义

没有返回值的方法,只能单独调用,用作输出。

方法名一样,参数列表不同(JVM根据数据类型或者参数个数不同,顺序等),叫做方法重载。与返回值类型无关。

方法重载的好处,方便记忆,提高效率。





数组的引入

数组:存储多个同一个数据类型变量的容器。

既可以存储基本数据类型,也可以存储引用数据类型。

数据类型[] 数组名称;(声明数组之后一定要初始化)

数组初始化:为数组中每个元素申请内存空间,并为数组元素赋值。

         静态初始化:指定元素的值,系统根据元素个数决定数组长度。int[] arr={1,2,3}.  int[] arr =new int[]{1,2,3}

         动态初始化:指定数组长度,系统为数组中元素进行初始化。int[] arr =new int[80];

直接输出数组名称,结果为数组在内存中的地址值。

数组中从0开始编号,最大的编号为数组长度-1,这个值也叫做索引(角标)。

成员变量,jvm会完成初始化,自动赋值。定义在方法中的局部变量必须手动赋值。

栈中是地址值,指向堆中new代表的内存空间

不同的数组可以指向同一个内存地址。

不论是静态初始化还是动态初始化,要么制定长度,要么制定元素,不能两个都指定。

超出角标,可以编译,运行会报错。java.lang.ArrayIndexOutOfBoundsException:角标越界,超出范围

java.lang.NullPointerException 空指针异常(因为访问的元素为null)



逆序输出数组思路

让数组元素逆序互换,定义开始索引和结束索引,通过中间变量temp互换两个索引对应的值,开始索引不断+1,结束索引不断-1,直到开始索引等于结束索引。

用for循环实现遍历

获取数组最值思路

假设第一个元素就是最值,然后进行遍历,拿这个元素和剩余的元素进行比较,发现更大或者更小,进行替换。

public static int[] getNumber(int[] arr){int max=arr[0];int min=arr[0];for(int i=0;i<arr.length;i++){if(arr[i]>max){max=arr[i];}if(arr[i]<min){min=arr[i];}}int[] result ={max,min};return result;}
方法一般为先使用后创建。以便于规划整体

二维数组(元素为一维数组的数组)

第一种:

int[][] 数组名称=new int[m][n];

m:有多少个一维数组

n:每个一维数组中有多少元素

取值?

数组名[m][n] :获取第m+1个数组中第n+1个元素

二维数组的地址是首地址,所包含的每个数组都有自己的地址。

第二种:

int[][] 数组名=new int[m][];

只开辟了m个一维数组的空间,数组长度并没有指定。

public static void main(String[] args) {// TODO Auto-generated method stubint[][] arr = new int[3][];System.out.println(arr[0]);//System.out.println(arr[0][0]);arr[0] = new int[5];System.out.println(arr[0]);System.out.println(arr[0][0]);}
在对每个一维空间进行初始化之前,没有地址,而且每个数组的元素都是空。(空指针异常)

对一维数组初始化之后,一维数组有了对应的内存地址,一维数组中的元素为0.

类似于动态初始化

第三种:

int[][]  数组名称=new int[][]{{1,2,3}{1,2}{3,4}};

同理,手动赋值之后不能指定数组个数和元素个数

二维数组的length是一维数组的个数


遍历二维数组采用重载,一个参数为int[][],另一个参数为int[]。在int[][]中再次调用参数为int[]的方法





面向对象思想

功能多了,方法就多了,方法多了,就需要很多类来存放,类多了,就做成框架。编程思想:先找到框架,再找到类,再找到对应的方法。

面向过程的思想:分析要做什么,再分析怎么做,并一步步的实现。

面向对象就是基于面向过程的。将复杂事情简单化,从执行者变为指挥者。

面向对象开发:

不断的创造对象,指挥对象做事情。

面向对象设计:

管理和维护对象之间的关系

面向对象的特征:

封装

继承

多态

定义类:属性对应成员变量。 行为对应成员方法。

使用类的方法,创建类的对象

栈:存放的都是局部变量,不会为变量赋值,方法的执行都是在栈中。基本数据类型。

堆:存放着new出来的东西,会为变量赋值,引用变量的初始化都是null,基本数据类的值就是默认值。

方法区:类的字节码文件存放在方法去中的class区,方法区中存放的都是唯一的东西,方法区里面还有一个static区,创建对象时,在方法区中的字节码文件中的没有被static修饰的成员变量会在堆中拷贝一份,方法还是存放在方法区中的class区中,堆中存放的是方法的地址值。常量池。

方法区:1⃣️class区

                2⃣️static区

不创建对象,类也会编译。

成员变量和局部变量之间有哪些区别?

类中的位置

          成员变量定义在类中,方法外

          局部变量定义在方法内部或者参数列表上

内存中位置

          成员变量在堆中

          局部变量在栈中

生命周期

          成员变量随着对象的创建而创建,随着对象的消失而消失

          局部变量随着方法的创建而创建,随着方法的消失而消失

初始化值

          成员变量有初始化值

  局部变量需要手动赋值

利用同名变量的时候,遵循就近原则




基本数据类型和引用数据类型作为实数参数传递时的区别

基本数据类型存储在栈中,栈中调用方法互换两个变量的值,随后方法结束,交换结果随之消失,变量值依旧不变。形参不影响实参

引用数据类型存储在堆中,发生改变就改变了,再次调用显示就是改变后的结果。形参影响实参。

定义方法是的参数就是形参,调用方法的时候参数就是实参。


匿名对象:没有名字的一个对象

new test().show(). 直接匿名调用方法

使用场景:

当类中的方法仅需要调用一次的时候

当类的对象作为实参传递时,可以使用匿名对象

上面的变量名称相同就近原则导致了this的产生

this:this所在的方法正在被哪个对象调用,this就代表该对象。

Student s =new Student();

s.setAge(18);

对象s调用Student类中的方法setAge。需要将setAge中的局部变量输出,this.age代表s的age变量。

构造方法/构造函数:一般用于初始化数据

1⃣️没有返回值类型,连void都没有

2⃣️return不能返回一个具体的值,但是可以跳出构造方法。

3⃣️构造方法名称和类名相同

Student s =new Student(); 不写的话,系统提供无参构造方法。

有参构造方法只有一次。set方法是持久的。

成员方法的分类:

有参无参,有返回值无返回值。拼接起来共四种

标准的JavaBean:

1⃣️成员变量(允许外部访问成员变量是有安全隐患的,所以要将变量私有化,提供公共的访问方式,在访问方式中做一些安全校验)

2⃣️构造方法

有参构造方法+无参构造方法

3⃣️成员方法

set❌❌❌

get❌❌❌

打印所有成员变量的方法

标准JavaBean初始化内存图解