對象的引用變量是存在於棧區,而在堆區開闢了一塊內存空間,調用對象給成員變量賦的值的就存在於這塊空間中html
在每次new一個對象的都要調用同一個屬性的時候,會在堆區從新開闢一個內存空間,這樣就很浪費內存空間。這時候就引用了Static靜態變量java
上面圖中用static修飾的成員變量變成了一個共享的數據,單獨存在一塊區域,並且只會建立一次設計模式
static 數據類型屬性名; 安全
在Java中是能夠給屬性在定義的時候直接賦值的mvc
String name; //非靜態變量 static String country; //靜態變量,只被建立(初始化)一次
用static修飾的成員變量實現讓多個對象共享的數據,用來修飾成員變量框架
一個成員變量被static修飾就叫靜態成員變量,若是沒有修飾叫非靜態成員變量jvm
1.用對象進行訪問:函數
對象名.變量名工具
2.還能夠經過類名來訪問學習
類名.變量名
1.千萬不要認爲方便就將全部的變量都用static修飾,只有當數據真正須要共享時才須要用static修飾 2.只有靜態變量才能用類名方位,非靜態變量只能用對象訪問
3.局部變量不容許被static修飾。局部變量只能在調用方法裏面使用的,而static是須要共享時使用
static 來修飾方法 : 有一點點相似OC中的類方法
在OC的類方法中:1.只能用類名來調用 2.類中是不容許訪問屬性
1.能夠經過對象來訪問
對象.方法名();
2.能夠經過類名來訪問
類.方法名();
推薦使用類名調用。用來加以區分非靜態方法
public void study(){ //非靜態方法 eat(); //非靜態方法是能夠調用靜態的方法。 System.out.println(name+"正在學習"); } //用static 來修飾吃飯的方法,結構上就是在public後面多了一個static public static void eat (){ //靜態方法 //study(); 不容許調用非靜態方法。 sleep(); System.out.println(country+"正在吃飯"); }
1.靜態方法能夠用對象和類名調用。非靜態方法只能用對象來調用
2.靜態方法能夠訪問靜態的成員變量,但不可以訪問非靜態的成員變量。非靜態方法中能夠訪問任何成員變量。緣由:有可能靜態方法被調用了,可是對象尚未被建立出來
3.靜態方法能夠直接訪問靜態方法,可是不能訪問非靜態方法.非靜態方法是能夠訪問靜態方法。緣由:有可能靜態方法被調用了,可是對象尚未被建立出來 ,非靜態方法只能由對象調用。若是對象被建立出來,靜態方法早就存在內存中了
4.靜態方法中是不容許出現this關鍵字和super關鍵字
this : 表示一個方法調用者對象,可能對象沒有被建立出來
靜態的數據早於非靜態的數據存在內存中,在編譯字節碼文件(.class文件)的時候就存在
什麼狀況下使用static來修飾方法:
當一個方法不須要直接放在非靜態數據,這個時候就能夠用static修飾 (定義工具類)
1.public:用public來修飾,main主方法由jvm來調用的,jvm實際上也是一個程序,爲了保證jvm在任何狀況下調用主函數
2.static:若是沒有static,這個時候調用主方法就須要建立對象來調用,jvm若是建立對象不知道傳遞什麼參數的狀況下,爲了不麻煩,就將方法定義成靜態的,這時就不須要考慮對象,直接調用類名就能夠了
3.void:主函數是用jvm調用,返回值是給jvm,jvm接受沒有任何意義,全部不須要返回值
4.main:不是關鍵字,是約定好的入口
5.args:用來在程序運行時接受傳遞進來的參數
加強for循環,foreach循環。在OC中叫快速遍歷
for (String s : args) //沒有傳遞參數,能夠在運行時傳遞:java 類名 傳遞參數值 { System.out.println(s); //通常使用Scanner參數輸入值,在使用比較靈活 }
軟件行業中設計模式23種,在Java中會學到的設計模式有:
<1.單例設計模式
<2.觀察者設計模式
<3.模塊設計模式(mvc)
<4.裝飾設計模式
<5.工廠模式
設計模式:用來解決同一類問題的解決方案(固定步驟)
單例設計模式注意點:一個類只能建立出一個對象
+(SingleDog *)default{ //保證對象惟一 static SingleDog s; if(s == null){ s = [[SingleDo alloc] init]; } return s; }
步驟:
<1.建立一個對象把它設置成一個私有的靜態成員變量,保證對象的惟一性(用private來修飾)。
<2. 設置構造方法私有化(用private來修飾),防止new建立對象。 由於你在運行程序的時候,jvm會自動調用無參的構造方法
<3. 提供一個公開的靜態方法來接受惟一的對象,返回值爲本類中的對象(用public來修飾)
String name; int age; //保證對象惟一 // 聲明本類的引用變量, 而且把對象建立出來 private static SingleDog s = new SingleDog(); // 靜態的成員變量 //私有化構造方法 ,防止經過new來建立對象 private SingleDog(){} //提供一個靜態方法來接收惟一的對象 public static SingleDog getInstance (){ return s; }
這種寫法不安全,推薦使用餓漢單例加載模式
兩種單例設計模式在寫法上沒有什麼區別,前者是先賦值,後者是在要調用時賦值,後者是在調用時才加載,相似於OC中的懶加載
//------------懶漢單例設計模式-------------- //不安全 ,推薦使用上面的寫法。 class SingleDog2 { //聲明本類的引用變量,不建立 private static SingleDog2 s; //私有化一個構造方法 private SingleDog2() {}; //提供一個靜態的方法來接收惟一的對象 public static SingleDog2 getInstance(){ if(s==null){ s = new SingleDog2(); } return s; } }
封裝
繼承
多態
權限修飾符:
Public: 公共的,public修飾的成員變量和方法在任何地方均可以訪問,有訪問本類、同包、子類、其它包的權限
Private:私有的 private修飾的成員變量和方法只能在本類中訪問,只能在本類中訪問
Protected:受保護的 protected不能夠修飾類,有訪問本類、包、子類的權限
能夠經過反編譯驗證:javac –d . 文件名.java
若是正常顯示就說明能夠訪問
連接:http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html
<1.使用private修飾須要封裝的成員變量
<2.提供一個公開的方法來訪問私有的屬性
經過set方法
命名規範:set屬性名();屬性的首字母要大寫
經過get方法
命名規範:get屬性名();屬性的首字母要大寫
<1.在OC中是能夠省略get的方法名,可是在Java中不能省略
<2.代碼書寫規範: java開發中通常類成員變量(屬性),都是封裝起來的
<3.不是全部的屬性都須要設置set和get方法,應根據具體狀況而定
在if判斷中,==比較的是地址,而比較字符串的內容與對象的比較用equals
在if中若是隻若是隻有一個判斷語句,能夠省略」{}」的,它也會自動執行下一步。而在C語言中就不能省略
封裝的Demo:
/*需求:需求學生類: name , sex 輸入合法值 判斷輸入的性別是否是合法值,不是就提示輸入合法的值 */ class Person { String name; private String sex; //封裝的前提是用private修飾的成員變量,只能在本類中使用 ; 若是外部要調用,經過get和set方法 private int age; public Person(String name, String sex) { this.name = name; if (sex.equals("男") || sex.equals("女")) { this.sex = sex; } else { System.out.println("請輸入合法的值");//提示輸入合法的值 } } //設置器方法 public void setSex(String sex) { // 注意:在get方法中必定要有返回類型,不然會報錯 /*if (sex.equals("男") || sex.equals("女")) { this.sex = sex; } else { System.out.println("請輸入合法的值"); }*/ } //訪問器方法 能夠在返回值不添加內容,可是必定要在get方法中有返回值,並且get方法名不能省略 public String getSex() { return sex; } public void study() { System.out.println(name + "在學習"); } //獲取age的屬性值 public void setAge(int age) { //this.age = age; } } class Demo8 { public static void main(String[] args) { Person p = new Person("張三瘋", "不男不女"); p.study(); System.out.println(p.getSex()); } }