面向對象 (繼承)+JAVA學習筆記-DAY08

08.01_面向對象(代碼塊的概述和分類)(瞭解)(面試的時候會問,開發不用或者很少用)

  • A:代碼塊概述
    • 在Java中,使用{}括起來的代碼被稱爲代碼塊。
  • B:代碼塊分類
    • 根據其位置和聲明的不同,可以分爲局部代碼塊,構造代碼塊,靜態代碼塊,同步代碼塊(多線程講解)。
  • C:常見代碼塊的應用
    • a:局部代碼塊
      • 在方法中出現;限定變量生命週期,及早釋放,提高內存利用率
    • b:構造代碼塊 (初始化塊)
      • 在類中方法外出現;多個構造方法方法中相同的代碼存放到一起,每次調用構造都執行,並且在構造方法前執行
    • c:靜態代碼塊
      • 在類中方法外出現,並加上static修飾;用於給類進行初始化,在加載的時候就執行,並且只執行一次。
      • 一般用於加載驅動

08.02_面向對象(代碼塊的面試題)(掌握)

  • A:看程序寫結果
  • class Student {
        static {
            System.out.println("Student 靜態代碼塊");
        }
    
        {
            System.out.println("Student 構造代碼塊");
        }
    
        public Student() {
            System.out.println("Student 構造方法");
        }
    }
    
    class Demo2_Student {
        static {
            System.out.println("Demo2_Student靜態代碼塊");
        }
    
        public static void main(String[] args) {
            System.out.println("我是main方法");
    
            Student s1 = new Student();
            Student s2 = new Student();
        }
    }
    

結果:
Demo2_Student靜態代碼塊
我是main方法
Student 靜態代碼塊
Student 構造代碼塊
Student 構造方法
Student 構造代碼塊
Student 構造方法

08.03_面向對象(繼承案例演示)(掌握)

  • A:繼承(extends)
    • 讓類與類之間產生關係,子父類關係
  • B:繼承案例演示:
    • 動物類,貓類,狗類
    • 定義兩個屬性(顏色,腿的個數)兩個功能(吃飯,睡覺)
  • C:案例演示
    • 使用繼承前
  • D:案例演示
    • 使用繼承後

08.04_面向對象(繼承的好處和弊端)(掌握)

  • A:繼承的好處
    • a:提高了代碼的複用性
    • b:提高了代碼的維護性
    • c:讓類與類之間產生了關係,是多態的前提
  • B:繼承的弊端
    • 類的耦合性增強了。
    • 開發的原則:高內聚,低耦合
    • 耦合:類與類的關係
    • 內聚:就是自己完成某件事情的能力

08.05_面向對象(Java中類的繼承特點)(掌握)

  • A:Java中類的繼承特點
    • a:Java只支持單繼承,不支持多繼承。(一個兒子只能有一個爹)
      • 有些語言是支持多繼承,格式:extends 類1,類2,…
    • b:Java支持多層繼承(繼承體系)
  • B:案例演示
    • Java中類的繼承特點
      • 如果想用這個體系的所有功能用最底層的類創建對象
      • 如果想看這個體系的共性功能,看最頂層的類

08.06_面向對象(繼承的注意事項和什麼時候使用繼承)(掌握)

  • A:繼承的注意事項
    • a:子類只能繼承父類所有非私有的成員(成員方法和成員變量)
    • b:子類不能繼承父類的構造方法,但是可以通過super(馬上講)關鍵字去訪問父類構造方法。
    • c:不要爲了部分功能而去繼承
    • 項目經理 姓名 工號 工資 獎金
    • 程序員 姓名 工號 工資
  • B:什麼時候使用繼承

    • 繼承其實體現的是一種關係:”is a”。
      Person
      Student
      Teacher
      水果
      蘋果
      香蕉
      橘子

    採用假設法。
    如果有兩個類A,B。只有他們符合A是B的一種,或者B是A的一種,就可以考慮使用繼承。

08.07_面向對象(繼承中成員變量的關係)(掌握)

  • A:案例演示

    • a:不同名的變量
    • b:同名的變量

      class Father {
          int num1 = 10;
          int num2 = 30;
      }
      
      class Son extends Father {
          int num2 = 20;
      
          public void print() {
              System.out.println(this.num1);              //this既可以調用本類的,也可以調用父類的(本類沒有的情況下)
              System.out.println(this.num2);              //就近原則,子類有就不用父類的了
              System.out.println(super.num2);
          }
      }
      

08.08_面向對象(this和super的區別和應用)(掌握)

  • A:this和super都代表什麼
    • this:代表當前對象的引用,誰來調用我,我就代表誰
    • super:代表當前對象父類的引用
  • B:this和super的使用區別
    • a:調用成員變量
      • this.成員變量 調用本類的成員變量,也可以調用父類的成員變量
      • super.成員變量 調用父類的成員變量
    • b:調用構造方法
      • this(…) 調用本類的構造方法
      • super(…) 調用父類的構造方法
    • c:調用成員方法
      • this.成員方法 調用本類的成員方法,也可以調用父類的方法
      • super.成員方法 調用父類的成員方法

08.09_面向對象(繼承中構造方法的關係)(掌握)

  • A:案例演示
    • 子類中所有的構造方法默認都會訪問父類中空參數的構造方法
  • B:爲什麼呢?

    • 因爲子類會繼承父類中的數據,可能還會使用父類的數據。
    • 所以,子類初始化之前,一定要先完成父類數據的初始化。

    • 其實:

      • 每一個構造方法的第一條語句默認都是:super() Object類最頂層的父類。

        class Demo5_Extends {
            public static void main(String[] args) {
                Son s = new Son();
            }
        }
        
        class Father extends Object {
            public Father() {
                super();
                System.out.println("Father 的構造方法");
            }
        }
        
        class Son extends Father {
            public Son() {
                super();                            //這是一條語句,如果不寫,系統會默認加上,用來訪問父類中的空參構造
                System.out.println("Son 的構造方法");
            }
        }
        

        結果:Father 的構造方法
        Son 的構造方法

08.10_面向對象(繼承中構造方法的注意事項)(掌握)

  • A:案例演示
    • 父類沒有無參構造方法,子類怎麼辦?
    • super解決
    • this解決
  • B:注意事項
    • super(…)或者this(….)必須出現在構造方法的第一條語句上

08.11_面向對象(繼承中的面試題)(掌握)

  • A:案例演示

  • 看程序寫結果1
    class Fu{
    public int num = 10;
    public Fu(){
    System.out.println(“fu”);
    }
    }
    class Zi extends Fu{
    public int num = 20;
    public Zi(){
    System.out.println(“zi”);
    }
    public void show(){
    int num = 30;
    System.out.println(num);
    System.out.println(this.num);
    System.out.println(super.num);
    }
    }
    class Test1_Extends {
    public static void main(String[] args) {
    Zi z = new Zi();
    z.show();
    }
    }

結果:
fu
zi
30
20
10

    看程序寫結果2
    class Fu {
        static {
            System.out.println("靜態代碼塊Fu");
        }

        {
            System.out.println("構造代碼塊Fu");
        }

        public Fu() {
            System.out.println("構造方法Fu");
        }
    }

    class Zi extends Fu {
        static {
            System.out.println("靜態代碼塊Zi");
        }

        {
            System.out.println("構造代碼塊Zi");
        }

        public Zi() {
            System.out.println("構造方法Zi");
        }
    }

    Zi z = new Zi(); 請執行結果。

結果:
靜態代碼塊Fu
靜態代碼塊Zi
構造代碼塊Fu
構造方法Fu
構造代碼塊Zi
構造方法Zi

08.12_面向對象(繼承中成員方法關係)(掌握)

  • A:案例演示

    • a:不同名的方法
    • b:同名的方法

      public static void main(String[] args) {
              Son s = new Son();
              s.print();
              s.method();
          }
      }
      
      class Father {
          public void print() {
              System.out.println("Fu print");
          }
      }
      
      class Son extends Father {
          public void method() {
              System.out.println("Zi Method");
          }
      
          public void print() {
              //super.print();                            //super可以調用父類的成員方法
              System.out.println("Zi print");
          }
      }
      

08.13_面向對象(方法重寫概述及其應用)(掌握)

  • A:什麼是方法重寫
    • 重寫:子父類出現了一模一樣的方法(注意:返回值類型可以是子父類,這個我們學完面向對象講)
  • B:方法重寫的應用:
    • 當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法。這樣,即沿襲了父類的功能,又定義了子類特有的內容。
  • C:案例演示

    • a:定義一個手機類。

      class Demo7_Phone {
          public static void main(String[] args) {
              Ios8 i = new Ios8();
              i.siri();
              i.call();
          }
      }
      
      /*
      B:方法重寫的應用:
          * 當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法。這樣,即沿襲了父類的功能,又定義了子類特有的內容。
          ios7系統 siri speak English
          ios8系統 siri 說中文
      */
      
      class Ios7 {
          public void call() {
              System.out.println("打電話");
          }
      
          public void siri() {
              System.out.println("speak English");
          }
      }
      
      class Ios8 extends Ios7 {
          public void siri() {
      
              System.out.println("說中文");
              super.siri();
          }
      }
      

08.14_面向對象(方法重寫的注意事項)(掌握)

  • A:方法重寫注意事項

    • a:父類中私有方法不能被重寫
      • 因爲父類私有方法子類根本就無法繼承
    • b:子類重寫父類方法時,訪問權限不能更低
      • 最好就一致
    • c:父類靜態方法,子類也必須通過靜態方法進行重寫

      • 其實這個算不上方法重寫,但是現象確實如此,至於爲什麼算不上方法重寫,多態中我會講解(靜態只能覆蓋靜態)
    • 子類重寫父類方法的時候,最好聲明一模一樣。

  • B:案例演示
    • 方法重寫注意事項

08.15_面向對象(方法重寫的面試題)(掌握)

  • A:方法重寫的面試題

    • Override和Overload的區別?Overload能改變返回值類型嗎?
    • overload可以改變返回值類型,只看參數列表
    • 方法重寫:子類中出現了和父類中方法聲明一模一樣的方法。與返回值類型有關,返回值是一致(或者是子父類)的

    • 方法重載:本類中出現的方法名一樣,參數列表不同的方法。與返回值類型無關。

    • 子類對象調用方法的時候:

      • 先找子類本身,再找父類。

08.16_面向對象(使用繼承前的學生和老師案例)(掌握)

  • A:案例演示
    • 使用繼承前的學生和老師案例
    • 屬性:姓名,年齡
    • 行爲:吃飯
    • 老師有特有的方法:講課
    • 學生有特有的方法:學習

08.17_面向對象(使用繼承後的學生和老師案例)(掌握)

  • A:案例演示
    • 使用繼承後的學生和老師案例

08.18_面向對象(貓狗案例分析,實現及測試)(掌握)

  • A:貓狗案例分析
  • B:案例演示
    • 貓狗案例繼承版
    • 屬性:毛的顏色,腿的個數
    • 行爲:吃飯
    • 貓特有行爲:抓老鼠catchMouse
    • 狗特有行爲:看家lookHome

08.19_面向對象(final關鍵字修飾類,方法以及變量的特點)(掌握)

  • A:final概述
  • B:final修飾特點
    • 修飾類,類不能被繼承
    • 修飾變量,變量就變成了常量,只能被賦值一次(final修飾變量叫做常量,一般會與public static共用,常量命名規範,如果是一個單詞,所有字母大寫,如果是多個單詞,每個單詞都大寫,中間用下劃線隔開)
    • 修飾方法,方法不能被重寫
  • C:案例演示

    • final修飾特點

      class Demo1_Final {
          public static void main(String[] args) {
              Son s = new Son();
              s.print();
          }
      }
      
      /*final class Father {
          public void print() {
              System.out.println("訪問底層數據資源");
          }
      }*/
      
      class Son /*extends Father*/ {
          final int NUM = 10;                     //常量命名規範,如果是一個單詞,所有字母大寫,如果是多個單詞,每個單詞都大寫,中間用下劃線隔開
          public static final double PI = 3.14;   //final修飾變量叫做常量,一般會與public static共用
          public void print() {
              //NUM = 20;
              System.out.println(NUM);
          }
      }
      

08.20_面向對象(final關鍵字修飾局部變量)(掌握)

  • A:案例演示

    • 方法內部或者方法聲明上都演示一下(瞭解)
    • 基本類型,是值不能被改變
    • 引用類型,是地址值不能被改變,對象中的屬性可以改變

              class Demo2_Final {
          public static void main(String[] args) {
              final int num = 10;
              //num = 20;
              System.out.println(num);
      
              final Person p = new Person("張三",23);
              //p = new Person("李四",24);
              p.setName("李四");
              p.setAge(24);
      
              System.out.println(p.getName() + "..." + p.getAge());
      
              method(10);
              method(20);
          }
      
          public static void method(final int x) {
              System.out.println(x);
          }
      }
      
      class Person {
          private String name;            //姓名
          private int age;                //年齡
      
          public Person(){}               //空參構造
      
          public Person(String name,int age) {
              this.name = name;
              this.age = age;
          }
      
          public void setName(String name) {  //設置姓名
              this.name = name;
          }
      
          public String getName() {       //獲取姓名
              return name;
          }
      
          public void setAge(int age) {   //設置年齡
              this.age = age;
          }
      
          public int getAge() {           //獲取年齡
              return age;
          }
      }
      

08.21_面向對象(final修飾變量的初始化時機)(掌握)

  • A:final修飾變量的初始化時機

    • 顯示初始化
    • 在對象構造完畢前即可

      class Demo_Final {
          public static void main(String[] args) {
              Demo d = new Demo();
              d.print();
          }
      }           
      
      class Demo {
          final int num;                      //成員變量的默認初始化值是無效值
      
          public Demo() {
              num = 10;
          }
          public void print() {
              System.out.println(num);
          }
      }   
      

08.22_day08總結

  • 把今天的知識點總結一遍。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章