我一直在玩继承和多态。以下代码的打印出来是:学生1人1本科生2.所以我有两个问题:
为什么当我在学生班中调用method2()时,Java会自动插入.this?如果不是原始打印出来,我想打印出学生1人1学生2.如何显式调用学生班的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 ");
}
}
学生班
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 ");
}
}
答案 0 :(得分:2)
这就是代码的工作原理:
(array([0], dtype=int64), array([0], dtype=int64))
(array([2], dtype=int64), array([1], dtype=int64))
的{{1}}。Undergrad
u
未定义u.method1()
,因此会查看其父级。Undergrad
定义method2
,因此会调用它。Student
已打印method2
调用"Student 1 "
,查看Student::method1
super.method1
已打印;函数返回到6 Person
来电"Person 1 "
Student::method1
对象。由于method2
会覆盖Undergrad
,因此会打印Undergrad
。method2
返回Undergrad 2
如果要调用Student类的method2
,则需要找到不覆盖main
的{{1}}对象;也就是说,一个真正的正常学生,而不是本科生。
答案 1 :(得分:0)
尝试查看所有关键字,例如public,final,private,static。然后是"方法隐藏"的主题。和"方法覆盖"。另请查看' @override注释'。尝试了解如何投射课程。除了本主题中的其他答案,在您的示例中,您还可以执行以下操作:
Student u = new Undergrad();
因为Undergrad的任何实例也是学生。但是现在您可以访问Student的方法。因此,我建议在Student内部设置method2,以便u.method2()打印"学生2"。