先前看到一個技術大牛寫了一個關於靜態成員與非靜態成員,靜態方法和非靜態方法的各自區別,覺得挺好的,在這裡寫一個小程序來說明這些區別。
package com.liaojianya.chapter5; /** * This program will demonstrate the use of static method. * @author LIAO JIANYA * */ public class StaticTest { public static void main(String[] args) { System.out.println("用對象調用非靜態方法"); MyObject obj = new MyObject(); obj.print1(); System.out.println("用類調用靜態方法"); MyObject.print2(); } } class MyObject { private static String str1 = "staticProperty"; private String str2 = "nonstaticProperty"; public MyObject() { } public void print1() { System.out.println(str1);//非靜態方法可以訪問靜態域 System.out.println(str2);//非靜態方法可以訪問非靜態域 print2();//非靜態方法可以訪問靜態方法 } public static void print2() { System.out.println(str1);//靜態方法可以訪問靜態域 // System.out.println(str2); //靜態方法不可以訪問非靜態域 // print1();//靜態方法不可以訪問非靜態方法 } }
輸出結果:
用對象調用非靜態方法 staticProperty nonstaticProperty staticProperty 用類調用靜態方法 staticProperty
該注釋部分如果去掉注釋符號,就會兩個報錯:
第一個注釋去掉後引起的錯誤1:
Cannot make a static reference to the non-static field str2
第二個注釋去掉後引起的錯誤2:
Cannot make a static reference to the non-static method print1() from the type MyObject
結論:靜態的方法不能訪問非靜態的成員變量;靜態的方法同樣不能訪問非靜態的方法。
其實就是一句話:靜態的不能訪問非靜態的,而非靜態的可以訪問靜態的並且可以訪問非靜態的。
同時:靜態的方法是可以通過類名來直接調用,無需對象調用,從而減少了實例化的開銷。