Fork me on GitHub

Java用父类声明new子类对象VS用子类声明new子类对象的区别

Father a = new Son();
Son b = new Son();


1. a只能调用Faher中有的函数,不能调用Son中新添加的函数,同时如果Son中有覆盖掉Father的函数,访问的是Son中的函数,也就是说引用a与实例方法动态绑定。

a访问Father中有的函数:

输出结果如下,可以看到调用的是子类的方法:

a访问Father中没有的函数

输出结果如下,报错:

2. 但是引用a与成员变量、静态方法静态绑定,也就是说,a只能访问a里的成员变量、静态方法,即使b里有同名的成员变量、静态方法。

输出结果:

3. b可以调用Father里的函数,也可以调用Son里另外添加的函数。

输出结果:


综上:
Father a = new Son();
Son b = new Son();

  1. a只能调用Father中有的函数,不能调用Son中新添加的函数,同时如果Son中有覆盖掉Father的函数,访问的是Son中的函数,也就是说引用a与实例方法动态绑定。
  2. 但是引用a与成员变量、静态方法静态绑定,也就是说,a只能访问a里的成员变量、静态方法,即使b里有同名的成员变量、静态方法。
  3. b可以调用Father里的函数,也可以调用Son里的函数。
  4. 对构造函数的执行,二者没有区别,都是先父后子。
您的支持将鼓励我继续创作!