1. 程式人生 > >Java類和多型

Java類和多型

*********************第八章 複用類和多型******************************

可複用


一.方法


二.複用 類

1.組合

2.繼承


*****************************組合 has a******************************

一.什麼是組合


是關聯的特例


組合: 部分只能屬於一個整體

整體有一個部分

人和心臟 汽車和發動機

 

二.how

類A 組合 一個類B的物件

class A {

B b = new B();//組合
}

 

舉例1:

學生有一個女朋友

public class Student{

private int sno;
private String name;
private int age;

private Girl girl = new Girl();//組合
}

 


舉例2:

筆記本有一個螢幕


14寸螢幕

package com.chapter8.演示組合;

//14寸的螢幕
public class Screen14 {

public void display(){
System.out.println("使用14寸螢幕進行顯示");
}
}

 

筆記本

package com.chapter8.演示組合;

//筆記本
public class Notebook {

//組合
//has a 筆記本 有一個螢幕
private Screen14 screen = new Screen14();

public void work(){
System.out.println("主機板通電");
System.out.println("硬碟轉");
System.out.println("cpu從硬碟中讀取作業系統檔案");
System.out.println("風扇轉");

screen.display();//複用了螢幕類的程式碼 不需要從新再寫一遍螢幕的顯示邏輯了
}

public static void main(String[] args) {
Notebook notebook = new Notebook();

notebook.work();
}


}

 

三.why 為什麼用組合


複用類的程式碼


當多個類中 有相同的程式碼時 使用方法來複用程式碼 就不管用了

1.需要把多個類中(戰士、法師、弓箭中)相同的程式碼 抽取出來 抽到一個類中(Knife 刀)

2.定義的戰士的時候 讓戰士組合一把刀 複用刀的程式碼

//戰士 has a 刀
class 戰士 {

private Knife knife = new Knife();//組合


public void attack(){

knife.kan();
}
}

其他類也是一樣


class 弓箭手 {

private Knife knife = new Knife();//組合


public void attack(){

knife.kan();
}
}

 


*****************************區域性變數能使用 訪問控制權限修飾符 修飾嗎??***************************

不能.因為區域性變數的作用域由程式設計師定義的位置決定,不能使用 訪問許可權修飾符修飾

 

一.修飾類的


二.修飾類的成員的(1.屬性 2.方法)

 

 

***********************************依賴關係*****************************************

把一個物件 定義成區域性變數 並且呼叫該物件的方法 這時候會產生依賴

例如


package com.chapter8.演示組合;


依賴
// 筆記本的工作---------->螢幕的顯示
public class Notebook {


public void work(){

Screen14 screen = new Screen14();//依賴

System.out.println("主機板通電");
System.out.println("硬碟轉");
System.out.println("cpu從硬碟中讀取作業系統檔案");
System.out.println("風扇轉");

screen.display();//複用了螢幕類的程式碼 不需要從新再寫一遍螢幕的顯示邏輯了
}

public static void main(String[] args) {
Notebook notebook = new Notebook();

notebook.work();
}


}


**********************************繼承******************************

複用類的第二種方式: 繼承


一.why 什麼時候想到使用繼承


當多個類中有相同的方法(吃飯、睡覺、打豆豆),為了防止多個類中相同的方法或屬性

出現多次,可以把多個類中相同的屬性和方法 抽取到一個類中 Person,其他類繼承這個Person

即可,解決了程式碼冗餘問題


二.what 什麼是繼承 is a


準確的應該翻譯成擴充套件 ,可以理解成複製

學生類繼承人這個類,相當於學生類 在人這個類的基礎上擴充套件程式碼(加程式碼)

 

Person類可以看成程式碼的0.1版本

子類 Student 可以看成 0.2版 在0.1的基礎上加程式碼

 

子類 is a 父類


學生 is a Person

老師 is a Person


public class Person {
public void eat() {
System.out.println("吃飯");
}

public void sleep() {
System.out.println("睡覺");
}

public void beatBeanBean() {
System.out.println("打豆豆");
}
}

 

public class Student extends Person{


public void study(){
//我在學習
}
}

相當於

public class Student{
public void eat() {
System.out.println("吃飯");
}

public void sleep() {
System.out.println("睡覺");
}

public void beatBeanBean() {
System.out.println("打豆豆");
}

public void study(){
//我在學習
}

}


三.how 如何繼承

使用extends 關鍵字


public class Student extends Person{


public void study(){
//我在學習
}

public static void main(String[] args) {
Student s = new Student();

s.eat();//子類中沒有定義eat() 但是可以呼叫 說明從父類中繼承了eat()方法
}
}


Person 叫做父類,也叫做 基類、超類


Student 叫做子類, 也叫做派生類、衍生類

 

**不要重造輪子,父類的程式碼寫過一遍,就不要再從新寫了, 直接繼承就可以了...

 


***********************************組合和繼承如何選用?*******************************************


多用組合,少用繼承。 除非有明確的is a 關係再使用繼承

 

學生 is a Person


為什麼要多用組合,少用繼承?


因為組合比繼承更加靈活

 

*********************繼承中的訪問控制權限修飾符******************************


1.private

private修飾的屬性和方法 不能被繼承


2. protected 和public 修飾的屬性和方法 可以被繼承

 

3. default

包許可權


本包中的子類 可以繼承,其他包中的子類不能繼承

 

舉例: 爸爸的寶馬車

 

父親

//父類
public class Father {

//has a 組合
BMW bmw = new BMW();


}


孩子


public class Son extends Father{

public void goToPlay(){
bmw.drive();
}

public static void main(String[] args) {
Son son = new Son();
son.goToPlay();
}
}