1、笔记
1、 /* 使用方法的时候,注意事项: 1. 方法应该定义在类当中,但是不能在方法当中再定义方法。不能嵌套。 ----> Python 中的闭包、装饰器可以 2. 方法定义的前后顺序无所谓。 3. 方法定义之后不会执行,如果希望执行,一定要调用:单独调用、打印调用、赋值调用。 4. 如果方法有返回值,那么必须写上“return 返回值;”,不能没有。 5. return后面的返回值数据,必须和方法的返回值类型,对应起来。 6. 对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己。 7. 对于void方法当中最后一行的return可以省略不写。 8. 一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到,两个return不能连写。 */ 2、方法的重载 多个方法名称一样,但是参数列表不一样; Python中会被覆盖,而Java中都可以同时存在 注意事项: 方法重载与下列因素相关: 1、参数个数不同; 2、参数类型不同; 3、多类型的顺序不用; ---> (int a, double b) 与 (double a, int b)不一样 方法重载与下列因素无关: 1、与参数名称无关; 2、与方法的返回值类型无关; 3、在调用输出语句的时候,println方法其实就是进行了多种数据类型的重载形式。(因为 println 可以打印任何内容,那么相当于有多个 println 方法,只是参数不同,用来接收各种各样的数据类型) 4、数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。 两种常见的初始化方式: 1. 动态初始化(指定长度) 2. 静态初始化(指定内容) 动态初始化数组的格式: 数据类型[] 数组名称 = new 数据类型[数组长度]; 静态初始化基本格式: 数据类型[] 数组名称 = new 数据类型[] { 元素1, 元素2, ... }; 省略格式: 数据类型[] 数组名称 = { 元素1, 元素2, ... }; 注意事项: 1. 静态初始化没有直接指定长度,但是仍然会自动推算得到长度。 2. 静态初始化标准格式可以拆分成为两个步骤。 3. 动态初始化也可以拆分成为两个步骤。 4. 静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。 使用建议: 如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。 5、直接打印数组名称,得到的是数组对应的:内存地址哈希值。 6、 使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下: 如果是整数类型,那么默认为0; 如果是浮点类型,那么默认为0.0; 如果是字符类型,那么默认为'u0000'; 如果是布尔类型,那么默认为false; 如果是引用类型,那么默认为null。 注意事项: 静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。 7、Java内存需要划分为5个部分 1、栈:存放的都是方法中的局部变量。方法的运行一定要在栈中运行。 局部变量:方法的参数,或者是方法{}内部的变量 作用域:一旦超出作用域,立刻从栈内存当中消失 2、堆:凡是new出来的东西,都在堆当中。 堆内存里面的东西都有一个地址值,16进制 堆内存里面的数据,都有一个默认值,例如: 如果是整数类型,那么默认为0; 如果是浮点类型,那么默认为0.0; 如果是字符类型,那么默认为'u0000'; 如果是布尔类型,那么默认为false; 如果是引用类型,那么默认为null。 3、方法区:储存.class相关信息,包含方法的信息。 4、本地方法栈:与操作系统相关。 5、寄存器:与CPU相关。 8、所有的引用类型变量,都可以赋值为一个null值。但是代表其中什么都没有。 9、 一个方法可以有0、1、多个参数;但是只能有0或者1个返回值,不能有多个返回值。 如果希望一个方法当中产生了多个结果数据进行返回,怎么办? 解决方案:使用一个数组作为返回值类型即可。 任何数据类型都能作为方法的参数类型,或者返回值类型。 数组作为方法的参数,传递进去的其实是数组的地址值。 数组作为方法的返回值,返回的其实也是数组的地址值。 10、 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。 11、类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。 对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。 12、 注意事项: 1. 成员变量是直接定义在类当中的,在方法外边。 2. 成员方法不要写static关键字。 13、 1. 导包:也就是指出需要使用的类,在什么位置。 import 包名称.类名称; 对于和当前类属于同一个包的情况,可以省略导包语句不写。 2. 创建,格式: 类名称 对象名 = new 类名称(); Student stu = new Student(); 3. 使用,分为两种情况: 使用成员变量:对象名.成员变量名 使用成员方法:对象名.成员方法名(参数) (也就是,想用谁,就用对象名点儿谁。) 注意事项: 如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。 14、局部变量和成员变量 1. 定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2. 作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类全都可以通用。 3. 默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4. 内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5. 生命周期不一样(了解) 局部变量:随着方法进栈而诞生,随着方法出栈而消失 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
2、数组的长度属性(注意是属性不是方法)
每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为 数组名.length-1 。
3、数组的内存图
4、一个对象的内存图
注意:
对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息
只保存一份,节约内存空间。