对象引用能够直接访问私有数据成员

时间:2013-05-26 07:51:30

标签: java

public class College{ 
  int year; 
  String name; 
  College(int year,String name){ 
        year=year; 
        name=name; 
  } 

  public static void main(String[] args) { 
        College first=new College(1998,"BITS"); 
        System.out.println("The year is:"+first.year); 
        System.out.println("The name is:"+first.name); 
  } 
}

我的输出是: 这一年是0 名称为null

这是怎么回事? 据我所知,该对象首先无法直接访问私有数据成员。

4 个答案:

答案 0 :(得分:6)

这是因为您在构造函数中隐藏了yearname字段。

使用:

  College(int year,String name){ 
        this.year=year; 
        this.name=name; 
  } 

或:

  College(int y,String n){ 
        year=y; 
        name=n; 
  } 

我更喜欢第一种选择。

顺便说一句,字段不是私有,因为您没有将它们声明为一个,默认为package。 即使您将它们设置为私有,属于类的静态方法也可以看到私有成员变量。

答案 1 :(得分:5)

宣布:

year=year; 
name=name;

...你阴影你的变量。

您的变量与范围相关联,目前,yearname的范围都在构造函数中。你基本上是在自己的基础上分配它。

您有几个选择:

  • 使用this运算符 - this.year = year;
  • 重命名传入的变量名称,前缀为:

    College (int theYear, String theName) {
        year = theYear;
        name = theName;
    }
    

此外,此课程中没有任何私人字段。它们都被设置为包私有,根本没有可见性修饰符。

如果您使用year修饰符指定了字段nameprivate,那么您就是对的;你必须使用getter来检索变量值。

答案 2 :(得分:1)

您必须使用

this.year = year 
this.name = name 

在构造函数中 这样可以解决问题:)

答案 3 :(得分:1)

在您提到的问题中,对于以下变量,他们是私人数据成员但声明不正确。

   int year;  // default access specifier (for variable) is package not private  
   String name; /// default access specifier (for variable) is package not private

默认可见性称为“包”(尽管您不能使用此关键字),这意味着可以从该类所属的同一个包内访问该字段。 See more information here.

您在代码中隐藏变量,因此您可以使用下面的代码修复它们

 College(int year,String name){ 
        this.year=year; 
        this.name=name; 
  }