2013-05-26 106 views
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對象引用能夠訪問私有數據成員direcly

這是怎麼? 據我所知,對象首先不能直接訪問私有數據成員。

回答

5

通過聲明如下:

year=year; 
name=name; 

...你是陰影的變量。

沒有您的變量相關的範圍,目前,無論是yearname的範圍是在構造函數中。你基本上是把它分配給它本身。

您有幾種選擇:

  • 使用this運營商 - this.year = year;
  • 用的東西前面加上他們重命名傳入變量名:

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

此外,在這個班級裏沒有任何私人領域。它們都被設置爲封裝私有的,根本沒有可見性修飾符。

如果您使用private修飾符指定了字段yearname,那麼您是對的;你必須使用getter來獲取變量值。

+2

靜態方法解決這些問題。這就是他爲什麼可以通過'main'訪問它們的原因。 – Steve

+0

這是一個對象。他直接從對象中提取值。這與調用getYear()無異。這不必被聲明爲「靜態」。此外,*沒有*任何私人領域。它們都是封裝私有的。 – Makoto

+0

@Steve,那些變量不是私有的,在java變量中有默認訪問說明符作爲包。 –

6

發生這種情況是因爲您在構造函數中隱藏了yearname字段。

二者必選其一:

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

或:

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

我更喜歡第一個選項。

順便說一下,這些字段不是私人的,因爲您沒有將它們聲明爲一個,並且默認爲package。 即使您將它們設置爲私有,屬於某個類的靜態方法也可以看到私有成員變量。

+0

thanx whoAmI,無論你是誰:) –

1

您必須使用

this.year = year 
this.name = name 

在構造 這樣便解決了問題:)

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