有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无法在同一包的不同类中访问具有默认access关键字的java变量

当我从包com.access.test中的class A到同一个包中的class B访问默认(前面没有公共或私有等访问修饰符)访问变量String s = "hello"时,我无法获取class B中的变量s。 IDE显示变量s从未定义过

但是为什么Java说默认的访问变量可以在同一个包中访问呢。正如我们所知,通过扩展类,可以从不同的包访问受保护的变量。 因此,默认变量应该是access,甚至不需要进行class A的对象实例化(A a = new A()然后a.s)。 请解释一下


共 (3) 个答案

  1. # 1 楼答案

    您应该能够通过A的实例在B中访问它

    所以你可以这样做:

    A a = new A();
    //print a.s
    

    如果将字符串a定义为静态,则可以通过B中的类名访问它,如:

    //print A.s
    
  2. # 2 楼答案

    考虑以下两个类

    public ClassA {
        String myA = "A string";
    }
    

    public ClassB {
        String myB = "B string";
    }
    

    我认为你可能混淆了可访问性名称空间。每个类定义都创建自己的名称空间。这使您能够在单独的类中创建名称相同的实例字段,这些类仍然单独封装在每个类中

    如果希望访问在同一个包中但在另一个类中具有默认访问权限的实例字段,您必须用类实例限定该字段名(以便编译器知道该字段的位置;如果没有质量字段名称,则假定您只希望在当前作用域中考虑字段名)。例如,要从ClassB访问myA,您可以编写:

    a = new ClassA();
    System.out.println("myA = " + a.myA);
    
  3. # 3 楼答案

    直接在类外部访问类A的变量,即使在同一个包中也是不可能的

    简单想想,B类在同一个包中,但不是继承a类,对吧

    所以String s;不是class B的一部分。那么如何直接访问它呢。您必须在class B中创建一个class A对象,然后String s将可访问

    只要学习Java中访问修饰符的基本知识,您就会知道,即使是类的公共变量,如果没有对象,也无法在类之外访问

    例如:

    class Test5
    {
        public int x=10;
    }
    class TestMain
    {
        public static void main(String[] arg)
        {
            //System.out.println(x); //Generates Compile Time Error
            Test5 obj= new Test5();
            System.out.println(obj.x);
        }
    }
    

    在本例中,x是公共的,但如果没有类Test5的对象,仍然无法访问,即使这两个类都在同一个程序文件中

    默认修饰符也是如此

    希望这有帮助