gpt4 book ai didi

java - java中的继承私有(private)字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:38 28 4
gpt4 key购买 nike

如果子类不能从父类(super class)继承私有(private)成员,但它从父类(super class)继承了公共(public)方法,这些方法可以访问未继承的私有(private)成员,如此处所述

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html



被子类继承成员修改的父类(super class)私有(private)成员存放在哪里?它们存在于何处?

最佳答案

将私有(private)成员变量视为存在于声明它们的类中。如果子类调用其父类中的方法来更改成员变量,请将此更改视为发生在父类中。这是一种在头脑中对其进行建模的有用方法,因为只有该父类才能拥有读取或写入该变量值的代码。

子类必须向父类发出请求,然后对在那里声明的成员变量做一些事情。

如果您使用子类中的代码覆盖父类中的方法,则该覆盖方法无法访问私有(private)成员变量,即使父类中的覆盖方法可以访问。不过,子类中的覆盖方法可以调用父类中的覆盖方法。

例如:

public class Parent {
private int bar = 0;
public void setBar(int value) {
bar = value;
}
}

public class Derived extends Parent {
@override
public void setBar(int value) {
bar = value + 1; // NOT ALLOWED
super.setBar(value + 1); // ALLOWED (same result)
}
}

低级信息:

但是,在较低级别,我可能会创建一个 SubClass 的实例,它将为 SubClass 的所有实例变量和所有父类(包括 Object)分配一块内存空间。

方法本身的代码位于某个类加载器为包含每个方法的类分配的一些内存中。这是按类(class)分配的。因此,即使数据一起存储在实例中,各种子类和父类的代码也不会存储在一起。

访问规则只是不允许 SubClass 中的代码访问为父类或祖先类私有(private)的实例变量分配的内存。

但是,在这种情况下,很少值得花精力考虑这么多细节。这就是我的经验。其他人可能会有不同的看法。

注意:有一些方法可以通过反射访问私有(private)变量。

可见性

我可能需要一些帮助,因为我是凭内存工作的。

有四个级别的可见性分配给成员变量。这些与用于类变量和方法的四个相同。

private - 这些变量只能由声明它们的同一类中的代码访问。 (嗯……它们也可以被该类中的内部类访问。)

包 - 这些可以通过同一类中的代码和与该类相同的包中的任何类中的代码访问。具有该代码的类可以在您的源文件或某个 jar 文件中,或者实际上位于类路径中的任何位置。 (注意:没有关键字“package”。如果没有其他关键字来表示可见性,则变量具有包级别的可见性。我喜欢将“package”一词放在/* */注释中。)

protected - 这些可以通过同一类中的代码和该类的任何子类中的代码和与该类相同的包中的任何类中的代码访问。

public - 这些可以通过任何其他类中的代码访问。

警告:还有一些方法使您原本希望可见的代码不可见。这是因为 ClassLoader(s) 的工作方式。 Java EE 具有类加载器的嵌套,您最终可能会发现一个类加载器加载的代码对另一个类加载器加载的代码不可见。您最终可以得到两个具有相同全名的类(包括包)。我认为所有这些都是“高级”主题,我必须仔细阅读以进行解释。我确实想指出它会发生并且可能会导致您对可见性产生疑问。
public class MyClass {
private int foo1 = 1; // visible in this class only
protected int foo2 = 2; // visible here, in subclasses and in classes with same package
int foo3 = 3; // visible here and in classes with the same package
public int foo4 = 4; // visible here, there and everywhere

/* package */ int foo5 = 5; // how I like to do 'package' variables with a comment
// to show I intended to do it on purpose. If you read
// my code you don't have to wonder if I forgot it.

...
}

最后一个实用的说明:从长远来看,我发现将几乎所有成员变量设为私有(private)非常有用。如果您需要将它们更改为更可见的内容,请这样做,或者可能只是创建具有所需可见性的 getter 和 setter 方法。一个优点是,如果我提供一个 getter 而没有 setter,或者如果 getter 是公开的并且 setter 受到保护,我可以提供只读访问权限。我还可以创建一个可以设置但从不读取的只写变量。这适用于依赖注入(inject),但您应该对此发表评论。也许你可以看到优点。缺点是您编写了更多代码行,但如果您愿意,Eclipse 和其他 IDE 将为您生成这些方法。

关于java - java中的继承私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529901/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com