当前位置: 首页 > 面试题库 >

Java继承-请解释

莫宁
2023-03-14
问题内容
class A {
    public void talk(){
        this.sayIt();
    }

    private void sayIt(){
        System.out.println("class A says...");
    }
}

class B extends A {
    private void sayIt(){
        System.out.println("class B says...");
    }
}

测试类,主要方法:

B b = new B();
b.talk()

//output
class A says...

由于以下原因,我无法获得此信息:

B类 继承自 A类 (公共成员),并且无法查看/继承私有功能。因此,在 B类中 ,我们可以调用 talk()
//因为它是由父类继承的。

现在,在 talk()* 方法中,由于在 类B中 定义了 sayIt() ,因此可以调用 sayIt()* __

我希望将呼叫 B.sayIt() 时进行 this.sayIt() 被执行。

“这个”不是指 B类 吗?

请解释。


问题答案:

因为您将sayIt()定义为私有,所以B类无法覆盖它。这样,您就有了sayIt()的两个定义,而不仅仅是一个被子类覆盖的定义。

在A类代码的一部分中,即使B类版本受保护或公开,它也始终会从A类调用该版本。这是因为类A只知道类A的版本,因为类B的版本 不是
替代,而是一个完全不同的方法,恰好共享相同的名称。

在B类代码的一部分中,由于A类版本被标记为私有,因此它将始终从B类调用该版本。正如其他人指出的那样,如果将定义更改为protected或public,则B类将可见该定义,并且它将按照您的意愿进行操作。

请注意,如果要使用默认的(程序包)可见性,则作用域规则将变得非常复杂,并且实际结果将根据同一程序包中的哪些子类以及不同程序包中的哪些子类而有所不同。



 类似资料:
  • 我是新来的Java,已经参加了几个星期的课程,并被要求完成一个包含以下信息的项目: > 设计具有以下数据字段的船舶等级: > 船舶建造年份的数据字段(int)。 构造函数和适当的访问器和变异器。 显示船名和建造年份的toString方法。 设计一个CruiseShip子类,扩展船舶类。CruiseShip类应具有以下内容: > 最大乘客数的额外数据字段(int)。 构造函数和适当的访问器和变异器。

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 本小节我们将学习 Java 的继承,通过本小节的学习,你将知道什么是继承,继承有什么特点,如何实现继承,方法重写的概念和实现,方法重写和方法重载是比较容易混淆的概念,我们也会介绍两个概念的区别,这些都是本小节的重点,本小节的最后我们还会介绍 super 关键字以及 final 关键字。 1. 概念和特点 1.1 概念 继承是面向对象软件技术当中的一个概念。如果一个类别 B “继承自” 另一个类别

  • C语言面向对象编程(二):继承详解 在 C语言面向对象编程(一) 里说到继承,这里再详细说一下。 C++ 中的继承,从派生类与基类的关系来看(出于对比 C 与 C++,只说公有继承): 派生类内部可以直接使用基类的 public 、protected 成员(包括变量和函数) 使用派生类的对象,可以像访问派生类自己的成员一样访问基类的成员 对于被派生类覆盖的基类的非虚函数,在派生类中可以通过基类名和

  • 问题内容: 问题的简短摘要:我有一个父类,并由子类扩展。 该子类使用super调用Parent的构造函数: 我想知道是否可以在Grandchild类的构造函数中调用super()方法来扩展Child类: 问题答案: super()在继承上一级调用构造函数,如果存在无参数的构造函数,则将隐式调用该构造函数。 对象是从继承的最高层初始化的,在您的情况下是对象>父>子>孙。 从文档中:

  • 问题内容: 我有一个Java类,它会触发自定义Java事件。该代码的结构如下: 一切正常,但是我想创建一个新的A类(称为B),这可能会引发一个新事件。我正在考虑以下修改: 这是正确的方法吗?我在网上搜索示例,但找不到任何示例。 在此解决方案中,有几件事我我不喜欢: 有两种方法,一种使用另一种方法作为参数。 类都具有和方法。是否应该使用private关键字隐藏addAListener? [更新:无法