Java 如何在不调用子类的情况下调用方法
我一直在玩弄继承和多态性。下面代码的打印输出是:学生1人1本科生2人。所以我有两个问题: 当我在student类中调用method2()时,为什么Java会自动插入.this?如果我想打印学生1个人1学生2,而不是原始打印,会怎么样。我将如何显式调用Student类的method2 我有3个班,个人班:Java 如何在不调用子类的情况下调用方法,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我一直在玩弄继承和多态性。下面代码的打印输出是:学生1人1本科生2人。所以我有两个问题: 当我在student类中调用method2()时,为什么Java会自动插入.this?如果我想打印学生1个人1学生2,而不是原始打印,会怎么样。我将如何显式调用Student类的method2 我有3个班,个人班: public class Person { public static void main(String[] args) { Person u = new Undergrad();
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 ");
}
}
这就是代码的工作原理:
u
的本科
u.method1()
Undergrad
没有定义method2
,因此它查看它的父对象Student
定义了method2
,因此它被称为“学生1”
已打印Student::method1
调用super.method1
,它查看Person
“个人1”
已打印;函数返回到堆栈点6Student::method1
调用method2
本科
对象。由于Undergrad
覆盖method2
,因此它会打印Undergrad 2
method2
返回到main
如果要调用Student类的
method2
,则需要找到一个不重写method2
的Student
对象;也就是说,一个真正的普通学生,而不是本科生。代码就是这样工作的:
u
的本科
u.method1()
Undergrad
没有定义method2
,因此它查看它的父对象Student
定义了method2
,因此它被称为“学生1”
已打印Student::method1
调用super.method1
,它查看Person
“个人1”
已打印;函数返回到堆栈点6Student::method1
调用method2
本科
对象。由于Undergrad
覆盖method2
,因此它会打印Undergrad 2
method2
返回到main
如果要调用Student类的
method2
,则需要找到一个不重写method2
的Student
对象;也就是说,一个真正的普通学生,而不是本科生。试着查看所有关键词,如public、final、private、static。然后是“方法隐藏”和“方法重写”的主题。还要查看“@override注释”。试着去理解你是如何铸造类的。除了本主题中的其他答案外,在您的示例中,您还可以执行以下操作:
Student u = new Undergrad();
因为任何一个本科生都是学生。但是现在你可以使用Student的方法了。因此,我建议将method2设置为Student private,这样u.method2()会打印“Student 2”。尝试查看所有关键字,如public、final、private、static。然后是“方法隐藏”和“方法重写”的主题。还要查看“@override注释”。试着去理解你是如何铸造类的。除了本主题中的其他答案外,在您的示例中,您还可以执行以下操作:
Student u = new Undergrad();
因为任何一个本科生都是学生。但是现在你可以使用Student的方法了。因此,我建议在Student private中设置method2,以便u.method2()打印“Student 2”。您已经在
Undergrad
中覆盖了method2
,并在Undergrad
类的对象上对其进行cll。因此调用重写的method2
,因为这是polymophism的全部要点。如果您希望被重写的方法调用其超类的方法,则必须将其编程到该方法中。您已经在Undergrad
中重写了method2
,并在Undergrad
类的对象上对其进行了cll。因此调用重写的method2
,因为这是polymophism的全部要点。如果您希望被重写的方法调用其超类的方法,则必须将其编程到该方法中。