2

我对 Java OO 编程比较陌生,并且已经查看了与此类似的问题,尽管它们似乎没有直接回答我的问题。

基本上,我知道如果一个类中的数据成员被声明为private,那么它只能从同一个类中访问。

我的讲师总是建议应将所有属性声明为私有属性——这是为什么呢?

现在我熟悉使用 GET 方法,我的问题是,可以通过从另一个类调用 PUBLIC 'get' 方法(返回上述属性)在它自己的类之外访问私有属性吗?

例如:

public class Class()
{

    private int number = 0;

    public Class()
    {
    }

    public int getNumber()
    {
        return number;
    }

}

然后从另一个班级:

public class Class2()
{

    Class class = new Class();

    public void showNumber()
    {
        System.out.print(class.getNumber());
    }
}

第二个代码块是否允许 Class2 内的showInt()中的方法实际访问 Class 的私有属性?

我想我真的很难决定是否应该将任何属性或方法声明为公共的或私有的。

是否应该遵循任何特定的经验法则?

感谢响应者的任何帮助。

亲切的问候

4

5 回答 5

4

我的讲师总是建议所有属性都应该声明为私有的。

好建议。这条规则有例外,但我会从这个开始。

我知道如果一个类中的数据成员被声明为私有,那么它只能从同一个类中访问。

它可以访问

  • 嵌套类在同一个文件中。
  • 通过反射访问。

第二个代码块是否允许 Class2 内的 showInt() 中的方法实际访问 Class 的私有属性?

在这种情况下实际上是的。通过使用 getter,字段可以更改名称、被常量或计算替换或被记录,而 Class2 不需要知道。

于 2012-08-30T11:48:39.093 回答
2

关键是公共get方法只返回您的私有成员的当前值,而不授予对成员本身的访问权限。这意味着您无法以某种方式“获取”该成员并更改其值。

于 2012-08-30T11:52:34.450 回答
2

是的,如果您创建一个公共访问器,您可以访问私有字段。

关键是要隐藏实现,以便作为实现者,您可以稍后决定使用另一种类型的字段(或间接,或动态计算),而不会强迫您的类的用户更改他们的代码。

它还允许您在不提供任何 setter 的情况下提供 getter(然后您的字段只能从类外部读取)。

许多事情不会在您的代码中编译:

  • 添加括号以调用方法(getInt)
  • 类是保留字
  • 一个类不能被称为 Class 并且没有像你一样声明

我建议您在提问之前在编辑器(例如 Eclipse)中编写编译代码。这项任务可能会帮助您至少了解部分问题。

于 2012-08-30T11:47:59.820 回答
1

是的。

您将不得不调用该方法(并且不能class用作类名):

public class Class2()
{

    Class myClass = new Class();

    public void showInt()
    {
        System.out.print(myClass.getInt());
    }
}

发生的情况是您无法访问私有成员,但您会收到该值的副本。在这种情况下,您访问的是方法 getInt(),而不是属性。如果您尝试访问该属性:

public class Class2()
{

    Class myClass = new Class();

    public void showInt()
    {
        System.out.print(myClass.x);
    }
}

你不会被授予访问权限。

于 2012-08-30T11:49:28.710 回答
0

简短的回答:没有。

将所有内容设为私有的一般原因是确保您班级的用户不能以他们不应该的方式修改内容。

可以做的是定义 getter 和 setter 方法。通常最好只暴露吸气剂,例如

private int foo;

public int getFoo(){
  return foo;
}

这样,人们可以看到 foo但不能改变它。

于 2012-08-30T11:49:44.950 回答