请用一段代码具体来解释一下父类引用指向子类对象
public class Parent {
public void print() {
System.out.println("This is a method in Parent class.");
}
}
public class Child extends Parent {
@Override
public void print() {
System.out.println("This is a method in Child class.");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Child();
parent.print();
}
}
上述代码中,定义了一个父类 Parent
和一个子类 Child
。父类 Parent
中有一个 print
方法,子类 Child
继承了父类的 print
方法并进行了重写。
在主函数 main
中,创建了一个父类引用 parent
,并通过 new Child()
创建一个子类对象并赋值给 parent
。此时,父类引用 parent
指向了子类对象。然后调用 parent
的 print
方法,根据多态性质,实际上调用的是子类 Child
中重写的 print
方法。因此,程序会输出 "This is a method in Child class."
上面 这段代码为什么一定要用父类引用指向子类对象
使用父类引用指向子类对象的主要目的是实现多态。多态是面向对象编程中的重要概念,它允许不同类型的对象对同一消息做出不同的响应。
通过使用父类引用指向子类对象,可以实现以下几点好处:
-
提高代码的灵活性:使用父类引用可以方便地切换不同的子类对象,从而实现不同的行为。这样可以在不修改现有代码的情况下,扩展程序的功能。
-
简化代码的编写:使用父类引用可以让代码更加简洁,不需要为每个子类都编写相同的代码逻辑。只需要使用父类引用来调用相同的方法,具体的实现由子类来完成。
-
提高代码的可读性:使用父类引用可以让代码更加易于理解和维护。通过使用父类引用,可以将关注点集中在父类定义的接口上,而不需要关心具体的子类类型。
总之,通过使用父类引用指向子类对象,可以实现代码的灵活性、简洁性和可读性,从而提高程序的质量和可维护性。
面试题
class Outer5{
private int num=5;
class Inner5{
private int num=10;
public void fun(){
int num = 15;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer5.this.num);
}
}
}
public class InterviewQuestions {
public static void main(String[] args) {
Outer5.Inner5 inner5=new Outer5().new Inner5();
inner5.fun();
}
}
这段代码定义了一个包含内部类的外部类。外部类名为Outer5
,内部类名为Inner5
。
在外部类Outer5
中,有一个私有属性num
,值为5。
在内部类Inner5
中,也有一个私有属性num
,值为10。
内部类中的方法fun()
中,还定义了一个局部变量num
,值为15
。
在fun()方法中,分别输出了三个num
的值:
-
第一个输出语句
System.out.println(num);
输出的是局部变量num
的值,即15。 -
第二个输出语句
System.out.println(this.num);
输出的是内部类Inner5
的成员变量num
的值,即10。 -
第三个输出语句
System.out.println(Outer5.this.num);
输出的是外部类Outer5
的成员变量num
的值,即5。
在main
方法中,创建了Outer5.Inner5
的实例inner5
,并调用其fun()方法,所以会依次输出15、10和5。