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();
}
}
Java類和多態