0

我对 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);
    }


}

现在,如果我创建另一个包“practice2”并使用导入并尝试创建“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

4 回答 4

3

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

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

Java中有四种访问级别:

  • 上市
  • 受保护
  • 包私有(无显式修饰符)
  • 私人的

如果您的类成员没有显式修饰符 - 它会自动设置为包私有。它在官方教程中有完整的描述。

于 2013-03-10T09:18:23.530 回答
1

我建议阅读/理解 java 中的访问说明符(公共、私有、受保护和默认)。理解这些概念本身就会回答你的问题。

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

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

于 2013-03-10T09:57:13.223 回答
1

这是因为你的两个类在不同的包中。从文档中:

可以使用修饰符 public 声明一个类,在这种情况下,该类对任何地方的所有类都是可见的。如果一个类没有修饰符(默认值,也称为包私有),则它仅在其自己的包中可见(包被命名为相关类的组 - 您将在后面的课程中了解它们。)

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

于 2013-03-10T09:22:20.660 回答
0

来自 vmoksha 的 Sunilkumar

请进行更深入的导航它将起作用为类创建对象并再次为对象创建的类创建setter/getter

于 2013-03-11T13:39:58.570 回答