版权声明:欢迎转载,交流共享,转载请注明出处!如若转载请贴上此链接(山里樵夫俗称大叔):http://blog.csdn.net/u014143369 https://blog.csdn.net/u014143369/article/details/53287040
知识点:
1、java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法;
2、父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private、非 final 方法),那么这个对象调用该方法时默认调用的时子类重写的方法,而不是父类的方法;
3、对于java当中的方法而言,除了final,static,private 修饰的方法和构造方法是前期绑定外,其他的方法全部为动态绑定;(编译看左边,运行看右边)
本质:java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。
实例演示:
package practice_19;
public class AlibabaMain01 {
public static void main(String[] args) {
System.out.println("--------父类引用指向子类对象-----------");
Father instance = new Son();
instance.printValue();
instance.printValue2();
System.out.println(instance.name);
instance.printValue3();
System.out.println("----------创建子类对象------------");
Son son = new Son();
son.printValue();
son.printValue2();
System.out.println(son.name);
son.printValue3();
System.out.println("---------创建父类对象-----------");
Father father = new Father();
father.printValue();
father.printValue2();
System.out.println(father.name);
father.printValue3();
}
}
class Father {
public String name = "father";
public void printValue() {
System.out.println("this is father's printValue() method.---"+this.name);
}
public void printValue2(){
System.out.println("this is father's printValue2() method.---"+this.name);
}
public static void printValue3(){
System.out.println("this is father's static printValue3() method.");
}
}
class Son extends Father {
public String name = "Son";
public void printValue() {
System.out.println("this is Son's printValue() method.---"+this.name);
}
public static void printValue3(){
System.out.println("this is Son's static printValue3() method.");
}
}
运行结果:
--------父类引用指向子类对象-----------
this is Son’s printValue() method.—Son
this is father’s printValue2() method.—father
father
this is father’s static printValue3() method.
----------创建子类对象------------
this is Son’s printValue() method.—Son
this is father’s printValue2() method.—father
Son
this is Son’s static printValue3() method.
---------创建父类对象-----------
this is father’s printValue() method.—father
this is father’s printValue2() method.—father
father
this is father’s static printValue3() method.
分析:
1、父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;
2、父类引用指向子类对象,如果想要调用子类中和父类同名的成员变量,则必须通过getter方法或者setter方法;
3、父类引用指向子类对象,如果想调用子类中和父类同名的静态方法,直接子类“类名点” 操作获取,不要通过对象获取;
4、父类引用指向子类对象的两种写法:(第二种得了解,面试中可能用到)
// 1、第一种常规写法
Father instance = new Son();
// 2、第二种变形写法;
Son son = new Son();
Father mson = (Father) son;
作者:山里樵夫俗称大叔
来源:CSDN
原文:https://blog.csdn.net/u014143369/article/details/53287040
版权声明:本文为博主原创文章,转载请附上博文链接!