java继承中的多态–经典
/**父类
*/
public class Father{
int x = 1;
public Father(){
System.out.println("father");
}
public Father(String s){
System.out.println("father:"+s);
}
}
/**子类
*/
public class Son extends Father{
int x = 2;
public Son(){
System.out.println("son");
}
public Son(String s){
System.out.println("son:"+s);
}
}
public class Test{
public static void main(String[] args){
//都是new的无参构造方法
//第一种情况,输出结果的顺序
Son f = new Son();
System.out.println(f.x);
/*输出结果:
father
son
2
说明:没有使用多态,父类的引用指向子类的对象,还是会执行父类的无参构造方法。
*/
//第二种情况,输出结果的顺序
Father f = new Son();
System.out.println(f.x);
/*输出结果:
father
son
1
说明:使用了多态,注意这里输出的是1。
*/
//使用new的有参构造方法
//第一种情况,输出结果的顺序
Son f = new Son("hello");
System.out.println(f.x);
/*输出结果:
father
son:hello
2
说明:没有使用多态,父类的引用指向子类的对象,还是会执行父类的无参构造方法。
*/
//第二种情况,输出结果的顺序
Father f = new Son("hello");
System.out.println(f.x);
/*输出结果:
father
son:hello
1
说明:使用了多态,注意这里输出的是1。
*/
}
}
/*
总结:
只要是new子类,无论是调用子类的有参构造还是无参构造都会执行父类的无参构造。
当子类和父类有同一个变量名字的变量时,如果是使用了多态则调用的是父类的变量。否则调用的是子类的变量。
补充:执行顺序,静态块>构造语句块>函数块
*/
本文深入探讨Java中继承和多态的概念,通过具体代码示例展示了父类和子类构造函数的调用顺序,以及在多态情况下成员变量的访问特性。特别强调了变量隐藏与覆盖的区别,为理解Java面向对象特性提供了实践指南。
3241

被折叠的 条评论
为什么被折叠?



