封装:该字段不可见?

时间:2013-03-10 09:15:57

标签: java

我是Java的新手。我编写了一个小程序来理解封装和访问方法。 代码是:

package practise;

public class EncapTest {

    private String name;
    String surname;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

package practise;

public class RunEncap {

    public static void main(String[] args) {

        EncapTest encapObj = new EncapTest();

        encapObj.setName("Prabh");
        encapObj.surname = "Rana";

        System.out.println("Name :" + encapObj.getName());
        System.out.println("Surname :" + encapObj.surname);
    }


}

现在,如果我创建另一个包“practise2”并使用import并尝试创建“EncapTest”对象,我可以访问变量名称,但是当我尝试访问姓氏时,它显示字段姓氏的错误不可见..

package practise2;

import practise.EncapTest;

public class Runencap2 {

    public static void main(String[] args) {

        EncapTest encapObj = new EncapTest();

        encapObj.setName("Prabh");
        encapObj.surname = "Rana";     // <<<<getting error here

        System.out.println("Name :" + encapObj.getName());
        System.out.println("Surname :" + encapObj.surname);        
    }

}

4 个答案:

答案 0 :(得分:3)

您的surname字段具有默认(包私有)访问级别,这意味着此字段仅对于在相同包中声明的类可见。

String surname; // access level implicitly sets to package-private

Java中有四个访问级别:

  • 公共
  • 保护
  • package-private(无显式修饰符)
  • 私有

如果您的类成员没有显式修饰符 - 它会自动设置为package-private。它在官方教程中完全described

答案 1 :(得分:1)

这是因为你的两个班级在不同的包中。来自documentation

  

可以使用修饰符public声明一个类,在这种情况下,该类对所有类都可见。如果一个类没有修饰符(默认,也称为包私有),它只能在其自己的包中看到(包被命名为相关类的组 - 您将在以后了解它们教训。)

     

在成员级别,您也可以使用public修饰符或no修饰符(package-private),就像使用顶级类一样,并且具有相同的含义。对于成员,还有两个额外的访问修饰符:private和protected。 private修饰符指定只能在自己的类中访问该成员。 protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问该成员。

答案 2 :(得分:1)

我建议阅读/理解java中的访问说明符(public,private,protected和default)。理解这些概念本身就可以回答你的问题。

在上面的示例中,您已声明具有默认访问权限的实例变量“surname”(如果未指定为public,private或protected,则使用隐式访问说明符)。默认访问权限仅允许您在同一个包中访问变量/方法。因此,您可以在“RunEncap”类中访问它,但不能在“Runencap2”中访问它,因为该变量对其他包不可见。此外,作为一种良好的编程习惯,建议将变量声明为私有,并使用get getter / setter方法来访问它们。

以下是您可以参考的示例链接,了解访问说明符 - http://www.aoiblog.com/java-access-specifier/

答案 3 :(得分:0)

来自vmoksha的Sunilkumar

转到更深入的导航它会起作用   为类创建对象,并再次为对象创建的类<​​/ p>创建setter / getter