Java學習筆記(05)

目錄:

  • static的用法
  • 主函數的定義
  • 加強for的循環
  • 單例設計模式
  • 封裝

一.Static的用法

1.對象的內存分析

對象的引用變量是存在於棧區,而在堆區開闢了一塊內存空間,調用對象給成員變量賦的值的就存在於這塊空間中html

 

在每次new一個對象的都要調用同一個屬性的時候,會在堆區從新開闢一個內存空間,這樣就很浪費內存空間。這時候就引用了Static靜態變量java

 

上面圖中用static修飾的成員變量變成了一個共享的數據,單獨存在一塊區域,並且只會建立一次設計模式

 

2.static修飾成員變量

<1.語法

static 數據類型屬性名;      安全

Java中是能夠給屬性在定義的時候直接賦值的mvc

String name; //非靜態變量
static String country;  //靜態變量,只被建立(初始化)一次

 

<2.做用

static修飾的成員變量實現讓多個對象共享的數據,用來修飾成員變量框架

一個成員變量被static修飾就叫靜態成員變量,若是沒有修飾叫非靜態成員變量jvm

 

<3.靜態成員變量的訪問方式

            1.用對象進行訪問:函數

                 對象名.變量名工具

           2.還能夠經過類名來訪問學習

                 類名.變量名

 

<4.使用注意點:

        1.千萬不要認爲方便就將全部的變量都用static修飾,只有當數據真正須要共享時才須要用static修飾                      2.只有靜態變量才能用類名方位,非靜態變量只能用對象訪問

    3.局部變量不容許被static修飾。局部變量只能在調用方法裏面使用的,而static是須要共享時使用

3.Static修飾方法

static 來修飾方法 : 有一點點相似OC中的類方法

在OC的類方法中:1.只能用類名來調用 2.類中是不容許訪問屬性

1.訪問方式:

             1.能夠經過對象來訪問

                 對象.方法名();

           2.能夠經過類名來訪問

                類.方法名();

推薦使用類名調用。用來加以區分非靜態方法

public void study(){ //非靜態方法
            eat(); //非靜態方法是能夠調用靜態的方法。
     System.out.println(name+"正在學習");
}
    //用static 來修飾吃飯的方法,結構上就是在public後面多了一個static
public static void eat (){   //靜態方法
    //study(); 不容許調用非靜態方法。
    sleep();
    System.out.println(country+"正在吃飯");
}

 

2.static修飾方法的使用注意點:

         1.靜態方法能夠用對象和類名調用。非靜態方法只能用對象來調用

         2.靜態方法能夠訪問靜態的成員變量,但不可以訪問非靜態的成員變量。非靜態方法中能夠訪問任何成員變量。緣由:有可能靜態方法被調用了,可是對象尚未被建立出來

 

         3.靜態方法能夠直接訪問靜態方法,可是不能訪問非靜態方法.非靜態方法是能夠訪問靜態方法。緣由:有可能靜態方法被調用了,可是對象尚未被建立出來 ,非靜態方法只能由對象調用。若是對象被建立出來,靜態方法早就存在內存中了

         4.靜態方法中是不容許出現this關鍵字和super關鍵字

                            this : 表示一個方法調用者對象,可能對象沒有被建立出來

 

3.特色 :

靜態的數據早於非靜態的數據存在內存中,在編譯字節碼文件(.class文件)的時候就存在

 

什麼狀況下使用static來修飾方法:

                 當一個方法不須要直接放在非靜態數據,這個時候就能夠用static修飾 (定義工具類)

                           

 

二.主函數的定義

1.public用public來修飾,main主方法由jvm來調用的,jvm實際上也是一個程序,爲了保證jvm在任何狀況下調用主函數

2.static:若是沒有static,這個時候調用主方法就須要建立對象來調用,jvm若是建立對象不知道傳遞什麼參數的狀況下,爲了不麻煩,就將方法定義成靜態的,這時就不須要考慮對象,直接調用類名就能夠了

3.void主函數是用jvm調用,返回值是給jvm,jvm接受沒有任何意義,全部不須要返回值

4.main:不是關鍵字,是約定好的入口

5.args用來在程序運行時接受傳遞進來的參數

 

 

三.加強for的循環

加強for循環,foreach循環。在OC中叫快速遍歷   

        for (String s : args)  //沒有傳遞參數,能夠在運行時傳遞:java 類名 傳遞參數值
        {
        System.out.println(s);   //通常使用Scanner參數輸入值,在使用比較靈活
    }

 

 

四.單例設計模式

1.設計模式

軟件行業中設計模式23種,在Java中會學到的設計模式有:

<1.單例設計模式

<2.觀察者設計模式

<3.模塊設計模式(mvc

<4.裝飾設計模式

<5.工廠模式

 

設計模式:用來解決同一類問題的解決方案(固定步驟)

單例設計模式注意點:一個類只能建立出一個對象

 

2.在OC中的單例:

+(SingleDog *)default{
        //保證對象惟一
        static SingleDog s;
        if(s == null){
          s = [[SingleDo alloc] init];
        }
        return s;
    }

 

3.Java中的單例

1.餓漢單例設計模式

步驟:   

<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;
        }
        

 

 

2.懶漢單例設計模式

這種寫法不安全,推薦使用餓漢單例加載模式

 兩種單例設計模式在寫法上沒有什麼區別,前者是先賦值,後者是在要調用時賦值,後者是在調用時才加載,相似於OC中的懶加載

//------------懶漢單例設計模式--------------
//不安全  ,推薦使用上面的寫法。
class SingleDog2 {
    //聲明本類的引用變量,不建立
    private static SingleDog2 s;
    //私有化一個構造方法
    private SingleDog2() {};
    //提供一個靜態的方法來接收惟一的對象
    public static SingleDog2 getInstance(){
        
        if(s==null){
            
            s = new SingleDog2();   
        }
        return s;
    }
}

 

 

五.封裝

1.面向對象的三大特徵

封裝

繼承

多態

 

2.三大特徵之一:封裝

      權限修飾符:

                 Public 公共的,public修飾的成員變量和方法在任何地方均可以訪問,有訪問本類、同包、子類、其它包的權限

                 Private:私有的  private修飾的成員變量和方法只能在本類中訪問,只能在本類中訪問

                 Protected:受保護的  protected不能夠修飾類,有訪問本類、包、子類的權限

 

能夠經過反編譯驗證:javac  –d  .  文件名.java  

若是正常顯示就說明能夠訪問

 

 

連接:http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html  

 

 

1.封裝步驟:

<1.使用private修飾須要封裝的成員變量

<2.提供一個公開的方法來訪問私有的屬性

                 經過set方法

                      命名規範:set屬性名();屬性的首字母要大寫    

                 經過get方法

                      命名規範:get屬性名();屬性的首字母要大寫   

 

2.使用注意點:

<1.OC中是能夠省略get的方法名,可是在Java中不能省略

<2.代碼書寫規範: java開發中通常類成員變量(屬性),都是封裝起來的

<3.不是全部的屬性都須要設置setget方法,應根據具體狀況而定

 

 

3.封裝的應用:

  1. 框架
  2. 工具類

 

4.封裝的好處:

  1. 提升數據的安全性
  2. 操做簡單
  3. 隱藏了方法的實現

 

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());
    }
}
相關文章
相關標籤/搜索