对象与内存(二)

当创建java对象时,程序总会先依次调用每个父类的非静态代码块、父类构造器(总是从Object开始)执行初始化,最后才调用本类的非静态代码块、构造器进行初始化。而父类构造器的调用则取决于子类的显示调用(使用super关键字调用父类构造器)或隐式调用(没有使用super或者this则默认调用父类的无参构造器)。

Person  p = new Son();(Person是son的父类,person即p的声明类型,son则为p的实际类型)

不管声明一个变量用的是什么类型,当通过这些变量调用方法时,方法的行为总是表现出他们实际类型的行为;但如果通过这些变量来访问他们所指对象的实例变量时,则这些实例变量的值总是表现出声明这些变量所用类型的行为。(如果子类重写了父类的方法,就意味着子类的方法彻底覆盖了父类的同名方法,而对于实例变量则不一样,即使在子类中定义了与父类完全同名的实例变量,这个实例变量仍然不可能覆盖父类中定义的实例变量,这就是继承成员变量和继承方法之间的差别)

当子类使用public访问修饰符修饰,而父类不使用public修饰时,才可以通过javap看到编译器将父类的public方法直接转移到子类中去(子类没有重写父类的该方法)

猜你喜欢

转载自www.cnblogs.com/zhlblogs/p/9074769.html