私有成员和继承

4

我在一本教科书中读到,被标记为私有的类成员是不会被继承的。 因此,我认为如果类A有一个private变量x,并且类B扩展了类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,我感到困惑,因为它看起来像引用b的对象现在具有变量length和其值为32。但是引用b指的是从类创建的对象,其中未定义length变量。 那么真相是什么?类是否继承了私有变量length?如果是这样,那么“私有”变量不被继承意味着什么?

请不要在标题中添加“Java”,您已经使用java标记了您的问题。 - Pshemo
3个回答

3

private修饰的变量在B类中是隐藏的。但是,public方法是可以继承并且可以被访问到的,它们可以访问私有变量。


2

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

不能直接调用:

b.length=8;

或者你甚至无法这样做:(将此写在创建B对象的位置)

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

这两种方法都是无效的!

更多信息:

您甚至不需要将B继承自A,只需在主函数中创建一个A对象并使用您的那些get和set方法即可正常工作!


-1

你无法直接访问超类的私有字段和方法,但可以通过其他公共方法访问它们。

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

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

b.length = 32;

也不是这样(针对超类)

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

但是你可以通过使用公共方法来操作这些字段,就像你的示例中一样。

原因很简单:你的私有字段/方法对于其他类除了持有它们的类而言是隐藏的,但是你的公共字段/方法不是隐藏的。


1
问题不在于getter/setter如何工作,而是为什么如果private字段不被继承,那么length字段为什么会在B类中被继承访问 - Luiggi Mendoza
我编辑了帖子并更正了我的错误。谢谢回复! :) - SCBbestof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接