2012-08-30 68 views
1

我对Java OO编程相对比较陌生,并且已经回顾了与此类似的问题,尽管他们似乎没有直接回答我的问题。JAVA - 初学者 - 可以在班级之外访问私人班级属性吗?

基本上,我明白,如果一个类中的数据成员被声明为私人,则是来自同一个类中唯一的访问。

我的讲师总是建议所有属性都应该声明为私有 - 为什么会这样?

现在我熟悉使用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()); 
    } 
} 

将代码的第二块允许在showInt(该方法)内部等级2到实际访问私人Class的属性?

我想我真的决定任何属性或方法是否应被宣布挣扎公共或一般私人 ..

是否有应遵循拇指的任何特定规则?

谢谢响应者的任何帮助。

亲切的问候

+3

请永远不要将一个类命名'Class' :) – Nishant

+0

我明白 - 这只是用于说明目的的例子。 – AlexM

+0

只要你调用一个方法把所需的参数放在括号中。 – shan

回答

2

关键是公众get方法只返回当前值你的私人成员,没有给予成员本身的访问权限。这意味着你不能以某种方式“获得”该成员并改变其价值。

+0

哦,这使得更多的意义!谢谢你,先生 - 我只是需要有人为我这样说。问候 – AlexM

+0

简单而直接点 - 再次感谢。 – AlexM

1

是的,如果你让一个公共的访问,您可以访问私有字段。

重点是隐藏实现,以便作为实现者,您可以稍后决定是否有另一种类型的字段(或间接或动态计算),而不强制类的用户更改其代码。

它还可以让你提供一个吸气器,而不提供任何setter(那么你的领域只能从课堂外读取)。

很多事情不会在你的代码编译:

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

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

3

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

善意的提醒。这条规则有例外,但我会从此开始。

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

其访问

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

将代码的第二块允许showInt()内的Class2的方法进行实际访问从类私有属性?

有效地是在这种情况下。通过使用getter,该字段可以更改名称,由常数或计算替换或记录,而Class2不需要知道。

+0

好的谢谢你,是我的发布代码作为'反射'的例子? – AlexM

+1

@AlexM号您的示例中未使用任何反射。 – maba

+0

@AlexM ...或嵌套类。 –

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

您将无法获得访问权限。

0

简短的回答:没有。

作出一切私人的一般原因是为了确保你的类的用户不能修改的东西,他们不应该的方式。

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

private int foo; 

public int getFoo(){ 
    return foo; 
} 

通过这种方式,人们可以看到foo,但不能改变它。

+0

认为反思? – Nishant

+0

afaik反射不能用来改变私人成员,但我可能是错的。 – Dylan

+0

http://stackoverflow.com/questions/4516381/changing-private-final-fields-via-reflection – Nishant