初學java,面對著這個static修飾符,愣是琢磨了兩天時間,還在今天琢磨透了,現在將悟到的東西記錄下來: 1、static修飾符表示靜態修飾符,其所修飾的內容(變數、方法、代碼塊暫時學到這三種)統稱為靜態內容(靜態變數、靜態方法、靜態代碼塊) 2、靜態內容是與類相關的內容。解釋:靜態變數在類載入 ...
初學java,面對著這個static修飾符,愣是琢磨了兩天時間,還在今天琢磨透了,現在將悟到的東西記錄下來:
1、static修飾符表示靜態修飾符,其所修飾的內容(變數、方法、代碼塊暫時學到這三種)統稱為靜態內容(靜態變數、靜態方法、靜態代碼塊) 2、靜態內容是與類相關的內容。解釋:靜態變數在類載入時就會被分配記憶體空間,而且只會被分配一次,也就是說靜態變數對類內部是共用的,大家都可以去調用訪問它,只要在一個調用里改變了它的值,那麼所有調用內部的值全部都會被改變。靜態方法也是在類載入時就分配了入口地址,而且所有的方法都可以調用它(在不創建對象的前提下)。靜態代碼塊會在類載入時執行一次,且僅僅執行一次。 3、這裡針對靜態內容,介紹一下非靜態內容,作為對比。非靜態變數必須在創建對象之後,才會在記憶體中分配空間,此時才能被調用,非靜態方法會在創建對象之後才能利用對象點取調用(即以“對象名.方法()”調用),非靜態代碼塊則在每次創建對象時執行一次,而且是優先執行。這些非靜態內容都是與對象相關的內容,都需要在擁有對象之後才能使用,這是與靜態內容最基本的區別。 4、現在說說具體的調用細則:所有的靜態方法或變數可以被本類或異類中的靜態或非靜態方法以“類名.變數名”和“類名.方法名()”的格式調用,甚至在本類中調用時,可以省略掉“類名.”,而直接調用,而且堅守【一處改變,處處改變】的原則。 5、所有的非靜態變數或方法都可以被本類或異類中的靜態或非靜態方法以“先創建類的實例對象後,用‘對象名.變數名’和‘對象名。方法名()’”的格式調用,甚至在本類中的非靜態方法中可以省略對象實例化過程而直接調用(警告:此處的直接調用與省略調用所調用的變數或方法是不同的,他們在記憶體中存放在不同的位置,新建對象的內容在對象區域,而直接調用的話是直接對類的屬性本值進行操作) 下麵是試驗代碼,(可以直接複製到你的編輯器中試運行):(代碼中部分註釋為測試內容,可去掉註釋查看是否正確)
1 /**
2 * 不區分本類還是異類,在靜態成員被調用必須以類名點取調用,非靜態成員必須創建累的實例去調用
3 * 區別:
4 * 1、靜態成員的調用:
5 * 在本類(靜態與非靜態方法)中調用可以省略類名點,直接調用(此處無論是哪裡的調用只要改變了屬性的值,那麼所有的調用都會改變,因為他們都指向記憶體中的同一個地址)
6 * 2、非靜態成員的調用:
7 * 在本類的非靜態方法中調用可以省略實例對象的創建,直接調用(這樣寫不會報錯,但是與創建對象再用對象命點用所指向的內容不同了,因為他們指向記憶體中的不同地址)
8 */
9 package com.test;
10
11 public class StaticTest{
12 int a = 1;
13 static int b = 2;
14 //非靜態方法
15 void testa(){
16 System.out.println("一類中的非靜態方法");
17 //試驗同一類中非靜態方法調用靜態與非靜態變數(方法的調用與變數一樣)
18
19 //調用本類靜態變數(此處省略了類名點取)
20 StaticTest.b = 12;
21 System.out.println(b);//省略類名點取
22
23 //調用本類非靜態變數
24 //此處可以以創建實例對象的方式調用a變數,但是這樣的話這裡的a就與直接調用a不同了,前者指的是新建對象的屬性a,後者則是類的a屬性
25 // StaticTest m = new StaticTest();
26 // m.a = 11;
27 // a = m.a;
28 a = 11;
29 System.out.println(a);
30
31 //調用異類靜態變數(此處直接調用會報錯)
32 // b2 = 14;//報錯
33 Qita.b2 = 14;
34 System.out.println(Qita.b2);
35
36 //調用異類非靜態變數(此處直接調用會報錯)
37 // a2 = 13;//報錯
38 Qita x = new Qita();
39 x.a2 = 13;
40 System.out.println(x.a2);
41 }
42 static void testb(){
43 System.out.println("一類中的靜態方法");
44 //試驗同一類中非靜態方法調用靜態與非靜態變數(方法的調用與變數一樣)
45
46 //調用本類靜態變數
47 StaticTest.b = 22;
48 System.out.println(b);//此處省略類名點
49
50 //調用本類非靜態變數
51 StaticTest y = new StaticTest();
52 y.a = 21;
53 System.out.println(y.a);
54
55 //調用異類靜態變數
56 Qita.b2 = 24;
57 System.out.println(Qita.b2);
58
59 //調用異類非靜態變數
60 Qita x = new Qita();
61 x.a2 = 23;
62 System.out.println(x.a2);
63 }
64 public static void main(String[] args) {
65 //靜態方法調用本類中的非靜態方法
66 StaticTest z = new StaticTest();
67 z.testa();
68
69 //靜態方法中調用本類中靜態方法
70 testb();
71 }
72 }
73 class Qita{
74 int a2 = 3;
75 static int b2 = 4;
76 void testa2(){
77 System.out.println("二類中的非靜態方法");
78 }
79 static void testb2(){
80 System.out.println("二類中的靜態方法");
81 }
82 }