父类:
public class F {
private String name = "F";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printff(){
System.out.println("F.printff: name:"+this.name+" getName:"+this.getName()+" class:"+this.getClass()+" this:"+this);
}
}
子类:
public class S extends F {
private String name = "S";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printff() {
super.printff();
System.out.println("S.printff: name:"+this.name+" getName:"+this.getName()+" class:"+this.getClass()+" this:"+this);
}
public void printfff(){
System.out.println("S.printfff: name:"+this.name+" class:"+this.getClass()+" this:"+this+" super.name:"+super.getName());
}
}
public class M {
public static void main(String[] args) {
S s = new S();
F f = s;
f.printff();
// f.printfff(); //无此方法
// s.printfff();
}
}
F.printff: name:F getName:S class:class FandS.S this:FandS.S@41a4555e
S.printff: name:S getName:S class:class FandS.S this:FandS.S@41a4555e
结论:
1、this指的是实例化对象,即便上转为父类型的引用。(只改变了引用类型,对象的内存其实未发生变化,只是在父类缺省的方法无法调用,即f.printfff无法调用。)
2、在使用super方法时,被重写的方法被覆盖,即父类的getName()方法被重写了,不会存在2个getName方法。
属性则不同,将存在父类属性与子类属性,可以用不同的方式访问得到,即对象上转时,保存了两者的属性。
引用http://niewj.iteye.com/blog/1216900:
子类的实例化主要分为两个步骤:
<1>.类相关静态内容初始化;
*先父类再子类:
1.父类的static属性;
2.父类的static块;
3.子类的static属性;
4.子类的static块;
<2>.类的实例内容初始化;
*调用构造子:先父类后子类:构造子调用之前先实例化实例字段和块
5.父类的普通属性;
6.父类的普通块;
7.父类的构造子;
8.子类的普通属性;
9.子类的普通块;
10.子类的构造子;