當(dāng)我們?cè)谧鲎宇惞残怨δ艹槿r(shí),有些方法在父類中并沒有具體的體現(xiàn),這個(gè)時(shí)候就需要抽象類了!
在Java中,一個(gè)沒有方法體的方法應(yīng)該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類!
1.2抽象類的特點(diǎn)(記憶)抽象類和抽象方法必須使用 abstract 關(guān)鍵字修飾
//抽象類的定義
public abstract class 類名 {}
//抽象方法的定義
public abstract void eat();
抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
抽象類不能實(shí)例化
抽象類如何實(shí)例化呢?參照多態(tài)的方式,通過子類對(duì)象實(shí)例化,這叫抽象類多態(tài)
抽象類的子類
要么重寫抽象類中的所有抽象方法
要么是抽象類
1.3抽象類的成員特點(diǎn)(記憶)成員的特點(diǎn)
成員變量
既可以是變量
也可以是常量
構(gòu)造方法
空參構(gòu)造
有參構(gòu)造
成員方法
抽象方法
普通方法
代碼演示
動(dòng)物類
public abstract class Animal {
private int age = 20;
private final String city = "北京";
public Animal() {}
public Animal(int age) {
this.age = age;
}
public void show() {
age = 40;
System.out.println(age);
// 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();
}
}
1.4抽象類的案例(應(yīng)用)案例需求
請(qǐng)采用抽象類的思想實(shí)現(xiàn)貓和狗的案例,并在測試類中進(jìn)行測試
代碼實(shí)現(xiàn)
動(dòng)物類
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) {
//創(chuàng)建對(duì)象,按照多態(tài)的方式
Animal a = new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
System.out.println("--------");
a = new Cat("加菲",5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
}
}
2.接口
2.1接口的概述(理解)接口就是一種公共的規(guī)范標(biāo)準(zhǔn),只要符合規(guī)范標(biāo)準(zhǔn),大家都可以通用。
Java中的接口更多的體現(xiàn)在對(duì)行為的抽象!
2.2接口的特點(diǎn)(記憶)接口用關(guān)鍵字interface修飾
public interface 接口名 {}
類實(shí)現(xiàn)接口用implements表示
public class 類名 implements 接口名 {}
接口不能實(shí)例化
接口如何實(shí)例化呢?參照多態(tài)的方式,通過實(shí)現(xiàn)類對(duì)象實(shí)例化,這叫接口多態(tài)。
多態(tài)的形式:具體類多態(tài),抽象類多態(tài),接口多態(tài)。
接口的子類
要么重寫接口中的所有抽象方法
要么子類也是接口
2.3接口的成員特點(diǎn)(記憶)成員特點(diǎn)
成員變量
只能是常量
默認(rèn)修飾符:public static final
構(gòu)造方法
沒有,因?yàn)榻涌谥饕菙U(kuò)展功能的,而沒有具體存在
成員方法
只能是抽象方法
默認(rèn)修飾符:public abstract
關(guān)于接口中的方法,JDK8和JDK9中有一些新特性,后面再講解
代碼演示
接口
public interface Inter {
public int num = 10;
public final int num2 = 20;
// public static final int num3 = 30;
int num3 = 30;
// public Inter() {}
// public void show() {}
public abstract void method();
void show();
}
實(shí)現(xiàn)類
public class InterImpl extends Object implements Inter {
public InterImpl() {
super();
}
@Override
public void method() {
System.out.println("method");
}
@Override
public void show() {
System.out.println("show");
}
}
測試類
public class InterfaceDemo {
public static void main(String[] args) {
Inter i = new InterImpl();
// i.num = 20;
System.out.println(i.num);
// i.num2 = 40;
System.out.println(i.num2);
System.out.println(Inter.num);
}
}
2.4接口的案例(應(yīng)用)案例需求
對(duì)貓和狗進(jìn)行訓(xùn)練,他們就可以跳高了,這里加入跳高功能。
請(qǐng)采用抽象類和接口來實(shí)現(xiàn)貓狗案例,并在測試類中進(jìn)行測試。
代碼實(shí)現(xiàn)
動(dòng)物類
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 {
public abstract 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) {
//創(chuàng)建對(duì)象,調(diào)用方法 接口多態(tài)
Jumpping j = new Cat();
j.jump();
System.out.println("--------");
// 抽象類多態(tài)
Animal a = new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
// a.jump();
a = new Cat("加菲",5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
System.out.println("--------");
// 使用具體的子類和實(shí)現(xiàn)類
Cat c = new Cat();
c.setName("加菲");
c.setAge(5);
System.out.println(c.getName()+","+c.getAge());
c.eat();
c.jump();
}
}
2.5類和接口的關(guān)系(記憶)類與類的關(guān)系
繼承關(guān)系,只能單繼承,但是可以多層繼承
類與接口的關(guān)系
實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn),還可以在繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口
接口與接口的關(guān)系
繼承關(guān)系,可以單繼承,也可以多繼承
2.6抽象類和接口的區(qū)別(記憶)成員區(qū)別
抽象類
變量,常量;有構(gòu)造方法;有抽象方法,也有非抽象方法
接口
常量;抽象方法
關(guān)系區(qū)別
類與類
繼承,單繼承
類與接口
實(shí)現(xiàn),可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)
接口與接口
繼承,單繼承,多繼承
設(shè)計(jì)理念區(qū)別
抽象類
對(duì)類抽象,包括屬性、行為
接口
對(duì)行為抽象,主要是行為
3.綜合案例 3.1案例需求(理解)我們現(xiàn)在有乒乓球運(yùn)動(dòng)員和籃球運(yùn)動(dòng)員,乒乓球教練和籃球教練。
為了出國交流,跟乒乓球相關(guān)的人員都需要學(xué)習(xí)英語。
請(qǐng)用所學(xué)知識(shí)分析,這個(gè)案例中有哪些具體類,哪些抽象類,哪些接口,并用代碼實(shí)現(xiàn)。
抽象人類
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();
}
抽象運(yùn)動(dòng)員類
public abstract class Player extends Person {
public Player() {
}
public Player(String name, int age) {
super(name, age);
}
public abstract void study();
}
抽象教練類
public abstract class Coach extends Person {
public Coach() {
}
public Coach(String name, int age) {
super(name, age);
}
public abstract void teach();
}
學(xué)英語接口
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("籃球教練教如何運(yùn)球和投籃");
}
@Override
public void eat() {
System.out.println("籃球教練吃羊肉,喝羊奶");
}
}
乒乓球教練
public class PingPangCoach extends Coach implements SpeakEnglish {
public PingPangCoach() {
}
public PingPangCoach(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("乒乓球教練教如何發(fā)球和接球");
}
@Override
public void eat() {
System.out.println("乒乓球教練吃小白菜,喝大米粥");
}
@Override
public void speak() {
System.out.println("乒乓球教練說英語");
}
}
乒乓球運(yùn)動(dòng)員
public class PingPangPlayer extends Player implements SpeakEnglish {
public PingPangPlayer() {
}
public PingPangPlayer(String name, int age) {
super(name, age);
}
@Override
public void study() {
System.out.println("乒乓球運(yùn)動(dòng)員學(xué)習(xí)如何發(fā)球和接球");
}
@Override
public void eat() {
System.out.println("乒乓球運(yùn)動(dòng)員吃大白菜,喝小米粥");
}
@Override
public void speak() {
System.out.println("乒乓球運(yùn)動(dòng)員說英語");
}
}
籃球運(yùn)動(dòng)員
public class BasketballPlayer extends Player {
public BasketballPlayer() {
}
public BasketballPlayer(String name, int age) {
super(name, age);
}
@Override
public void study() {
System.out.println("籃球運(yùn)動(dòng)員學(xué)習(xí)如何運(yùn)球和投籃");
}
@Override
public void eat() {
System.out.println("籃球運(yùn)動(dòng)員吃牛肉,喝牛奶");
}
}
4. 參數(shù)傳遞
4.1 類名作為形參和返回值(應(yīng)用)1、類名作為方法的形參
方法的形參是類名,其實(shí)需要的是該類的對(duì)象
實(shí)際傳遞的是該對(duì)象的【地址值】
2、類名作為方法的返回值
方法的返回值是類名,其實(shí)返回的是該類的對(duì)象
實(shí)際傳遞的,也是該對(duì)象的【地址值】
示例代碼:
class Cat {
public void eat() {
System.out.println("貓吃魚");
}
}
class CatOperator {
public void useCat(Cat c) { //Cat c = new Cat();
c.eat();
}
public Cat getCat() {
Cat c = new Cat();
return c;
}
}
public class CatDemo {
public static void main(String[] args) {
//創(chuàng)建操作類對(duì)象,并調(diào)用方法
CatOperator co = new CatOperator();
Cat c = new Cat();
co.useCat(c);
Cat c2 = co.getCat(); //new Cat()
c2.eat();
}
}
4.2 抽象類作為形參和返回值(理解)抽象類作為形參和返回值
方法的形參是抽象類名,其實(shí)需要的是該抽象類的子類對(duì)象
方法的返回值是抽象類名,其實(shí)返回的是該抽象類的子類對(duì)象
示例代碼:
abstract class Animal {
public abstract void eat();
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("貓吃魚");
}
}
class AnimalOperator {
public void useAnimal(Animal a) { //Animal a = new Cat();
a.eat();
}
public Animal getAnimal() {
Animal a = new Cat();
return a;
}
}
public class AnimalDemo {
public static void main(String[] args) {
//創(chuàng)建操作類對(duì)象,并調(diào)用方法
AnimalOperator ao = new AnimalOperator();
Animal a = new Cat();
ao.useAnimal(a);
Animal a2 = ao.getAnimal(); //new Cat()
a2.eat();
}
}
4.3 接口名作為形參和返回值(理解)接口作為形參和返回值
方法的形參是接口名,其實(shí)需要的是該接口的實(shí)現(xiàn)類對(duì)象
方法的返回值是接口名,其實(shí)返回的是該接口的實(shí)現(xiàn)類對(duì)象
示例代碼:
interface Jumpping {
void jump();
}
class JumppingOperator {
public void useJumpping(Jumpping j) { //Jumpping j = new Cat();
j.jump();
}
public Jumpping getJumpping() {
Jumpping j = new Cat();
return j;
}
}
class Cat implements Jumpping {
@Override
public void jump() {
System.out.println("貓可以跳高了");
}
}
public class JumppingDemo {
public static void main(String[] args) {
//創(chuàng)建操作類對(duì)象,并調(diào)用方法
JumppingOperator jo = new JumppingOperator();
Jumpping j = new Cat();
jo.useJumpping(j);
Jumpping j2 = jo.getJumpping(); //new Cat()
j2.jump();
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱:抽象類&接口-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://aaarwkj.com/article0/doppio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、軟件開發(fā)、小程序開發(fā)、標(biāo)簽優(yōu)化、云服務(wù)器、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容