多態 多態的概述 同一個對象,在不同時刻表現出來的不同形態 多態的前提和體現 有繼承/實現關係 有方法重寫關係 有父類引用指向子類對象 多態中成員訪問特點 成員變數 :編譯看左邊,執行看左邊 成員方法 :編譯看左邊,執行看右邊 為什麼成員變數和成員方法訪問不一樣呢 因為成員方法有重寫,而成員變數不一 ...
多態
多態的概述
同一個對象,在不同時刻表現出來的不同形態
多態的前提和體現
- 有繼承/實現關係
- 有方法重寫關係
- 有父類引用指向子類對象
public class Animal {
public void eat() {
System.out.println("動物吃東西");
}
}
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();
}
}
多態中成員訪問特點
- 成員變數:編譯看左邊,執行看左邊
- 成員方法:編譯看左邊,執行看右邊
為什麼成員變數和成員方法訪問不一樣呢
- 因為成員方法有重寫,而成員變數不一樣呢?
public class Animal {
public int age = 40;
public void eat() {
System.out.println("動物吃東西");
}
}
public class Cat extends Animal {
public int age = 20;
public int weight = 10;
@override
public void eat() {
System.out.println("貓吃魚");
public void playGame() {
System.out.println("貓捉老鼠");
}
}
public class Dog extends Animal {
@override
public void eat() {
System.out.println("狗吃骨頭");
public void lookDoor() {
System.out.println("狗看門");
}
}
public class AnimalOperator {
public void useAnimal(Animal a){
//Animal a = new Cat();
//Animal a = new Dog();
a.eat();
}
}
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.age));
// System.out.println(a.weight));
a.eat();
// a.playGame();
AnimalOperator ao = new AnimalOperator();
Dog d = new Dog();
ao.useAnimal(d);
}
}
多態的好處和弊端
- 多態的好處:提高了程式的擴展性(定義方法的時候,使用父類型作為參數,將來在使用的時候,使用具體的子類型參與操作)
- 多態的弊端:不能使用子類的特有功能
多態中的轉型
向上轉型:
- 從子到父,父類引用指向子類對象
向下轉型:
- 從父到子,父類引用轉為子類對象
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) {
//多態
Animal a = new Cat(); //向上轉型
a.eat();
/*
//創建Cat類的對象
Cat c = new Cat();
c.eat();
c.playGame();
*/
//向下轉型
Cat c = (Cat)a;
c.eat();
c.playGame();
}
}
抽象類
抽象類概述
在Java中,一個沒有方法體的方法應該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類。
抽象類特點
- 抽象類和抽象類方法必須使用abstract關鍵字修飾
public abstract class 類名{}
public abstract void eat();- 抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
- 抽象類不能實例化
抽象類如何實現實例化呢?參照多態的方式,通過子類對象實例化,這叫抽象類多態- 抽象類的子類
要麼重寫抽象類中的所有抽象方法
要麼是抽象類
抽象類的成員特點
- 成員變數
可以是變數
也可以是常量- 構造方法
有構造方法,但是不能實例化
構造方法的作用是用於訪問父類數據的初始化- 成員方法
可以有抽象方法:限定子類必須完成某些動作
也可以有非抽象方法:提高代碼復用性
貓和狗抽象類案例
//創建動物類
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{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨頭");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//創建對象,按照多態的方式
Animal a = new Cat();
a.setName("布偶");
a.setAge(3);
System.out.println(a.getName()+","+a.getAge());
a.eat();
System.out.println("========");
a = new Cat("布偶",3);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
介面
介面概述
介面就是一種公共的規範標準,只要符合規範標準,大家都可以通用
Java中的介面更多的體現在對行為的抽象
介面的特點
- 介面用關鍵字interface修飾
public interface 介面名 {}- 類實現介面用implements表示
public class 類名 implements 介面名{}- 介面不能實例化
介面如何實例化呢? 參照多態的方式,通過實現類對象實例化,這叫介面多態。
多態的形式:具體類多態,抽象類多態,介面多態- 介面的實現類
要麼重寫介面中的所有抽象方法
要麼是抽象類
介面的成員特點
- 成員變數
只能是常量
預設修飾符:public static final- 構造方法
介面沒有構造方法,因為介面主要是對行為進行抽象的,是沒有具體存在
如果一個類沒有顯式繼承某個父類,則預設繼承Object類- 成員方法
只能是抽象方法
預設修飾符:public abstract
貓和狗介面案例
//定義介面Jumpping
public interface Jumpping{
public abstract void jump();
}
//創建動物類
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 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 Dog extends Animal implements Jumpping {
public Dog() {
}
public Dog(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();
System.out.println("========");
Animal a = new Cat();
a.setName("布偶");
a.setAge(3);
System.out.println(a.getName()+","+a.getAge());
a.eat();
a = new Cat("布偶",3);
System.out.println(a.getName()+","+a.getAge());
a.eat();
System.out.println("========");
Cat c = new Cat();
c.setName("布偶");
c.setAge(3);
System.out.println(a.getName()+","+a.getAge());
c.eat();
c.jump();
}
}
類和介面的關係
- 類和類的關係
繼承關係,只能單繼承,但是可以多層繼承- 類和類的介面關係
實現關係,可以單實現,也可以多實現,還可以在繼承一個類的同時實現多個介面- 介面和介面的關係
繼承關係,可以單繼承,也可以多繼承
抽象類和介面的區別
- 成員區別
抽象類:變數,常量;有構造方法;有抽象方法,也有非抽象方法
介面:常量;抽象方法- 關係區別
類與類:繼承,單繼承
類與介面:實現,可以單實現,也可以多實現
介面與介面:繼承,單繼承,多繼承- 設計理念區別
抽象類:對類抽象,包括屬性、行為
介面:對行為抽象,主要是行為
//抽象運動員類
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 TableTennisPlayer extends Player implements SpeakEnglish{
public TableTennisPlayer() {
}
public TableTennisPlayer(String name, int age) {
super(name, age);
}
@Override
public void study() {
System.out.println("乒乓球運動員學習如何發球和接球");
}
@Override
public void eat() {
System.out.println("乒乓球運動員吃大白菜,喝小米粥");
}
@Override
public void speak() {
System.out.println("乒乓球運動員說英語");
}
}
public class BasketballPlayer extends Player {
public BasketballPlayer() {
}
public BasketballPlayer(String name, int age) {
super(name, age);
}
@Override
public void study() {
System.out.println("籃球運動員學習如何運球和投籃");
}
@Override
public void eat() {
System.out.println("籃球運動員吃牛肉,喝牛奶");
}
}
//測試類
public class PersonDemo {
public static void main(String[] args) {
//創建對象
TableTennisPlayer ttp = new TableTennisPlayer();
ttp.setName("小明");
ttp.setAge(30);
System.out.println(ttp.getName()+","+ttp.getAge());//小明,30
ttp.eat();//乒乓球運動員吃大白菜,喝小米粥
ttp.study();//乒乓球運動員學習如何發球和接球
ttp.speak();//乒乓球運動員說英語
System.out.println("========");
BasketballPlayer bp = new BasketballPlayer();
bp.setName("小華");
bp.setAge(28);
System.out.println(bp.getName()+","+bp.getAge());//小華,28
bp.eat();//籃球運動員吃牛肉,喝牛奶
bp.study();//籃球運動員學習如何運球和投籃
}
}