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

时间:2015-04-20 15:14:59

标签: java default

当我访问默认设置(前面没有公共或私有访问修饰符)时,从String s = "hello"class Acom.access.test访问class B变量在同一个包中,我无法在s中获取变量class B。 IDE显示永远不会定义变量s

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

3 个答案:

答案 0 :(得分:0)

您应该可以通过A的实例在B中访问它。

所以这样做:

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

如果将String a定义为静态,则可以按B中的类名访问它,如:

//print A.s

答案 1 :(得分:0)

直接在课堂外访问A类变量,即使在同一个包中也是如此。

以一种简单的方式思考它,B类在同一个包中但不继承A类,对吧!

因此String s;不是class B的一部分。然后如何直接访问它。您必须在class A中创建class B的对象,然后才能访问String s

只需了解Java中的Access Modifiers的基础知识,您就会知道即使没有对象,也无法在类外部访问类的公共变量。

例如:

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的对象仍然无法访问,即使这两个类都在同一个程序文件中。

同样是默认修饰符的情况。

希望这有帮助。

答案 2 :(得分:0)

考虑以下两个类

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

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

我认为您可能会混淆辅助功能命名空间。每个类定义都创建自己的命名空间。这使您可以在单独的类中创建具有相同名称的实例字段,这些类仍然分别封装在每个类中。

如果您希望访问在同一个包中但在单独的类中具有默认访问权限的实例字段,则必须使用类实例限定该字段名称(以便编译器知道该字段的位置;如果您如果不对字段名称进行质量调整,则假定您只希望考虑当前范围内的字段名称。例如,要从myA访问ClassB,您需要写:

a = new ClassA();
System.out.println("myA = " + a.myA);
相关问题