Java --- 基础学习Ⅱ
繼承
繼承概述
下面有一個(gè)學(xué)生類(lèi)
public class Student{private String name;private int age;public void study(){System.out.println("努力學(xué)習(xí)了");}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;} }還有一個(gè)老師類(lèi)
public class Teacher {private String name;private int age;public void teach(){System.out.println("教書(shū)育人");}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;} }其中有許多相同的特征,可以提取出來(lái)變?yōu)橐粋€(gè)單獨(dú)的類(lèi)
public class Person{private String name;private int 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;} }【繼承】: 是面向?qū)ο笕筇卣髦弧?梢允沟米宇?lèi)具有父類(lèi)的屬性和方法,還可以在子類(lèi)中重新定義,追加屬性和方法。
使用繼承實(shí)現(xiàn)上面的類(lèi)
public class Teacher extends Person{public void teach(){System.out.println("教書(shū)育人");} }【繼承的好處和弊端】
繼承好處:
- 提高了代碼的復(fù)用性(多個(gè)類(lèi)相同的成員可以放到同一個(gè)類(lèi)中)
- 提高了代碼的維護(hù)性(如果方法的代碼需要修改,修改一處即可)
繼承弊端:
- 繼承讓類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系,類(lèi)的耦合性增強(qiáng)了,當(dāng)父類(lèi)發(fā)生變化時(shí)子類(lèi)實(shí)現(xiàn)也不得不跟著變化,削弱了子類(lèi)的獨(dú)立性
繼承中變量的訪問(wèn)特點(diǎn)
在子類(lèi)方法中訪問(wèn)一個(gè)變量
- 子類(lèi)局部范圍找
- 子類(lèi)成員范圍找
- 父類(lèi)成員范圍找
- 如果都沒(méi)有就報(bào)錯(cuò)(不考慮父親的父親…)
Super
public class Zi extends Fu {public int age = 20;public void show() {int age = 30;System.out.println(age + ",局部變量");// 我要訪問(wèn)本壘的成員變量age,怎么辦呢?System.out.println(this.age + ",子類(lèi)的成員變量");// 我要訪問(wèn)父類(lèi)的成員變量age, 怎么辦呢?System.out.println(super.age + ",父類(lèi)的成員變量");} }super關(guān)鍵字的用法和this關(guān)鍵字的用法相似
- this: 代表本類(lèi)對(duì)象的引用
- super: 代表父類(lèi)存儲(chǔ)空間的標(biāo)識(shí)(可以理解為父類(lèi)對(duì)象引用)
| this | this.成員變量,訪問(wèn)本類(lèi)成員變量 | this(…)訪問(wèn)本類(lèi)構(gòu)造方法 | this.成員方法()訪問(wèn)本類(lèi)成員方法 |
| super | super.成員變量: 訪問(wèn)父類(lèi)成員變量 | super(…)訪問(wèn)父類(lèi)構(gòu)造方法 | super.成員方法(…): 訪問(wèn)父類(lèi)成員方法 |
繼承中構(gòu)造方法的訪問(wèn)特點(diǎn)
子類(lèi)中所有的構(gòu)造方法默認(rèn)都會(huì)訪問(wèn)父類(lèi)中無(wú)參的構(gòu)造方法.
-
因?yàn)樽宇?lèi)會(huì)繼承父類(lèi)中的數(shù)據(jù),可能還會(huì)使用父類(lèi)的數(shù)據(jù)。所以,子類(lèi)初始化之前,一定要先完成父類(lèi)數(shù)據(jù)的初始化。
-
每一個(gè)子類(lèi)的構(gòu)造方法的第一條語(yǔ)句,默認(rèn)都是: super()
如果父類(lèi)中沒(méi)有無(wú)參構(gòu)造方法,只有帶參構(gòu)造方法,該怎么辦呢?
- 通過(guò)使用super關(guān)鍵字去顯示的調(diào)用父類(lèi)的帶參構(gòu)造方法
- 在父類(lèi)中自己提供一個(gè)無(wú)參構(gòu)造方法(推薦)
繼承中成員方法的訪問(wèn)特點(diǎn)
通過(guò)子類(lèi)對(duì)象訪問(wèn)一個(gè)方法
- 子類(lèi)成員范圍找
- 父類(lèi)成員范圍找
- 如果沒(méi)有就報(bào)錯(cuò)(不考慮父親的父親)
方法重寫(xiě)
方法重寫(xiě): 子類(lèi)中出現(xiàn)了和父類(lèi)中一模一樣的方法聲明的現(xiàn)象
方法重寫(xiě)的應(yīng)用: 當(dāng)子類(lèi)需要父類(lèi)的功能,而功能主體子類(lèi)有自己的特有內(nèi)容時(shí),可以重寫(xiě)父類(lèi)中的方法,這樣,即沿襲了父類(lèi)的功能,又定義了子類(lèi)特有的內(nèi)容
public class Phone {public void call(String name) {System.out.println("給" + name + "打電話");} } public class NewPhone extends Phone {// 在子類(lèi)中重寫(xiě)call功能@Overridepublic void call(String name) {System.out.println("開(kāi)啟視頻功能");super.call(name);} }方法重寫(xiě)注意事項(xiàng)
-
父類(lèi)中的私有內(nèi)容,子類(lèi)中是繼承不到的
-
子類(lèi)方法訪問(wèn)權(quán)限不能更低 (public > 默認(rèn) > 私有)
Java中繼承的注意事項(xiàng)
- Java中類(lèi)只支持單繼承,不支持多繼承
- Java中類(lèi)支持多層繼承
栗子 - 包含關(guān)系
需求: 定義老師類(lèi)和學(xué)生類(lèi),然后些代碼測(cè)試;最后找到老師類(lèi)和學(xué)生類(lèi)當(dāng)中的共性內(nèi)容,抽取出一個(gè)父類(lèi),用繼承的方式改寫(xiě)代碼,并進(jìn)行測(cè)試.
// Person.java public 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;} } // Teacher.java public class Teacher extends Person {public Teacher() {}public Teacher(String name, int age) {super(name, age);}public void teach() {System.out.println("老師愛(ài)教書(shū)喲~");} } // Demo.java public class Demo {public static void main(String[] args) {Teacher t1 = new Teacher();t1.setAge(18);t1.setName("Marron");System.out.println(t1.getName() + "," + t1.getAge());t1.teach();Teacher t2 = new Teacher("Mar", 17);System.out.println(t2.getName() + "," + t2.getAge());t2.teach();} }栗子 - 并列關(guān)系
需求: 請(qǐng)采用繼承的思想實(shí)現(xiàn)貓和狗的案例,并在測(cè)試類(lèi)中進(jìn)行測(cè)試
// Animal.java 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;} } // Dog.java public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}public void lookDoor() {System.out.println("狗看門(mén)");} } // Cat.java public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}public void catchMouse() {System.out.println("貓抓老鼠");} }修飾符
包
包: 其實(shí)就是文件夾,對(duì)類(lèi)進(jìn)行分類(lèi)管理
包的定義格式:
- 格式: package 包名; (多級(jí)包名.分開(kāi))
- 范例: package com.marron;
帶包的Java類(lèi)編譯和執(zhí)行:
-
手動(dòng)建包:
- 按照以前的格式編譯java文件: javac HelloWorld.java
- 手動(dòng)創(chuàng)建包: 在磁盤(pán)中建立文件夾com, 然后在com下建立文件家 marron
- 把class文件放到包的最里面: 把HelloWorld.class文件放到com下的marron這個(gè)文件夾下
-
自動(dòng)建包:
- 在使用javac命令編譯的時(shí)候: javac -d . HelloWorld.java
- 執(zhí)行的時(shí)候: java com.marron.HelloWorld
-
附上HelloWorld.java的代碼
導(dǎo)包
使用不同包下的類(lèi)時(shí),使用的時(shí)候要寫(xiě)類(lèi)的全路徑,寫(xiě)起來(lái)太麻煩了
為了簡(jiǎn)化帶包的操作,Java提供了導(dǎo)包的功能
導(dǎo)包的格式:
- 格式: import 包名;
- 范例: import cn.marz.Teacher
修飾符
權(quán)限修飾符
| private | √ | |||
| 默認(rèn) | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
狀態(tài)修飾符 - final
final關(guān)鍵字是最終的意思,可以修飾成員方法,成員變量、類(lèi)
final修飾的特點(diǎn)
- 修飾方法: 表示該方法是最終方法,不能被重寫(xiě)
- 修飾變量: 表示該變量是常量,不能被再次賦值
- 修飾類(lèi): 表示該類(lèi)是最終類(lèi),不能被繼承
final修飾局部變量
- 變量是基本類(lèi)型: final修飾指的是基本類(lèi)型的數(shù)據(jù)值不能發(fā)生改變
- 變量是引用類(lèi)型: final修飾指的是引用類(lèi)型的地址值不能發(fā)生改變,但是地址值里面的內(nèi)容是可以發(fā)生改變的
狀態(tài)修飾符 - static
static關(guān)鍵字是靜態(tài)的意思,可以修飾成員方法、成員變量
public class Student {public String name;public int age;public static String university; // 表示學(xué)校類(lèi)是共享屬性,只能被賦值一次public void show() {System.out.println(name + "," + age + "," + university);} }/* 測(cè)試類(lèi) */ public class StaticDemo{public static void main(String[] args){Student.university = "華中科技大學(xué)";Student s1 = new Student();s1.name = "Marron";s1.age = 18;s1.show();Student s2 = new Student();s2.name = "Mar";s2.age = 17;s2.show();} }static修飾的特點(diǎn)
- 被類(lèi)的所有對(duì)象共享
- 這也是我們判斷是否使用靜態(tài)關(guān)鍵字的條件
- 可以通過(guò)類(lèi)名調(diào)用
- 當(dāng)然,也可以通過(guò)對(duì)象名調(diào)用
static訪問(wèn)特點(diǎn)
- 非靜態(tài)成員方法可以訪問(wèn)所有的靜態(tài)成員(方法)、非靜態(tài)成員(方法)
- 靜態(tài)成員方法中,只能訪問(wèn)靜態(tài)成員(方法)
小結(jié): 靜態(tài)成員方法只能訪問(wèn)靜態(tài)成員
多態(tài)
同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來(lái)的不同形態(tài)
// Animal.java public class Animal {public void eat() {System.out.println("動(dòng)物吃東西");} }// Cat.java public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚(yú)");} }// AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {// 有父類(lèi)引用指向子類(lèi)實(shí)例Animal a = new Cat();} }多態(tài)的前提:
- 有繼承/實(shí)現(xiàn)關(guān)系
- 有方法重寫(xiě)
- 有父類(lèi)引用指向子類(lèi)對(duì)象
多態(tài)中成員訪問(wèn)的特點(diǎn)
// Animal.java public class Animal {public int age = 40;public void eat() {System.out.println("動(dòng)物吃東西");} }// Cat.java public class Cat extends Animal {public int age = 20;public int weight = 10;@Overridepublic void eat() {System.out.println("貓吃魚(yú)");}public void playGame() {System.out.println("貓捉迷藏");} }// AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {// 有父類(lèi)引用指向子類(lèi)對(duì)象Animal a = new Cat();System.out.println(a.age); // System.out.println(a.weight); // 報(bào)錯(cuò)a.eat(); // a.playGame(); // 報(bào)錯(cuò)} }- 成員變量: 編譯看左邊, 執(zhí)行看左邊 a.age全是Animal中的數(shù)據(jù)
- 成員方法: 編譯看左邊,執(zhí)行看右邊eat()方法可以使用,但是playGame()不能
為什么成員變量和成員方法的訪問(wèn)不一樣呢?
- 因?yàn)槌蓡T方法有重寫(xiě),而成員變量沒(méi)有
多態(tài)的好處和弊端
// Animal.java public class Animal {public void eat() {System.out.println("動(dòng)物吃東西");} }// Dog.java public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃骨頭");} }// Cat.java public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚(yú)");} }// AnimalOperator.java public class AnimalOperator {/* 這里就用到了多態(tài)Animal a = new Cat();Animal a = new Dog();// 編譯看Animal中有無(wú)eat方法, 執(zhí)行分別看Cat和Dog中eat方法是否重寫(xiě)*/public void useAnimal(Animal a) {a.eat();} }// 測(cè)試類(lèi): AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {// 創(chuàng)建動(dòng)物操作類(lèi)的對(duì)象,調(diào)用方法AnimalOperator ao = new AnimalOperator();Cat c = new Cat();ao.useAnimal(c);Dog d = new Dog();ao.useAnimal(d);} }- 多態(tài)的好處: 提高了程序的擴(kuò)展性
- 具體體現(xiàn): 定義方法的時(shí)候,使用父類(lèi)型作為參數(shù),將來(lái)在使用的時(shí)候,使用具體的子類(lèi)型參與操作
- 多態(tài)的弊端: 不能使用子類(lèi)的特有功能
多態(tài)中的轉(zhuǎn)型
public class Animal {public void eat() {System.out.println("動(dòng)物吃東西");} }public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚(yú)");}public void playGame() {System.out.println("貓捉迷藏");} }public class AnimalDemo {public static void main(String[] args) {// 多態(tài)Animal a = new Cat(); // 向上轉(zhuǎn)型:子類(lèi)對(duì)象轉(zhuǎn)為父類(lèi)a.eat();// 向下轉(zhuǎn)型Cat c = (Cat) a;c.eat();c.playGame();} }栗子
需求: 用多態(tài)的思想實(shí)現(xiàn)貓和狗的案例,并在測(cè)試類(lèi)中進(jìn)行測(cè)試
// Animal.java 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("動(dòng)物吃東西");} }// Cat.java public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("貓吃魚(yú)");} }// AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {Animal a = new Cat();a.setName("加菲");a.setAge(5);System.out.println(a.getName() + "," + a.getAge());a.eat();a = new Cat("加菲", 5);System.out.println(a.getName() + "," + a.getAge());a.eat();} }抽象類(lèi)
在Java中,一個(gè)沒(méi)有方法體得方法應(yīng)該定義為抽象方法,而類(lèi)如果有抽象方法,改類(lèi)必須定義為抽象類(lèi)
抽象類(lèi)的特點(diǎn)
-
抽象類(lèi)和抽象方法必須使用abstract關(guān)鍵字修飾
- public abstract class 類(lèi)名 {}
- public abstract void eat()
-
抽象類(lèi)中不一定有抽象方法,有抽象方法的類(lèi)一定是抽象類(lèi)
-
抽象類(lèi)不能實(shí)例化
- 抽象類(lèi)如何實(shí)例化? 參照多態(tài)的方式,通過(guò)子類(lèi)對(duì)象實(shí)例化,這叫抽象類(lèi)多態(tài)
-
抽象類(lèi)的子類(lèi)
- 要么重寫(xiě)抽象類(lèi)中的所有抽象方法
- 要么是抽象類(lèi)
抽象類(lèi)的成員特點(diǎn)
-
成員變量:
- 可以是變量: private int age = 20
- 也可以是常量: private final String city = "武漢"
-
構(gòu)造方法:
- 有構(gòu)造方法,但是不能實(shí)例化
- 構(gòu)造方法用于子類(lèi)訪問(wèn)父類(lèi)數(shù)據(jù)的初始化
-
成員方法:
- 可以是抽象方法: 限定子類(lèi)必須完成某些動(dòng)作
- 也可以是非抽象方法: 提高代碼的復(fù)用性
接口
接口: 就是一種公共的規(guī)范標(biāo)準(zhǔn),只要符合規(guī)范,大家都可以通用
Java中的接口更多的體現(xiàn)在對(duì)行為的抽象
接口的特點(diǎn)
-
接口用關(guān)鍵字interface修飾
- public interface Jumpping {public abstract void jump(); }
-
類(lèi)實(shí)現(xiàn)接口用implements表示
- public class Cat implements Jumpping{@overridepublic void jump(){System.out.print("貓可以跳高了");} }
-
接口不能實(shí)例化
- 如何實(shí)現(xiàn)接口實(shí)例化? 參照多態(tài)的實(shí)現(xiàn)方式,通過(guò)實(shí)現(xiàn)類(lèi)對(duì)象實(shí)例化,這叫接口多態(tài)
多態(tài)的形式: 具體類(lèi)多態(tài)、抽象類(lèi)多態(tài)、接口多態(tài)
多態(tài)的前提: 有繼承或者實(shí)現(xiàn)關(guān)系; 有方法重寫(xiě); 有父(類(lèi)/接口)引用指向(子/實(shí)現(xiàn))類(lèi)對(duì)象
- 接口的實(shí)現(xiàn)類(lèi):
- 要么重寫(xiě)接口中的所有抽象方法
- 要么是抽象類(lèi)
接口的成員特點(diǎn)
-
成員變量:
- 只能是常量
- 默認(rèn)修飾符: public static final
-
構(gòu)造方法
- 接口沒(méi)有構(gòu)造方法,因?yàn)榻涌谥饕菍?duì)行為進(jìn)行抽象的,是沒(méi)有具體存在
- 一個(gè)類(lèi)如果沒(méi)有父類(lèi),默認(rèn)繼承自O(shè)bject類(lèi)
-
成員方法
- 只能是抽象方法
- 默認(rèn)修飾符: public abstract
類(lèi)和接口的關(guān)系
-
類(lèi)和類(lèi)的關(guān)系
- 繼承關(guān)系, 只能單繼承,但是可以多層繼承
-
類(lèi)和接口的關(guān)系
- 實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn),還可以在繼承一個(gè)類(lèi)的同時(shí)實(shí)現(xiàn)多個(gè)接口
- public class InterImpl extends Object implements Inter1, Inter2, Inter3
-
接口和接口的關(guān)系
- 繼承關(guān)系, 可以單繼承,也可以多繼承
- public interface Inter2 extends Inter1, Inter3
抽象類(lèi)和接口的區(qū)別
| 成員區(qū)別 | 既有變量也有常量; 既有抽象方法,也有非抽象方法 | 只要常量(final)和抽象方法 |
| 設(shè)計(jì)理念區(qū)別 | 對(duì)類(lèi)抽象,包括屬性和行為 | 對(duì)行為抽象,主要是行為 |
【小栗子】: 門(mén)和警報(bào)
需求: 門(mén): 有open()和close()兩個(gè)動(dòng)作,下面使用抽象類(lèi)和接口來(lái)定義這個(gè)抽象概念.有的門(mén)具備報(bào)警功能,有的門(mén)不具備.因此可如下設(shè)計(jì).
public interface Alarm{void alarm(): }public abstract class Door{public abstract void open();public abstract void close(); } public class AlaramDoor extends Door implements Alarm {@overridepublic void open(){// ...}@overridepublic void close(){// ...}@overridepublic void alarm(){// ...} }在這里,我們?cè)俅螐?qiáng)調(diào)抽象類(lèi)是對(duì)事物的抽象,而接口是對(duì)行為的抽象.
形參和返回值
抽象類(lèi)名作為形參和返回值
- 方法的形參是抽象類(lèi)型,其實(shí)需要的是該抽象類(lèi)的子類(lèi)對(duì)象
- 方法的返回值是抽象類(lèi)名,其實(shí)返回的是該抽象類(lèi)的子類(lèi)對(duì)象
接口名作為形參和返回值
-
方法的形參是接口名,其實(shí)需要的是該接口的實(shí)現(xiàn)類(lèi)對(duì)象
-
方法的返回值是接口名,其實(shí)返回的是該接口的實(shí)現(xiàn)類(lèi)對(duì)象
內(nèi)部類(lèi)
內(nèi)部類(lèi): 就是在一個(gè)類(lèi)中定義一個(gè)類(lèi)
public class Outer{public class Inner{} }內(nèi)部類(lèi)與外部類(lèi)的交互
public class Outer {private int num = 10;public class Inner {public void show() {// 內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的私有變量System.out.println(num);}}// 外部類(lèi)使用內(nèi)部類(lèi)時(shí),需要先new一個(gè)內(nèi)部類(lèi)實(shí)例public void method(){Inner i = new Inner();i.show();} }成員內(nèi)部類(lèi)
成員內(nèi)部類(lèi): 在類(lèi)中定義的類(lèi)
public class Outer {private int num = 10;public class Inner {public void show() {System.out.println(num);}} }- 訪問(wèn)如下:
一般來(lái)說(shuō),我們創(chuàng)建內(nèi)部類(lèi),就是不希望該類(lèi)直接被引用
可以參照類(lèi)的形式,為內(nèi)部類(lèi)添加一個(gè)訪問(wèn)方法
// Outer.java public class Outer{private int num = 10;private class Inner{public void show(){System.out.println(num);}}public void innerShow() {Inner i = new Inner();i.show();} }// InnerDemo.java public class InnerDemo{public static void main(String[] args){Outer o = new Outer();o.innerShow();} }局部?jī)?nèi)部類(lèi)
寫(xiě)在外部類(lèi)的方法里面
// Outer.java public class Outer{private int num = 10;public void method(){class Inner{public void show(){System.out.println(num);}}} }局部?jī)?nèi)部類(lèi)的調(diào)用,需要在外部類(lèi)的方法中創(chuàng)建這個(gè)局部?jī)?nèi)部類(lèi)的實(shí)例,然后間接調(diào)用局部?jī)?nèi)部類(lèi)的方法
// Outer.java public class Outer{private int num = 10;public void method(){Class Inner{public void show(){System.out.println(num);}}Inner i = new Inner();i.show();} }// InnerDemo.java public class InnerDemo{public static void main(String[] args){Outer o = new Outer();o.method();} }匿名內(nèi)部類(lèi)
new Inter(){public void show(){// ...} }本質(zhì): 是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)匿名對(duì)象
上面提及繼承類(lèi)或者接口,那么首先得有一個(gè)接口
// Inter.java public interface Inter{void show(); }// Outer.java // 在Outer類(lèi)中實(shí)現(xiàn)匿名內(nèi)部類(lèi) public class Outer{public void method(){Inter i = new Inter(){@Overridepublic void show(){System.out.println("匿名內(nèi)部類(lèi)");}};i.show(); // 調(diào)用重寫(xiě)后的show方法i.show();} }// 測(cè)試類(lèi): OuterDemo.java public class OuterDemo{public static void main(String[] args){Outer o = new Outer();o.method();} }【小栗子】
// Jumpping.java public interface Jumpping{void jump(); }// JunmppingOperator.java public class JumppingOperator{public void method(Jumping j){j.jump();} }以上有一個(gè)接口Jumping以及一個(gè)接口操作類(lèi)JumppingOperator, 接口中定義的方法是抽象的.因此調(diào)用需要使用匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)
// JumppingDemo.java public class JumppingDemo{public static void main(String[] args){JumppingOperator jo = new JumppingOperator();jo.method(new Jumpping(){@Overridepublic void jump(){System.out.println("貓可以跳高高了");}})} }總結(jié)
以上是生活随笔為你收集整理的Java --- 基础学习Ⅱ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最有效的清理C盘/win10如何给系统盘
- 下一篇: java美元兑换,(Java实现) 美元