△先默认初始化,在显示初始化,在构造函数初始化
△继承的弊端:代码的耦合性增加了.
△子类不能继承父类的构造方法.
△子类会拥有父类的私有成员变量,但是必须通过get,set方法访问.
△super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字.
△如果子类没有显示的调用超类的构造器,则将自动的调用超类默认的构造器,如果超类没有不带参数的构造器,并且在子类的构造器中也没有显式的调用其他构造器,将会编译报告错误.
△顺序:
父类的静态成员赋值和静态块,默认初始化 (静态块和静态成员的顺序为,谁在前面谁先执行(在不出错的情况下)(父.class先加载,子.class再加载)
子类的静态成员和静态块 ,默认初始化
跳转到父类的构造方法,再跳到构造代码块.
父类的成员赋值和初始化块
父类的构造方法中的其它语句
子类的成员赋值和初始化块
子类的构造方法中的其它语句
父类静态代码块--子类静态代码块--父类构造代码块--父类构造方法--子类构造代码块--子类的构造方法.
△子类中的有参构造函数和空参构造函数都默认为访问父类的空参构造函数.子类重写父类方法的时候,访问权限不能更低.父类静态方法只能在子类中由子类所覆盖.
方法重载:本类中出现的方法名一样,参数列表不同的方法,与返回值无关
方法重写:子类重写父类的方法,与返回值有关,必须相同或者是子父类
△final所修饰的变量要不然直接显示初始化,要不然采用构造函数初始化和构造代码快初始化.
△动态绑定:在运行的时候确定所需要调用的方法.虚拟机一定调用与x引用对象实际类型最合适的那个类的方法.静态绑定当且仅当方法关键字为private,static,final的时候采用,编译器将可以准确的知道应该调用哪个方法.
△父类引用的成员变量是父类的成员变量
父类引用使用子类方法:编译看左边,运行看右边,动态绑定.子类方法中的父类变量仍然要看子类有没有重写该变量,子类方法的变量隐式参数是this.
子父类的静态方法:编译看左边,运行也看左边.
△子类重写父类的方法的时候,有一种特殊的情况,即super.show().此时,调用的是父类的show方法,而不是覆盖重写后的子类的show方法.因为,super指向的是父类空间.
△Java7新特性:Objects类.
static boolean equals(Object a,Object b):判断两个对象是否相等,使用的是对象a的equals方法.
static int hash(Object...objects):返回一个散列码,由提供的所有对象的散列码组合得到.(很实用,可以在覆盖equals和hashcode方法的时候根据equals用到的成员变量便捷覆盖hashcode方法).也可以用这个方法调用Objects.hash(7)便捷获得基本数据类型的hashcode.
△对于equals方法的覆盖,应该遵循两个原则:
- 如果子类拥有自己的相等概念,那么对称性需求将强制采用getclass进行检测.
- 如果由超类决定相等的概念,可以使用instanceof并对超类的类名进行检测,这样可以在不同的子类之间进行相等的比较,并且将父类的equals方法声明为final.
△getClass是指运行时类,因此父类引用指向子类对象的时候,所得的getclass是子类的class对象
△Instance of 判断引用是否指向后面的数据类型..
△父类属性存储方式是在堆中的子类对象里面分配空间
△
一个对象的实例化过程:
Person p=new Person();
1.jvm会读取指定路径下的Person.class文件,并加载进内存,并会加载Person的父类
2.在堆内存中开辟空间,分配内存地址。
3.并且在对象空间中,对对象的属性进行默认初始化。
4.调用相应的构造函数进行初始化。先进子类构造函数,在子类构造函数中,第一行会调用父类构造函数进行初始化,父类初始化完毕后(先显示初始化在构造函数初始化),再对子类属性进行显示初始化,然后调用子类构造函数进行特定的初始化。
5.将地址赋给相应的变量。
△对于父类的方法覆盖时,方法签名必须相同,返回值也必须相同或者为子类也可以.
△对象引用的类型转换:1).只能在继承层次内进行类型转换2).在超类转化为子类之前应该使用instanceOf进行检查