Java:【面向對象:類的定義,靜態變量,成員變量,構造函數,封裝與私有,this】


本文內容:

  • 什麼是面對對象
  • 類的定義與對象實例化
  • 成員變量
    • 成員變量的有效範圍
    • 成員變量的賦值
  • 靜態變量、方法與實例變量、方法
  • 構造函數
  • 封裝與私有
  • this關鍵字

 

注:函數和方法是同樣東西。【因爲我以前學習的時候有些書籍不是一樣的說法,書看多了,我就習慣了不一樣狀況下用不一樣的說法】java

 

首發時間:2018-03-22安全


什麼是面對對象:

 

  • 面向對象強調行爲處於對象之中,並不直接執行行爲,而是經過對象執行行爲
  • 類是對象的抽象,對象是類的具體實例。 【能夠說,人是一個類,而不一樣身份的你我他是一個具體實例。人這個類抽象出了咱們人類共有的屬性,而咱們人是人類的各類屬性的具體實例結果。】
  • 面向對象的基本特徵:封裝,繼承,多態
    • 封裝:好比一個對象把它的屬性和方法都封裝起來的話,它執行的屬性和方法都是這個對象的,而不是其餘對象的。
    • 繼承:子類能夠繼承父類的屬性和方法。好比「人類」繼承了「哺乳類」的屬性和方法,又增添人類獨有的屬性和方法。
    • 多態:一種多態是指同一個操做被不一樣對象執行時有不一樣的結果(好比:狗的say是「汪汪汪」,而貓的是"喵喵喵");另外一種多態是根據對象的傳入而決定執行不一樣的方法。【本質上這兩個是同樣的】

 


類的定義與對象實例化:

 

類的定義:

  • 類的定義包括兩部分:類聲明和類體
  • 類是java程序的基本要素
  • 定義類的格式:image
    • 修飾符能夠是public 或空: public表明即便不一樣包也能訪問該類;而空表明只能該類只能在同一個包內訪問。
    • 類體的內容包括變量的生命和方法的定義。【因此單獨的定義是錯誤的,只能聲明並同時定義】
      • image
      • image

 

對象實例化

  • 類的實例化就是建立一個對象:
    • 建立對象:類名 變量名 =new 類名()【類名()能夠傳入一些參數來初始化對象,由類的同名方法(構造方法,下面講)定義能傳入什麼參數】
      • image
      • 匿名對象:簡單來講就是沒有變量名的實例化,直接使用new 類名()來執行操做,因爲沒有變量名來特異的標記一片內存空間,因此匿名對象通常只使用一次,好比new Dog().hello();
    • 調用方法或變量:對於實例方法或變量的能夠直接使用對象來調用;而對於靜態方法或變量,既可使用對象,也可使用類來調用。
      • image
      • image

 

 


class Dog{
    String name;
    int foot=4;
    Dog(){//這是一個構造函數
        this.name="旺財";
    }
    void hello() {
        System.out.println("hello,this is a dog");
    }
    static void static_hello() {
        System.out.println("hello,this is a dog too");
    }


}

public class Demo {

    public static void main(String args[]) {
        
        Dog d=new Dog();
        System.out.println(d.foot);//4
        d.hello();//hello,this is a dog
        d.static_hello();//hello,this is a dog too
        Dog.static_hello();//hello,this is a dog too
        
    }
}


        成員變量:

         

        成員變量的有效範圍

        • 成員變量在整個類範圍內有效,與變量聲明的位置無關。方法中的局部變量從聲明它的位置開始生效,而且只在方法體內有效。
        • 當局部變量跟成員變量同名時,若是想特別的使用成員變量,可使用「this.變量名」
        • 成員變量有默認值,而局部變量沒有默認值。

         

        成員變量的賦值:

        • 可使用構造函數來對一些成員變量初始化
        • 若是成員變量不是私有的,也能夠直接取得變量名來賦值,好比dog.age=18


        靜態變量、方法與實例變量、方法:

         

        根據變量、方法是否有static修飾能夠分爲實例變量,實例方法和靜態變量(類變量),靜態方法(類方法)函數

         

        • 靜態變量,靜態方法:

          • 被static修飾的成員的特色:學習

            • 隨着類的加載而加載,優先於對象存在,靜態成員內存位於方法區this

            • 被全部對象所用享【因此可稱爲類變量或類方法】spa

            • 能夠直接類名調用3d

            • 靜態方法只能訪問靜態成員code

            • 靜態方法中不能夠寫this,super關鍵字對象

         

        • 實例變量、實例方法:

          • 實例變量、實例方法是對象的變量和方法,對象操做變量或方法也只是操做本身的變量或方法,不會影響其餘對象。

         

        實例變量\方法跟靜態變量\方法的區別比如:「泰迪狗類」好比有一個共有屬性「狗種類名」,那麼這個屬性應該是全部泰迪狗都有的,而且是泰迪狗共享的,若是某一天人類想改泰迪狗的種類名稱,那麼應該是全部泰迪狗都改的(靜態的);而每一隻泰迪狗都有本身的主人,這是由每一隻狗自身決定的,因此這是特有屬性,即便這隻狗換了主人,也不會影響別的狗。(實例的)blog

         

         

         


        構造函數:

        • 構造函數是類中的一種特殊函數,構造函數的名字與類的名字相同,並且沒有類型。
        • 構造函數負責對類對象的特定屬性初始化。【好比每一隻狗對象都有不一樣的名字,而狗類是一個模板,是沒有名字的,而構造函數能夠作到給狗定義名字。】
        • 類中能夠有多個構造函數,它們以函數重載的方式存在。
        • 構造函數是沒有類型的,是直接以「 類名(){}」 做爲函數。
        • 類中會默認有一個無參數的構造函數,若是定義了其餘構造函數,那麼這個默認的無參構造函數就會不默認存在了。

         

         

        
        class Dog{
            String name;
            Dog(){
                this.name="旺財";
            }
            Dog(String name){
                this.name=name;
            }
        }
        public class Init_usage {
        
            public static void main(String args[]) {
                
                Dog d3=new Dog();
                Dog d4=new Dog("小菜");
                System.out.println(d3.name);
                System.out.println(d4.name);
            }
        }

         

        補充:

        • 構造函數之間能夠相互調用,但要防止遞歸調用。
          • image
          • image
          • 調用其餘構造函數來實現初始化在有多個變量須要初始化的時候有明顯的代碼節省。

         

         

         

         


        封裝與私有:

         

        • 類的封裝的一個體現是變量和函數的私有化
        • 封裝的準則:
          • 將不須要對外提供的內容都隱藏起來。
          • 將屬性都隱藏,提供公共方法對其訪問。
        • 私有化使類的非公共屬性隱藏了起來,好比一個「人類」對象有本身的資產,通常只有本身才能知道本身有多少資產,而且不想直接給別人看到,但若是別人問題,仍是會告訴別人的(隱藏了本身的資產狀況,可是本身可以使用方法得到結果,這個方法是開放的,調用就是至關於別人問)。
        • 可使用private來使變量和函數私有化,這樣以後不能直接使用 對象.變量 或 對象.函數 來調用,只有對象內部的方法才能調用
        • 將變量或方法私有化以後,通常對外提供getXXX,setXXX方法進行訪問,提升數據訪問的安全性。

         

        
        class Man{
            private int money;
            String name;
            Man(String name,int money){
                this.name=name;
                this.money=money;
            }
            int getmoney(){
                return money;
            }
            void setMoney(int money){
                this.money=money;
            }
        
            
            
        }
        
        public class Private_usage {
        
            public static void main(String[] args) {
                Man m=new Man("lilei",2000);
                System.out.println(m.name);//lilei
        //        System.out.println(m.money);//報錯的,由於私有了,不能訪問
        //        System.out.println(m.wife);//報錯的,由於私有了,不能訪問
                System.out.println(m.getmoney()); //2000
                m.setMoney(6000);
                System.out.println(m.getmoney());//6000
        
            }
        
        }


        this關鍵字:

         

        • this表明當前對象(調用函數時表明當前調用該函數的對象),好比在類中可使用this.XXX來調用對象本身的變量或方法。
        • 當局部變量和成員變量同名時,能夠用this關鍵字區分,this.XXX表明使用對象自身的變量
        • 類中的成員變量默認是帶有this前綴的,但遇到同名時必須加以區分。

        • this加上參數列表(this(參數))的方式就是訪問本類中符合該參數的構造函數

        • 用於調用構造函數的this語句必須放在第一行,由於初始化動做要優先執行

         

        class Person{
            String name;
            int age;
            Person(String name,int age){
                this.name=name;
                this.age=age;
            }
            void hello() {
                this.sysprint();
        //        sysprint();
            }
            void sysprint() {
                System.out.println("hello world!");
            }
        }
        
        public class This_usage {
            public static void main(String args[]) {
                Person p1=new Person("lilei",18);
                p1.hello();//hello world!
                
            }
        
        }
        相關文章
        相關標籤/搜索