我一直在研究继承和多态性。下面代码的打印结果是:Student 1 Person 1 Undergrad 2。所以我有两个问题:
为什么当我在学生类中调用method2()时,Java会自动插入一个.this?如果我想打印出 Student 1 Person 1 Student 2,而不是原始打印输出,该怎么办。我如何显式调用 Student 类的 method2?
我有 3 个类,Person 类:
public class Person {
public static void main(String[] args) {
Person u = new Undergrad();
u.method1();
}
public void method1() {
System.out.print("Person 1 ");
}
public void method2(){
System.out.print("Person 2 ");
}
}
学生类(class)
public class Student extends Person {
public void method1(){
System.out.print("Student 1 ");
super.method1();
method2();
}
public void method2(){
System.out.print("Student 2");
}
}
本科生类:
public class Undergrad extends Student{
public void method2(){
System.out.print("Undergrad 2 ");
}
}
最佳答案
这就是代码的工作原理:
- 您创建了一个名为
u
的本科生
。 - 您调用
u.method1()
Undergrad
未定义method2
,因此它会查看其父级。Student
定义了method2
,因此被调用。打印“学生 1”
Student::method1
调用super.method1
,它查看Person
“Person 1”
被打印;函数返回到堆栈点 6Student::method1
调用method2
- 请记住,这在技术上指的是
Undergrad
对象。由于Undergrad
覆盖method2
,因此它会打印Undergrad 2
。 method2
返回到main
如果您想调用 Student 类的 method2
,您需要找到一个不会覆盖 method2
的 Student
对象;也就是说,一个真正的普通学生,而不是本科生。
关于java - 如何在不调用子类的情况下调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47084154/