1、多態 1.1 多態的概述(記憶) 什麼是多態 同一對象,在不同時刻表現出來的不同形態。 多態的前提 有繼承/實現關係 有方法重寫 有父類對象的引用執行子類對象 1.2 多態中的成員訪問特點(記憶) 成員訪問特點 成員變數:編程看父類,運行看父類 成員方法:編譯看父類,運行看子類 代碼演示 pub ...
1、多態
1.1 多態的概述(記憶)
- 什麼是多態
同一對象,在不同時刻表現出來的不同形態。
- 多態的前提
- 有繼承/實現關係
- 有方法重寫
- 有父類對象的引用執行子類對象
1.2 多態中的成員訪問特點(記憶)
- 成員訪問特點
- 成員變數:編程看父類,運行看父類
- 成員方法:編譯看父類,運行看子類
- 代碼演示
public class Animal {
public int age = 40;
public void eat(){
System.out.println("動物吃東西");
}
}
public class Animal {
public int age = 40;
public void eat(){
System.out.println("動物吃東西");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//父類對象引用指向子類
Animal a = new Cat();
//調用成員變數:編譯看父類,運行看父類
System.out.println(a.age);
//調用成員方法:編譯看父類,運行看子類
a.eat();
}
}
1.3 多態的好處和弊端(記憶)
- 好處
提高程式的擴展性。定義方法時候,使用父類型作為參數,在使用的時候,使用具體的子類型參與操作。
- 弊端
不能使用子類特有的成員
1.4 多態中的轉型(應用)
- 向上轉型
父類對象的引用指向子類對象就是向上轉型。
- 向下轉型
格式:子類型 對象名 = (子類型)父類引用;
- 代碼演示
public class Animal {
public void eat(){
System.out.println("動物吃東西");
}
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("貓吃魚");
}
public void playGame(){
System.out.println("貓捉秘藏");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//多態
//1.向上轉型
Animal a = new Cat();
a.eat();
//不能訪問子類對象特有的方法
//a.playGame();
//向下轉型
Cat c = (Cat) a;
c.eat();
c.playGame();
}
}
1.5 多態的案例(應用)
- 案例需求
請採用多態的思想實現貓和狗的案例,併在測試類中進行測試
- 代碼實現
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("動物吃東西");
}
}
public class Dog extends Animal{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
public void eat(){
System.out.println("狗吃骨頭");
}
}
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("貓吃老鼠");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//使用無參構造方法
Animal a1 = new Cat();
a1.setAge(5);
a1.setName("加菲");
System.out.println(a1.getName()+","+ a1.getAge());
a1.eat();
//使用帶參的構造方法
a1 = new Cat("波斯",6);
System.out.println(a1.getName()+","+ a1.getAge());
a1.eat();
}
}
2、抽象類
2.1 抽象類的概述(理解)
當我們在做子類共性抽取時,有些方法在父類中並沒有具體的體現,這個時候就需要抽象類了!
抽象方法:沒有方法體的方法應該定義為抽象方法
抽象類:由抽象方法的類必須定義為抽象類
2.2 抽象類的特點(記憶)
- 抽象類和抽象方法必須使用abstract關鍵字修飾
//抽象類的定義
public abstract class 類名 {}
//抽象方法的定義
public abstract void eat();
- 抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
- 抽象類不能實例化
抽象類不能實例化,但可通過子類對象實例化,編寫方式參照多態,這叫抽象類多態。
- 抽象類的子類
要麼重寫抽象類中的所有抽象方法
要麼還是抽象類
2.3 抽象類的成員特點(記憶)
- 成員的特點
- 成員變數
- 既可以時變數
- 也可以是常量
- 成員方法
- 即可以是抽象方法
- 可以是普通方法
- 構造方法
- 即可以有空參構造
- 也可以有有參構造
- 成員變數
- 代碼演示
public abstract class Animal {
private int age =20;
private final String city = "北京";
public Animal() {
}
public Animal(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void show(){
age = 40;
System.out.println(age);
//city = "上海";//不能給最終變數city賦值
System.out.println(city);
}
public abstract void eat();
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("貓吃魚");
}
}
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
a.show();
}
}
2.4 抽象類的案例(應用)
- 案例需求
請採用抽象類的思想實現貓和狗的案例,併在測試類中進行測試
- 代碼實現
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
public class Cat extends Animal {
public Cat() {
}
public Cat(String name,int age){
super(name,age);
}
@Override
public void eat() {
System.out.println("貓吃魚");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("夠吃骨頭");
}
}
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
a.setAge(5);
a.setName("加菲");
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Cat("波斯",6);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
3、介面
3.1 介面的概述(理解)
介面就是一種公共的規範標準,只要符合規範標準,大家都可以通用。
Java中的介面更多的體現在對行為的抽象!
3.2 介面的特點(記憶)
- 介面用關鍵字interface修飾
public interface 介面名 { }
- 類實現介面用implements表示
public clas 類名 implements 介面名 { }
- 介面不能實例化
參照多態的方式,通過實現類對象實例化,這叫介面多態。
多態的形式:具體類多態、抽象類多態、介面多態
- 介面的子類
要麼重寫介面中所有方法
要麼子類也是抽象類
3.3 介面的成員特點(記憶)
- 成員特點
- 成員特點
只能是常量,預設修飾符:public static final
-
- 構造方法
沒有,應為介面不能被實例化,所以沒有具體存在
-
- 成員方法
只能是抽象方法,預設修飾符:public abstract
- 代碼演示
public interface Inter {
int num = 10;//public static final int num = 10;
void method();//public abstract void method();
void show();//public abstract void show();
}
public class InterImpl implements Inter{
public InterImpl() {
}
@Override
public void method() {
System.out.println("method");
}
@Override
public void show() {
System.out.println("show");
}
}
public static void main(String[] args) {
Inter i = new InterImpl();
System.out.println(Inter.num);//10
}
}
3.4 介面的案例(應用)
- 案例需求
對貓和狗進行訓練,他們就可以跳高了,這裡加入跳高功能。
請採用抽象類和介面來實現貓狗案例,併在測試類中進行測試。
- 代碼實現
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
public interface Jumpping {
void jump();
}
public class Cat extends Animal implements Jumpping{
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("貓吃魚");
}
@Override
public void jump() {
System.out.println("貓可以調高");
}
}
public class AnimalDemo {
public static void main(String[] args) {
Jumpping j = new Cat();
j.jump();
Animal a = new Cat();
a.setAge(5);
a.setName("加菲");
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Cat("波斯",6);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
3.5 類和介面的關係(記憶)
- 類與類的關係
繼承關係,只能單繼承,但是可以多層繼承
- 類與介面的關係
實現關係,可以單實現,也可以多實現,還可以在繼承一個類的同時實現多個介面。
3.6 抽象類與介面的區別(記憶)
- 成員區別
- 抽象類
變數、常量;有構造方法;也有非抽象方法
-
- 介面
常量,抽象方法
- 關係區別
- 類與類:繼承、單繼承
- 類與介面:實現,可以單實現,也可以多實現
- 介面與介面:繼承,單繼承,多繼承
- 設計理念區別
- 抽象類
對類的抽象,包括屬性、行為
-
- 介面
對行為的抽象
4、綜合案例
4.1 案例需求(理解)
我們現在有乒乓球運動員和籃球運動員,乒乓球教練和籃球教練。
為了出國交流,跟乒乓球相關的人員都需要學習英語。
請用所學知識分析,這個案例中有哪些具體類,哪些抽象類,哪些介面,並用代碼實現。
4.2 代碼實現(應用)
//抽象人類
public abstract class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
//抽象教練
public abstract class Coach extends Person{
public Coach() {
}
public Coach(String name, int age) {
super(name, age);
}
public abstract void teach();
}
//抽象運動員
public abstract class Player extends Person {
public Player() {
}
public Player(String name, int age) {
super(name, age);
}
public abstract void study();
}
//學英語介面
public interface SpeakEnglish {
public abstract void speak();
}
//籃球教練
public class BasketballCoach extends Coach{
public BasketballCoach() {
}
public BasketballCoach(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("籃球教練教如何運球和投籃");
}
@Override
public void eat() {
System.out.println("籃球教練吃羊奶,喝羊奶");
}
}
//籃球運動員
public class BasketballPlayer extends Player{
@Override
public void eat() {
System.out.println("籃球運動員學習如何運球和投球");
}
@Override
public void study() {
System.out.println("籃球運動員學習如何運球和投藍");
}
}
//兵乓球教練
public class PingBangCoach extends Coach implements SpeakEnglish{
@Override
public void teach() {
System.out.println("兵乓求教練教如何發球和接球");
}
@Override
public void eat() {
System.out.println("兵乓球教練吃小白菜,和大米粥");
}
@Override
public void speak() {
System.out.println("兵乓球教練說英語");
}
}
//兵乓球運動員
public class PingBangPlayer extends Player implements SpeakEnglish{
public PingBangPlayer() {
}
public PingBangPlayer(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("兵乓球運動員學習如何發球和接球");
}
@Override
public void study() {
System.out.println("兵乓球運動員吃大白菜,喝小米粥");
}
@Override
public void speak() {
System.out.println("兵乓球運動員說英語");
}
}