0
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

4 回答 4

6

发生这种情况是因为您在构造函数中使用了阴影yearname字段。

使用任一:

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

或者:

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

我更喜欢第一个选项。

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

于 2013-05-26T07:54:18.810 回答
5

通过声明:

year=year; 
name=name;

...你正在隐藏你的变量。

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

你有几个选择:

  • 使用this运算符 -this.year = year;
  • 通过在它们前面加上一些东西来重命名传入的变量名称:

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

此外,此类中没有任何私有字段。它们都设置为包私有,这根本不是可见性修饰符。

如果您已指定字段yearname使用private修饰符,那么您是对的;您必须使用 getter 来检索变量值。

于 2013-05-26T07:53:33.997 回答
1

你必须使用

this.year = year 
this.name = name 

在构造函数中,这将解决问题:)

于 2013-05-26T07:54:45.593 回答
1

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

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

默认可见性称为“包”(尽管您不能使用此关键字),这意味着可以从类所属的同一包中访问该字段。 在此处查看更多信息。

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

 College(int year,String name){ 
        this.year=year; 
        this.name=name; 
  } 
于 2013-05-26T08:38:46.503 回答