区分重载和重写
重载(Overload)指的是在同一个类中对已有的方法名再次编写一个方法,但是要求新写的方法的参数列表或者返回类型要与被重载的方法不一致。值得注意的是,在方法参数列表里面。对基本类型的形参可能会遇到窄化转换,即int类型的实际参数可以会被窄化成byte处理。另外就是对传递进来的实际实参,也会遇到向上自动提升,比如你传递进去的是byte,但是拥有的方法值有接受int的,那么就会自动提升为int,但最开始还是匹配的相同的形参类型方法。
重写(Override)值得是在一个类继承结构中,下面的导出类覆盖上面基类的方法,这是一种实现多态的体现。
构造器初始化
在实例化一个对象的时候,经常就是调用这个对象类的构造器,而构造器默认的是static类型。对于JVM而言,只要遇到调用类的static方法的时候,就会立即执行类加载过程,因此调用构造器的时候,会立即执行类加载工作,如果已经加载过了就直接从内存中执行后续的初始化工作。在单个类的初始化的时候(不考虑继承),对于静态初始化只有在必要的时刻才会进行(只会在字节码class对象首次被加载的时候执行,也就是还没进行过实例化的时候,静态对象都会先被加载,其中静态代码块又是最先执行的),初始化顺序是先初始化静态对象然后是非静态对象,先成员后方法。
在导出类的初始化的时候,编译器会强制要求先去初始化其基类,同理其基类的初始化又会要求先去初始化这个基类的父类,因此总是最先初始化继承树中最上面的基类(在释放的时候却是从最下面的类开始),编译器这种做的目的是保证对象能够被正确地初始化,可以这样理解:因为下面的导出类总是先要有上面基类的基本方法再才有自己的特殊方法。
final关键字
final类型数据
- 一个永不改变的编译时常量
- 一个在运行时被初始化的值,而我们不希望它被改变
疑惑点:对于基本类型,用final修饰,那么这个数值是肯定不变的;对于引用类型,final实际指的是这个引用不变,并不是指这个引用所指的对象不能改变,我们可以改变这个对象的内容编译器也能通过。
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("sb");
final StringBuffer sb2 = sb;
System.out.println(sb2);
sb.append("2");
System.out.println(sb2);
}
这里finsl sb2就是指sb2这个引用地址就是StringBuffer(“sb”)的引用,怎么也不会变,但是我把这个引用所对应的对象的内容更改了是可以的
final类型的参数表示我将参数传递进来,你是不可以更改这个参数引用所指的对象的。
final方法
主要是为了把方法锁定,以防止任何继承类修改它的含义:确保在继承中使方法的行为保持不变,并且不会被覆盖。
所有private方法都是用final隐式修饰的
@Override注解显示地指定我这个方法就是来覆盖父类的方法的,以免在子类中不采用这个注解情况下出现重写这个方法的错误;而final定义的方法则表示子类不能修改我的方法。
final类
表示这个类不会有子类