java - 关于压倒性原则

标签 java overriding

我有一个问题,下面是我的代码。

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/

相关文章:

c# - 我可以覆盖 C# 中的属性吗?如何?

C++ 重写虚拟模板方法

java - 这个 javacode 究竟做了什么?

java - 如何在 Spring Boot 中模拟数据库连接以进行测试?

java - 为 Ingres 数据库创建 JNDI 连接

java - 如何对 MongoDB 中的嵌入对象进行排序

java - 为什么看起来调用了错误的方法?

css - Bootstrap SASS 变量覆盖挑战

ruby-on-rails-3 - 导轨(3.2.7): override image_tag for asset_host

java - 如果已经运行,则运行关闭文件的批处理文件(计划作业)