当前位置: 首页 > 知识库问答 >
问题:

内部类可见性的一些问题

萧光华
2023-03-14

我面对java内部类,我在外部变量可见性方面遇到了一些麻烦。

class A {
    private int x = 5;
    class B extends A{
        public void fun(B b){
            b.x = 10; //here
        }
    }
}

如果内部和外部类之间没有可见性限制,为什么我不能做这样的事情(见“这里”标签)?我真的不理解这些规则。

共有3个答案

慕宏峻
2023-03-14

你需要知道这三个私有的,受保护的默认的,公共访问说明符

  1. 私有变量只能在自身中修改class.not包括子类
  2. 默认变量可以在同一个包中修改。
  3. protected变量可以在子类中修改,也可以在同一个包和它本身中修改
  4. 公共变量可以在任何地方修改。

你可以在这个链接上看到

beside.if您使用此示例,这可以通过使用Super说明符来修改您的变量以访问您的可见

class A {
    private int x = 5;
    class B extends A{
        public void fun(B b){
            b.x = 10; //here error
            super.x=1;//this is ok
        }
    }
}

这个 b.x = 10; //这里错误 这个问题是 b 是方法的parm,而不是成员变量或超类变量。

赫连棋
2023-03-14

修饰符<code>private

class A {
    private int x = 5; // The issue is in `private` in this line
    class B extends A{
        public void fun(B b){
            b.x = 10; //here
        }
    }
}

如果您移除修饰符< code>private并将其更改为< code>default 、< code>public或< code>protected,您将能够访问该变量。

请浏览链接以更好地理解。

更新:

删除 extends 关键字(现在类 B 将不再是子类,而只是一个内部类),变量 x 将仅使用此 OR 超级关键字进行访问。用法在链接中详细说明

裴俊迈
2023-03-14

在您的示例中,成员变量< code>x不是类B的属性,因此< code>b.x = 10不生成sesne,因此出现错误,这与可见性规则无关。尝试< code>x = 10工作正常,这是< code>A.this.x = 10或< code>super.x = 10的快捷方式。

 类似资料:
  • 问题内容: 考虑以下情况: 从Eclipse中的警告中,我引用:Java编译器通过合成访问器方法模拟构造函数AB()。我想编译器现在可以继续进行,并为B创建一个额外的“水下”构造函数。 我觉得这很奇怪:为什么类B在A的ako字段中不可见?并且:这是否意味着B类在运行时不再是私有的?并且:为什么B类的protected关键字表现不同? 问题答案: 内部类本质上是Java 1.1中引入的一种hack。

  • 问题内容: 我正在Kotlin中开发一个Android 密码库。我有几个类在Java应用程序中公开可见。在文档中找到了这一点。 声明成为Java。类的成员会经历名称重整,以使其更难从Java中意外使用它们,并允许重载具有相同签名但根据Kotlin规则彼此不可见的成员。 有办法解决这个问题吗? 问题答案: 我已经看到您所有的内部类都涉及加密和解密。 您可以通过定义一个顶级函数并将其标记为 ,然后将E

  • 假设您正在编写一个Android项目(不是库)。所有文件都编译在一起,因此......在这种情况下使用可见性修饰符有任何意义吗?

  • 前言 内容不多,希望这些常见的一些原理性问题可以帮助有需要的人。 Handler机制和底层实现 Handler、Thread和HandlerThread的差别 handler发消息给子线程,looper怎么启动? 关于Handler,在任何地方new Handler 都是什么线程下? ThreadLocal原理,实现及如何保证Local属性? 请解释下在单线程模型中Message、Handler、

  • 问题内容: 如果我有一个包私有的Java类(用“ class”声明,而不是“ public class”),那么将内部方法声明为public或protected或package- private确实没有区别,对吗?那么我应该使用哪个,或者什么时候该使用呢?我有点困惑。 问题答案: 如果我有一个包私有的Java类(用“ class”声明,而不是“ public class”),那么将内部方法声明为p

  • 我必须在Java中实现一个名为的接口。 假设是我编写的实现graph的类。 我想创建一个内部类以便“封装”类型的元素。 问题是我不明白内部类应该是还是、还是以及它的实例变量应该声明为还是。对于我将要在中插入的一些最终方法也是如此。 基本上,类节点应该像C语言中的记录类型(带有),并且外部类应该能够访问节点的所有实例变量,而不需要观察器、getter等。