方法定义规则:
方法名+参数列表;
方法重载:
方法名一样,参数列表不一样,与返回值无关;
参数列表:参数类型、参数个数;
Public int add(int a,int b){}
Public int add(long a ,int b){}
方法调用就近原则:
Add(‘a’,2)调用的是 add(int a,int b )
Char 类型转 int 类型较近
调用时将 char 类型转化为 int 类型。
Java 方法的重载体现行为的多态性;
System.out.println();
Char数组输出的是字符串;
Int数组输出的是地址;
Java中方法参数的传递规则:
基于值的传递:就是变量值的赋值;
基本类型就是值的复制;
引用类型是物理地址值的复制;
基本类型值传递:
栈内存中,创建实参和形参,实参将值复制给形参,方法体中形参值改变,对应栈内存中形参的值也相应改变,方法结束形参销毁,实参不变。
Koo koo = new Koo();
首先调用无参构造器,在对内存中创建对象;
其次将内存中对象的物理地址值赋值给引用变量 koo,并在栈内存中创建引用变量;
Add (Koo koo);
将引用变量的值赋值给形参 koo ,在栈内存中创建临时变量 koo;
Public int add(Koo koo){
Kook = koo;
k.a++;
returnkoo.a;
}
方法体内,形参将物理地址值赋值给局部局部引用变量 k,在栈内存中创建局部变量 k
局部变量k指向堆内存中Koo对象
调用方法结束后临时变量 k,koo 销毁
最终:栈内存中只存在基本变量 a,引用变量koo
堆内存中存在 Koo对象;
继承:
1、 子类继承父类的所有属性和方法;
2、 构造器不能继承;
3、 实例子类会递归分配所有父类的空间;
4、 子类构造器一定调用父类构造器;
5、 类一定有构造器;
多态:父类型引用子类型,编译期不确定是什么类型,同意都是父类型,运行期间才确定类型,通过“对象的动态绑定”实现多态现象。
Java 引用变量两种类型:编译时类型和运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由运行时,实际赋给改变量的对象决定,如果编译时类型和运行时类型不一致就会出现多态;
子类继承父类的属性和方法,同时可以增加自己的属性和方法,重写父类的方法。
堆内存中,先根据对象的属性类型分配空间创建对象,如果对象的属性是一个对象,则对象的属性对应的是属性对象的物理地址值。
继承中的构造器:
子类构造器一定调用父类构造器;
子类构造器默认调用父类的无参构造器;
Super()表示调用父类的构造器;
子类构造器调用父类构造器,一定是放在第一行;
This()必须写在子类构造器的第一行;
有this()就不能有super();
父类定义了有参构造器了,未定义无参构造器,子类默认调用父类的无参构造器,则子类构造器必须显示调用父类的有参构造器。
如果父类没有无参构造器,就必须在子类中明确指定调用父类的有参构造器。
编程建议:所有类都提供无参构造器,减少继承时候的麻烦(显式调用父类的有参构造器)。
对象实例化过程:
1、 在创建类之前,检查类是否加载(将硬盘中的.class文件加载都内存中),如果没有加载就加载这个类,在这个类加载之前要加载这个类的所有父类。
Java运行时采用的策略:懒惰式加载(按需加载):如果第一次用到,只加载一次,通过classpath指定的路径寻找.class文件,加载以后是一个对象,类型是class
2、 在内存中分配对象空间,递归分配所有父类和=子类的属性空间,属性默认初始化,初始化为“0”值。
3、 进行属性的赋值。
4、 调用本类的构造器,调用本类的构造器默认调用父类的无参构造器。
图示及说明如下:
第1步: 检查并加载类 首先检查内存中Koo有没有加载,如果Koo没有加载会加载Koo并加载父类Foo
第2步:在内存堆中分配对象空间先递归的分配父类型空间(Foo):int a=0(int类型空间,默认值为0)再分配子类型空间(Koo):int b = 0
第3步:进行属性的赋值。
第4步:递归调用父类构造器。
第5步:调用本类构造器
java中的访问控制符,是修饰Java中类、属性、方法的访问可见范围的。请记住如下表格
public修饰的,在任何地方都能访问
protected修饰的,在类内部、同一个包、子类中能访问
[default]修饰的,在类内部和同一个包中可以访问(不建议用)
private修饰的,仅限当前类内部访问
private修饰的属性,仅限本类内部访问
类、属性、方法都可用 public、protected、dufault、private修饰;
声明属性和方法尽量私有,这样才能做到尽可能的封装;
一个源文件可以有多个类,但是只能有一个public类,文件名要和public类的名字一致,如果是其他类只能是默认的default修饰。
不建议使用非公开类,所有类都应该是共有的,并且一个源文件一个类。
Java中继承的语法现象,父类变量可以引用子类的实例,实现多态,编译时类型与运行时类型的不一致;
引用类型变量的自动转换,小类型到大类型是自动转换的;
子类可以覆盖父类的方法,修改父类的行为;
方法的覆盖是由方法动态绑定实现的,是java虚拟机运行时确定执行那个对象,那个方法,java最终执行子类的方法,如调用父类的方法,运行时实际调用的是子类覆盖父类的方法。
引用类型转换 ***
向下转型(隐式/自动类型转换),是小类型到大类型的转换
向上造型(强制类型转换),是大类型到小类型
instanceof 运算符,用来检查引用对象的类型
经常与“引用类型强制转换”配合,实现安全的类型转换,避免类型转换异常