私有成员和继承[重复]

Posted

技术标签:

【中文标题】私有成员和继承[重复]【英文标题】:Private members and inheritance [duplicate] 【发布时间】:2015-01-21 09:55:54 【问题描述】:

我在一本教科书中读到,标记为私有的类成员不会被继承。 所以我想如果A 类有一个private 变量xB 类将扩展A 类,那么B 类中就不会有变量x。 但是,以下示例表明我误解了这一点:

public class testdrive

    public static void main(String[] args) 
        B b = new B();
        b.setLength(32);
        System.out.print(b.getLength());
    


class A 
    private int length;
    public void setLength(int len) 
        length = len;
    
    public int getLength() 
        return length;
    


class B extends A 
    public void dummy() 
    

结果是 32,我很困惑,因为它看起来像带有 ref b 的对象现在有变量 length,它的值是 32。但是 ref b 指的是从类 B 创建的对象,其中length 变量未定义。 那么真相是什么,B 类是否继承了private 变量length?如果是这样,private变量没有被继承是什么意思?

【问题讨论】:

不要在你的标题中添加“Java”,你已经用java标记了你的问题。 【参考方案1】:

private 的字段隐藏在 B 中。但是,您的 public 方法是继承的并且是可访问的,并且它们可以访问私有字段。

【讨论】:

【参考方案2】:

嘿伙计,这不是你想的那样,私有字段只能被同一个类中存在的方法访问(当然,这些方法可以从其他类访问)

不是你可以直接调用:

b.length=8;

或者你甚至不能这样做:(写在你为B创建对象的地方)

A a = new A();
a.length=8;

这两种方法都无效!

更多信息:

你甚至不需要从 A 扩展 B,只需在 main 中创建一个 A 的对象并使用你的 get 和 set 方法,它也可以工作!

【讨论】:

【参考方案3】:

您不能直接访问超类的私有字段和方法,但可以通过使用其他公共方法来访问它们。

这是面向对象编程的基本概念之一,它被命名为封装。 在此处阅读更多信息:TutorialsPoint。

底线:您不能直接访问这样的私有字段或方法

b.length = 32;

也不是这样(对于超类)

A a = new A();
a.length = 32;

但您可以通过使用示例中的公共方法来操作这些字段。

原因很简单:您的 private 字段/方法对于其他类除了拥有它们的类隐藏,但是您的 private strong>public 字段/方法未隐藏。

【讨论】:

问题不在于 getter/setter 是如何工作的,而是为什么 length 字段在 B 类中是 inheritedaccessible 如果private字段不被继承。 我编辑了帖子并纠正了我的错误。感谢您的回复!:)

以上是关于私有成员和继承[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++未定义对已继承的受保护类成员的引用[重复]

C ++:如何声明私有成员对象[重复]

在继承中使用私有变量[重复]

编译失败,将静态变量作为私有成员变量的c ++程序[重复]

编译类型向量类的私有成员时出错 - C++ [重复]

java随手笔记二之继承