父类:
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.子类的构造子;