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("兵乓球運動員說英語");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538912.html
標籤:Java
上一篇:1.類&物件&構造方法
下一篇:Mybatis快取機制
