1. 程式人生 > >Java中的null物件也可以訪問static成員變數和方法

Java中的null物件也可以訪問static成員變數和方法

      一般來說,一個類的物件要在例項化之後才可以訪問類中的成員變數和方法。如果它還是null,通常意義上我們就認為它不能訪問類中的成員。實際上確實不提倡這樣,而且null物件確實不能訪問例項成員(變數和方法),否則會引發NULLPointerException錯誤。但是要注意的一點是:即使是null物件,也可以訪問類成員。看下面一段程式碼的輸出結果即知。

import java.util.*;

public class Apple
{
  public static int weight=300;
  
  public static void print()
  {
    System.out.println("Weight is "+String.valueOf(weight));
  }
  public static void main(String[]args)
  {
    Apple apple=null;
    System.out.println(apple.weight);
    apple.print();
  }
}
輸出結果如下圖所示:

(注:csdn網站伺服器好像出了點小問題,這會兒圖片一直提交不上去,所以等它恢復了再追加吧,下面直接說執行結果。有興趣的小夥伴不妨自己去驗證一下。)

     剛剛發現圖片可以上傳了,下面是輸出結果。

     

        執行結果不但沒出現NULLPointerException錯誤,還輸出了“300”及“Weight is 300",這說明null物件apple可以呼叫類成員(即static成員)。

      而這顯然是違揹我們平常的使用習慣的,因而在C#中就乾脆規定只有類才能呼叫類成員變數,物件只能呼叫例項成員(雖然很多人都說C#是抄襲Java的,但是不得不說在某些方面它做得更好)。

       即使是針對Java,也有許多人在討論是否將物件可以訪問類成員這一功能取消掉,因為這個功能有時確實會給人帶來困擾。

      遠的不說,就舉一個最近我經歷的例子,前幾天我在走讀專案的程式碼時,發現有一個地方將物件初始化為null之後,馬上就讓其呼叫一個方法,我當時就覺得很奇怪,還以為是同事犯錯了呢,後來經過溝通才知道。雖然這種做法是沒錯,但是顯然會使程式碼不利於他人走讀,從這方面來說並不是一個好的編碼習慣。所以現在在團隊裡大家就約定類方法就用類來呼叫,而例項方法用物件來呼叫(當然這個不會犯錯,因為類也沒法呼叫例項方法)。