Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的继承私有字段_Java - Fatal编程技术网

java中的继承私有字段

java中的继承私有字段,java,Java,如果子类不能从超类继承私有成员,但它从超类继承公共方法,该超类可以访问未继承的私有成员,如本文所述 由子类的继承成员修改的超类的私有成员存储在哪里?它们存在于何处?子类的实例包含其超类的所有成员,但是不能从子类内部访问私有成员。将私有成员变量视为存在于声明它们的类中。如果子类在其父类中调用一个方法来更改成员变量,请将该更改视为发生在父类中。这是一种在您的头脑中对其建模的有用方法,因为只有父类才能拥有读取或写入该变量值的代码 子类必须向父类发出请求,然后对上面声明的成员变量进行处理 如果使用子类

如果子类不能从超类继承私有成员,但它从超类继承公共方法,该超类可以访问未继承的私有成员,如本文所述


由子类的继承成员修改的超类的私有成员存储在哪里?它们存在于何处?

子类的实例包含其超类的所有成员,但是不能从子类内部访问私有成员。

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

子类必须向父类发出请求,然后对上面声明的成员变量进行处理

如果使用子类中的代码重写父类中的方法,则该重写方法无法访问私有成员变量,即使父类中被重写的方法访问私有成员变量。子类中的重写方法可以调用父类中的重写方法

例如:

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)
    }
}
低级信息:

不过,在较低的级别上,我可能会创建一个子类的实例,该实例将为子类的所有实例变量和所有父类(包括Object)分配一个内存块

方法本身的代码存在于一些类加载器为包含每个方法的类分配的内存中。这是按班级分配的。因此,各种子类和父类的代码没有存储在一起,即使数据存储在实例中

访问规则只是不允许子类中的代码访问为父类或祖先类专用的实例变量分配的内存

然而,在这种情况下,很少值得花这么多精力去思考它。这就是我的经验。其他人可能会有不同的看法

注意:通过反射可以访问私有变量

可见性

我可能需要一些帮助,因为我是凭记忆工作的

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

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

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

受保护-可以通过同一类中的代码、该类的任何子类中的代码以及与该类位于同一包中的任何类中的代码访问这些

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

警告:还有一些方法会使您原本希望看到的代码不可见。这是因为类加载器的工作方式。JavaEE有一个类加载器嵌套,您可能最终会发现一个类加载器加载的代码对另一个类加载器加载的代码不可见。您可以得到两个全名相同的类(包括包)。我认为所有这些都是一个“高级”的话题,我必须阅读它来解释它。我想指出的是,这种情况经常发生,并且会让你对能见度产生疑问

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.

    ...
}

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

正如oracle教程中提到的,子类不会继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。也许继承不是最好的词,但子类的任何实例仍然包含超类的所有成员,它们只是不能直接访问。@PaulBellora。。私有成员不是子类的一部分。子类不会继承它们。@LeeMeador Nittpick:我会说“带有子类的实例”-变量指向实例。这不是第一次发生。它很好地描述了在hood下发生的事情,但是你会说如果该私有成员不访问,如果它“隐藏”怎么办,我的意思是如果子类存在于超级类的同一个包中?相反,**不继承私有成员和隐藏私有成员之间有什么不同**@Lee Meador我的意思是在前面的评论中,正如oracle教程中提到的……一个子类继承其父类的所有公共和受保护成员,无论该子类在哪个包中。如果子类与其父类在同一个包中,它还继承父类的包私有成员。没有未继承的私有成员;th