我有一个问题,下面是我的代码。
class A
{
int i=10;
public void m1() {
System.out.println("I am in class A");
}
}
class B extends A
{
public void m1() {
System.out.println("I am in class B");
}
}
class main2 extends A
{
public static void main(String...a) {
A a1= new B();
a1.m1();
}
}
现在是我的问题;获取父类A的变量“i”是可以的,但是我获取的方法也是A类的。它是否获取B类的方法,因为它覆盖了A类的方法?
最佳答案
在Java中,任何派生类对象都可以分配给基类变量。例如,如果您有一个名为 A 的类,并从中派生出类 B,则可以执行以下操作:
A a1 = new B();
左边的变量是A类型,而右边的对象是B类型。只要左边的变量是B的基类,就可以这样做。能够进行这样的赋值设置了所谓的“多态行为”:如果 B 类具有与 A 类中的方法相同的方法,则将调用 B 类中该方法的版本。例如,如果两个类都定义了一个名为 m1() 的方法,并且您执行以下操作:
a1.m1();
将调用 B 类中的 m1() 版本。即使您使用 A 变量类型来调用方法 m1(),A 类中的 m1() 版本也不会被执行。相反,它将执行 B 类中 m1() 的版本。分配给 A 变量的对象类型决定了调用的方法。
所以,当编译器扫描程序并看到这样的语句时:
a1.m1();
它知道a1是A类型,但编译器也知道a1可以是对从A派生的任何类的引用。因此,编译器不知道该语句正在调用哪个版本的m1()。直到任务完成:
A a1 = new B();
执行确定m1()的版本。由于分配直到运行时才会发生,因此直到运行时才知道 m1() 的正确版本。这称为“动态绑定(bind)”或“后期绑定(bind)”:直到程序在运行时执行某些操作才能确定方法的正确版本。在 Java 中,继承的大多数用途都涉及动态绑定(bind)。
关于java - 关于压倒性原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10459878/