java中继承私有字段

2024-03-06

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

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

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


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

子类必须向父类发出请求,然后对父类中声明的成员变量执行某些操作。

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

例如:

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)分配空间。

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

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

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

注意:有多种方法可以通过反射来访问私有变量。

能见度

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

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

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

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

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

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

警告:也有一些方法会导致您原本期望可见的代码不可见。这是因为类加载器的工作方式。 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.

    ...
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中继承私有字段 的相关文章

  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • 使用选项卡式活动中的捆绑包将值从活动传递到片段

    我是一个java文盲 但仍在尝试开发一个供我个人使用的应用程序 我从 android studio 的 Tabbed Activity 开始 除了 MainActivity 中的一个片段和一个包之外 大部分没有改变 这是我的代码 主要活动
  • JAVA - 带有特殊字符的 LDAP 密码不起作用

    我试图在我的系统上创建一个登录屏幕 在 Active Directory 中进行查询 但是当用户的密码包含一些特殊字符 如 和 时 它不会验证 我需要加密密码才能工作吗 我该怎么做 我使用 getPassword 通过 JPasswordF
  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • JPanel透明背景和显示元素[重复]

    这个问题在这里已经有答案了 我插入一个背景图e 变成 aJPanel但一些界面元素消失了 以下 Java Swing 元素不会出现 标签标题 标签 usuario 标签 密码 按钮加速器 你能否使图像透明或元素不透明 setOpaque f
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 我们可以在三元运算符(Java)中使用命令吗?

    这是一个工作代码 String a first String b second String object System out println object null a b 但它不是 String a first String b se
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐