java - 使用继承的方法调用

标签 java object inheritance

我创建了一个非常简单的程序来测试当通过继承调用该方法时将调用哪个方法。 类 boo 扩展了 foo

使用 boo 对象,调用 fooshowMe 中的方法。 foo 类中的 showMe 方法调用 showText 方法在屏幕上显示文本。

boo 类重写 showText 方法并显示不同的文本。

我的预测是,foo 类中的方法将被调用,而不是 boo 类中的重写版本。我错了,调用了 boo 类中的方法。有人可以解释一下这是怎么发生的吗?另外,我想知道如何调用 foo 类中的方法,即使我在 boo 类中重写了方法。

嘘类

    public class boo extends foo
    {
        public static void main(String[] args)
        {
            boo main = new boo();

            main.showMe();
        }

        @Override
        public void showText()
        {
            System.out.println("Bruhhh!!!");
        }
}

foo 类

public class foo
{
    protected void showMe()
    {
        showText();
    }

    public void showText()
    {
        System.out.println("Bruhhh Part 2!!!");
    }
}

最佳答案

调用 boo 中的方法是因为 main 的类型为 boo

如果你想让它打印 foo 中的内容,你应该将 boo main = new boo(); 更改为 foo main = new foo() ;

继承是一棵树。如果你尝试将它与现实生活中的树联系起来,比如进化、车辆、职业和相关分支,就会更容易理解。例如,工程师有很多种类型。起初有 Engineer,然后是 ElectricalEngineer,然后是 ComputerEngineer

public class Engineer {
    public void do() {
        System.out.println("I build stuff");
    }
}

public class ElectricalEngineer {
    public void do() {
        System.out.println("I build electronics");
    }
}

public class ComputerEngineer {
    public void do() {
        System.out.println("I build computers");
    }
}

Engineer eng = new Engineer();
ElectricalEngineer ee = new ElectricalEngineer();
ComputerEngineer ce = new ComputerEngineer();

eng.do(); // prints "I build stuff"
ee.do(); // prints "I build electronics"
ce.do(); // prints "I build computers"

// eng is of type Engineer
// ee is of type ElectricalEngineer
// ce is of type ComputerEngineer

Engineer ee2 = new ElectricalEngineer();
Engineer ce2 = new ComputerEngineer();

ee2.do(); // prints "I build electronics"
ce2.do(); // prints "I build computers"

这里,看起来ee2Engineer类型,但它实际上是ElectricalEngineer。它将调用其重写的 do() 方法。与ce2

相同
ElectricalEngineer ce3 = new ComputerEngineer();

ce3.do(); // prints "I build computers"

但如果你这样做:

ElectricalEngineer ee3 = new Engineer();
ComputerEngineer ce4 = new ElectricalEngineer();
ComputerEngineer ce5 = new Engineer();

您将在所有这些方面收到错误,因为 ElectricalEngineer 是一名工程师。 ComputerEngineer 是一个ElectricalEngineerComputerEngineer 也是一个工程师。但并非所有工程师都保证是ComputerEngineerElectricalEngineer。据您所知,他们可能是土木工程师

关于java - 使用继承的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33967146/

相关文章:

Java:使对象 "fit"的类型为基类不实现接口(interface)且不能从中继承的类型

java - 使用 SQLite4java 中的数据填充 JTable 的最佳方法

Java多维数组被认为是原始或对象

Java网络应用程序: pulling data out of database according to locales

java - 如何将 JSON 字符串转换为 GSON 对象?

javascript - 将元素附加到页面隐藏输入字段

c# - 如何让派生类函数被执行?

visual-c++ - 通过派生类中指向基类的指针调用基类中的 protected 方法

java - onLocationChanged() 不会自动调用

java - 使用 SolrJ 过滤查询排除