javaSE - 004 - 面向?qū)ο?/h2>

面向?qū)ο蟮娜筇卣?/h1>

1.封裝
2.繼承
3.多態(tài)

封裝注意點:

1.封裝就是將抽象的數(shù)據(jù)組裝起來,構(gòu)成class類.

2.屬性需要定義在類中,又叫做成員變量; 而定義在方法中的變量叫做局部變量。

3.局部變量使用前必須要聲明并賦初值;成員變量使用前必須要聲明,但可以不賦初值。

4.成員變量與局部變量的聯(lián)系與區(qū)別:
a) 無論是成員變量還是局部變量,使用前都需要聲明(定義)。
b) 對于局部變量來說,使用前必須要初始化;對于成員變量來說,使用前可以不初 始化。如果沒有初始化成員變量就開始使用,那么每個類型的成員變量都有一個 默認(rèn)的初始值
i. byte、short、int、long 類型的初始值為 0
ii. float、double 類型的初始值為 0.0
iii. char 類型的初始值‘\u0000’
iv. boolean 類型的初始值為 false

5.如果一個類包含了屬性與方法,那么該類的每一個對象都具有自己的屬性,但無論一個 類有多少個對象,這些對象共享同一個方法(放在代碼區(qū))。

6.關(guān)于方法參數(shù)傳遞的總結(jié):對于 Java 中的方法參數(shù)傳遞,無論傳遞的是原生數(shù)據(jù)類型 還是引用類型,統(tǒng)一是傳值(pass by value)。

7.什么類型的引用就能指向什么類型的對象,比如 People 類型的引用就能指向 People 類 型的對象,但不能指向 Student 類型的對象。比如:

 People people = new People(); // 正確
 People people = new Student(); //錯誤  

8.構(gòu)造方法(Constructor) :構(gòu)造方法用于完成對象屬性的初始化工作,構(gòu)造方法的特點:
a) 構(gòu)造方法的名字必須與類名完全一致(包含大小寫)
b) 構(gòu)造方法沒有返回值,連 void 也不能出現(xiàn)。
c) 如果在定義一個類的時候,沒有為類聲明構(gòu)造方法,那么 Java 編譯器會自動為類 添加一個沒有參數(shù)且方法體為空的構(gòu)造方法(默認(rèn)的構(gòu)造方法)
d) 如果在定義一個類的時候,為類聲明了構(gòu)造方法,那么 Java 編譯器就不會再為類 添加構(gòu)造方法了。
e) 不能顯式調(diào)用類的構(gòu)造方法,構(gòu)造方法通常是通過 new 關(guān)鍵字隱式調(diào)用。

public class People {
    public String name;
    public int  age;
    People(String name,int age){
        this(name);//構(gòu)造方法之間的調(diào)用,只能寫在構(gòu)造方法第一行,普通的方法重寫的調(diào)用父類的沒有這個限制
        this.age = age;
    }
    People(String name){
        this.name = name;
    }
    public static void main(String[] arges){
        People  p=new People("elese",26);
        System.out.println(p.name);
        System.out.println("test");
    }
}

9.new 關(guān)鍵字在生成對象時完成了三件事情:
a) 為對象開辟內(nèi)存空間。
b) 調(diào)用類的構(gòu)造方法。
c) 將生成的對象的地址返回。

10.默認(rèn)的構(gòu)造方法:構(gòu)造方法沒有參數(shù)且方法體為空。

11.使用 new 來生成對象的時候,后面的小括號()表示構(gòu)造方法的參數(shù)列表,如果構(gòu)造方法 不接收參數(shù),那么小括號中的內(nèi)容為空;如果構(gòu)造方法接收參數(shù),那么小括號中的實際 參數(shù)就需要與構(gòu)造方法定義中的形式參數(shù)保持一致(參數(shù)數(shù)量一致、參數(shù)類型一致、按 照順序逐一賦值)。

12.方法重載
a).方法名字相同,參數(shù)個數(shù)和類型不同的方法叫重載。返回值沒有影響

public void change(int a,int b){
       System.out.println("int change");
   }
   public void change(int a,int b,int c){
       System.out.println("int3 change");
   }
   public int change(int a,float b){
       System.out.println("float change");
       return 2;
   }
這三個方法都是重載方法

繼承

public class test {

    public static void main(String[] args) {
          System.out.print(new Apple(2.3).price);
    }

}

class Fruit{
    public double price;
    Fruit(){
        System.out.println("Fruit");
    }
    Fruit(double price){
        System.out.println("Fruit price");
        this.price = price;
    }
}
class Apple extends Fruit{
    Apple(double price) {
        super(price);//和this一樣,必須填寫在第一行
        System.out.println("apple");
        this.price = 2.4;
    }
}
輸出結(jié)果:
Fruit price
apple
2.4
繼承注意點

1.當(dāng)一個類沒有構(gòu)造方法的時候,系統(tǒng)會默認(rèn)添加一個無參構(gòu)造方法。如果有構(gòu)造方法,系統(tǒng)將不會添加構(gòu)造方法
2.構(gòu)造方法之間的關(guān)系必定的方法的重載
3.繼承后,子類的構(gòu)造方法中如果沒有顯示調(diào)用父類的構(gòu)造方法,將隱士調(diào)用父類的無參構(gòu)造方法(如果某種原因不存在)將會編譯出錯
4.子類顯示調(diào)用父類構(gòu)造方法的時候super必須寫在構(gòu)造方法的第一行
13.方法重寫,發(fā)生在子類與父類之際

多態(tài)

定義:子類就是父類(玫瑰花是花,男人是人),多態(tài)的意思就是:父類引用指向子類對象。(說白了就是父類引用指向子類對象的時候編譯器讓你編譯通過而已。向上轉(zhuǎn)型。如果向下轉(zhuǎn)型編譯器不讓通過而已,強(qiáng)制轉(zhuǎn)換就可以蒙混編譯器)


public class test {

 public static void main(String[] args) {
  //多態(tài),向上轉(zhuǎn)型(就是保證了,轉(zhuǎn)型后調(diào)用的不會出錯)
  Fruit f = new Apple();
  f.getColor();
  //向下轉(zhuǎn)型(swift的概念,這個概念能成功的依據(jù)就是保證向下轉(zhuǎn)型的對象本身就是能轉(zhuǎn)型成這個的對象,如果向下轉(zhuǎn)型的對象,不是期望轉(zhuǎn)型的對象就會出錯)
  Object o = new Apple();
  Apple a = (Apple)o;
  a.getColor();
 }

}

class Fruit{
 public void getColor(){
  System.out.println("getColor");
 }
}
class Apple extends Fruit{
 public void getPrice(){
  System.out.println("getPrice");
 }
}

抽象類

// 抽象類
abstract class AbstractTest{
 int a;
 void go(){
  
 }
 abstract void run(); //抽象方法
}

warning:
1.具有抽象方法的類,稱為抽象類
2.抽象類不能是實例化,只能用于繼承
3.有抽象方法之說,沒有抽象屬性之說,其他的和普通類無異
4.子類繼承抽象類,子類必須實現(xiàn)抽象類中的所有抽象方法,否則就將子類定義為抽象方法

接口(interface)

//接口的定義,因為類只能繼承一個,那么接口就運(yùn)用而生,一個類可以實現(xiàn)多個接口
interface run{
 static final String str = "liyang";
 int a = 0; //默認(rèn)的都是static final的
 void fun(); //默認(rèn)的都是抽象方法,可以省略abstract
}

static 關(guān)鍵字

public class test {
   public static void main(String[] args) {
    animal.run();   //類直接調(diào)用
    new animal().run(); //對象直接調(diào)用
   animal a = null;
    a.run(); // 輸出為lilei,那么可以推斷靜態(tài)方法和靜態(tài)屬性都是根據(jù)引用類型來調(diào)用的
   }
}
class animal {
   static String name =  "lilei"; //類屬性,所有類對象共有,放在靜態(tài)常量區(qū),而非堆棧區(qū)
   static void run(){    //類方法(里面只能訪問類屬性)
      System.out.println(name); 
   }
}
warning:靜態(tài)方法只能被繼承不能被重寫

1.靜態(tài)代碼塊

public class test {
 public static void main(String[] args) {
   new P();
   new P();
 }
}
class P{
 int c =getC();
 static int a=getA();
 static {
  System.out.println("static Code");
 }
 static int b=getB();
 static int getA(){
  System.out.println("getA");
  return 2;
 }
 
 static int getB(){
  System.out.println("getB");
  return 2;
 }
 
 int getC(){
  System.out.println("getC");
  return 2;
 }
 P(){
  System.out.println("P Constructor");
 }
}
輸出結(jié)果:
getA
static Code
getB
getC
P Constructor
getC
P Constructor
總結(jié):
1.java文件先被編譯成class文件,切java文件和class文件不是一一對應(yīng)的,一個java文件可以對應(yīng)N個class,一個class文件代表一個類
2.類(class)在被使用的時候,首先將class文件加載到JVM虛擬機(jī),執(zhí)行將該類的靜態(tài)變量初始化和執(zhí)行靜態(tài)代碼塊,切執(zhí)行順序是從上到下執(zhí)行,只會在被加載的時候執(zhí)行一次

3.成員變量的初始化會優(yōu)先于構(gòu)造方法的初始化,沒有給值就是默認(rèn)值,從getC()可以看出
4.執(zhí)行構(gòu)造方法,構(gòu)造方法中,再將其修改為指定的值,這是慣用手法

final關(guān)鍵字

  • final可以修飾類,屬性和方法
    1.修飾類,類就不可被繼承
    2.修飾屬性,屬性就不可被修改,相當(dāng)于常量
    a).聲明的時候賦值
    b).構(gòu)造方法里賦值
    3.修飾方法,那么方法就不能被重寫

訪問修飾符

  • 簡述:
    1.public (任何地方都可以使用)
    2.protected(受保護(hù)的,可以在子類中使用)
    3.private(私有的,只有在該類內(nèi)部使用)
    4.default(不加任何修飾符,就是包權(quán)限,只能在相同包下類似public的權(quán)限)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容