1. 程式人生 > >靜態與非靜態的變數和方法

靜態與非靜態的變數和方法

靜態方法:屬於類本身。

非靜態方法:屬於類生成的每個物件。

如果一個方法與依賴於類的個別特徵,應該保持靜態。否則應該定義為非靜態。

public class MethodDemo {

	public static void main(String[] args) {
		ClassA c = new ClassA(10);
		System.out.println(c.noStaticMethod());
		ClassA.staticMethod();
		// c.staticMethod();
		// 也能呼叫不過會引發歧義,有可能會誤認為這個方法屬於物件

	}

}

class ClassA {
	private int i;

	public ClassA(int i) {
		this.i = i;
	}

	public static void staticMethod2() {
		System.out.println("staticMethod2");
	}

	public static void staticMethod() {
		staticMethod2();// 靜態方法可呼叫靜態方法
		// this.noStaticMethod();靜態方法不能呼叫非靜態方法
		System.out.println("staticMethod");
	}

	public int noStaticMethod() {
		ClassA.staticMethod();// 非靜態方法可呼叫靜態方法
		return i + 1;
	}
}

靜態變數與非靜態變數定義類似。

public class Var_Demo {

	public static void main(String[] args) {
		System.out.println(Person.eyeNum);// 0
		Person p = new Person();
		p.name = "jack";
		// p.eyeNum = 2;物件也可訪問類變數
		Person.eyeNum = 2;
		Person p2 = new Person();
		System.out.println(p.eyeNum + " " + p2.eyeNum);
	}

}

class Person {
	String name;
	static int eyeNum;// 靜態變數系統預設賦初值
}

成員變數與區域性變數同名時

public class Var_Demo2 {
	private static int a = 100;

	public static void main(String[] args) {
		int a = 50;
		System.out.println(a);
		System.out.println(Var_Demo2.a);
		// 區域性變數與成員變數同名,成員變數會被覆蓋(引用型別也一樣)

	}

}

變數使用規則

  • 描述某個類中的固有資訊,使用成員變數。若這個屬性為物件共有的相同屬性這定義為靜態變數。不相同的值則使用例項變數
  • 儲存該類或例項執行的狀態資訊使用成員變數
  • 某個資訊需要在某個類的多個方法中共享,使用成員變數