Java笔记 - 黑马程序员_03(继承,修饰符,多态,抽象类,接口,内部类)
1. 繼承
1.1 繼承的概述
繼承是面向?qū)ο笕筇卣髦???梢允沟米宇惥哂懈割愒氐膶傩院头椒?#xff0c;還可以在子類中重新定義,追加屬性和方法。
繼承的格式:
-
格式:public class 子類名 extends 父類名
-
案例:public class ZI extends FU{}
-
FU類為父類(superclass),超類,基類
-
ZI類為子類(subclass),派生類,擴(kuò)展類
繼承中子類的特點(diǎn):
-
子類可以有父類的內(nèi)容
-
子類也可以有自己特有的內(nèi)容
1.2 繼承的好處和弊端
好處:
-
提高代碼的復(fù)用性(多個(gè)類相同的成員可以放到同一個(gè)類中)
-
提高代碼的維護(hù)性(如果方法的代碼需要修改,修改一處即可)
弊端:
-
繼承讓類與類之間產(chǎn)生了關(guān)系,類的耦合性增強(qiáng),當(dāng)父類發(fā)生變化時(shí)子類實(shí)現(xiàn)也不得不跟著變化,削弱了子類的獨(dú)立性。
什么時(shí)候使用繼承?
-
假設(shè)法:有兩個(gè)類A與B,如果他們之間滿足A是B的一種,或者B是A的一種,就說明他們之間存在著繼承關(guān)系,這個(gè)時(shí)候他們存在著繼承關(guān)系,可以考慮使用繼承,否則不能濫用繼承
-
例如:蘋果和水果,貓和動(dòng)物(都可使用繼承),貓和狗(不能使用繼承)
1.3繼承中變量的訪問
在子類方法中訪問一個(gè)變量的訪問順序:
子類局部范圍找
子類成員范圍找
父類成員范圍找
如果都沒有就報(bào)錯(cuò)(不考慮父類以上的)
1.4 super關(guān)鍵字
super關(guān)鍵字和this關(guān)鍵字的用法相似之處
-
this:代表本類對(duì)象的引用(this關(guān)鍵字指向調(diào)用該方法的對(duì)象)
-
super:代表父類存儲(chǔ)空間的標(biāo)識(shí)(可以理解為父類引用對(duì)象)
| this | this.成員變量 訪問本類成員變量 | this(.....) 訪問本類構(gòu)造方法 | this.成員方法(....) 訪問本類成員方法 |
| super | super.成員變量 訪問父類成員變量 | super(.....) 訪問父類構(gòu)造方法 | super.成員方法(....) 訪問fu類成員方法 |
1.5 繼承中構(gòu)造方法的訪問特點(diǎn)
子類中所有的構(gòu)造方法默認(rèn)都會(huì)訪問父類中無參的構(gòu)造方法:
-
因?yàn)樽宇悤?huì)繼承父類中的數(shù)據(jù),可能還會(huì)使用父類的數(shù)據(jù)。所以,子類初始化之前,一定要先完成父類數(shù)據(jù)的初始化
-
每一個(gè)子類構(gòu)造方法的第一條語句默認(rèn)都是:super()
如果父類沒有無參構(gòu)造方法,只有帶參構(gòu)造方法,該怎么辦?
通過使用super關(guān)鍵字去 顯示的調(diào)用父類帶參構(gòu)造方法
在父類中自己提供一個(gè)無參構(gòu)造方法
推薦:自己給出無參構(gòu)造方法
//1. package extendsDemo; ? public class Fu {/* public Fu(){System.out.println("fu中無參構(gòu)造方法");}*/ ?public Fu(int age){System.out.println("fu中有參構(gòu)造方法");} } ? //2. package extendsDemo; ? public class Zi extends Fu{public Zi(){ // ? super(); ? 系統(tǒng)默認(rèn)調(diào)用父類無參構(gòu)造方法super(20);System.out.println("zi中無參構(gòu)造方法");} ?public Zi(int age){ // ? super(); ? 系統(tǒng)默認(rèn)調(diào)用父類無參構(gòu)造方法super(19);System.out.println("zi中有參構(gòu)造方法");} } ? //3.測(cè)試類 package extendsDemo; ? public class Demo {public static void main(String[] args) {//創(chuàng)建對(duì)象,調(diào)用方法Zi z= new Zi();Zi z1 = new Zi(18);} } ? //運(yùn)行結(jié)果 fu中有參構(gòu)造方法 zi中無參構(gòu)造方法 fu中有參構(gòu)造方法 zi中有參構(gòu)造方法1.6 繼承中成員方法的訪問特點(diǎn)
通過子類對(duì)象訪問一個(gè)方法:(就近原則)
子類成員范圍找
父類成員范圍找
如果沒有就報(bào)錯(cuò)(不考慮父類以上)
1.7 super內(nèi)存圖
點(diǎn)擊觀看視頻詳解
1.8 方法重寫
方法重寫概述:
-
子類中出現(xiàn)了和父類一摸一樣的方法聲明
方法重寫的應(yīng)用:
-
當(dāng)子類需要父類的功能,而主題子類有著自己特有的內(nèi)容時(shí),可以重寫父類方法,這樣,即沿襲了父類的功能,又定義了子類特有的內(nèi)容
@Override
-
是一個(gè)注解
-
可以幫助我們檢查重寫的方法的 方法聲明的正確性
方法重寫注意事項(xiàng):
-
私有方法不能被重寫(父類中private修飾 的不能在子類中 直接訪問??梢酝ㄟ^間接的手段來訪問。通過get方法來訪問)
-
子類方法的訪問權(quán)限不能低于父類(public > 默認(rèn) > 私有)
1.10 Java中繼承的注意事項(xiàng)
Java中類只支持單繼承,不支持多繼承
Java支持多層繼承(間接繼承)
????????例如:class C extends B,class B extends A,
????????也就 是說,C 直接繼承 B,其實(shí) C 還間接繼承 A
1.11 案例
1. 老師和學(xué)生:
需求:定義老師類和學(xué)生類,找到老師類和學(xué)生類的共性內(nèi)容,抽取一個(gè)父類,用繼承的方式改寫代碼,并進(jìn)行測(cè)試
思路:
共性父類,定義人類(姓名, 年齡)
定義老師類,繼承人類,給出自己的方法:教書()
定義老師類,繼承人類,給出自己的方法:學(xué)習(xí)()
定義測(cè)試類,寫代碼測(cè)試
2.貓和狗
需求:采用繼承的思想實(shí)現(xiàn)貓和狗的案例,并在測(cè)試類中進(jìn)行測(cè)試
共性:
成員變量:姓名,年齡;構(gòu)造方法:無參,帶參;成員方法:get/set方法
//1. package catAndDog; ? public class Cat extends Animal {public Cat() {} ?public Cat(String name, int age) {super(name, age); //調(diào)用父} ?public static void show(){System.out.println("抓老鼠");} } ? //2.package catAndDog; ? public class Dog extends Animal {public Dog() {} ?public Dog(String name, int age) {super(name, age);} ?public static void method(){System.out.println("看家");} } ? //3. package catAndDog; ? 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 static void fn(String dos){System.out.println(dos);} } ? //4. package catAndDog; ? public class Demo {public static void main(String[] args) {Dog an = new Dog("ww",2);System.out.println(an.getName()+", "+an.getAge());an.method();an.fn("看門"); ?Cat ca = new Cat("mm",1);System.out.println(ca.getName()+", "+ca.getAge());ca.show();ca.fn("抓小雞");} } ? //運(yùn)行結(jié)果 ww, 2 看家 看門 mm, 1 抓老鼠 抓小雞2. 修飾符
2.1包的概述和使用
其實(shí)就是文件夾 作用:對(duì)類進(jìn)行分類管理 包的定義格式
格式:package包名; (多級(jí)包用分開)
范例:package com.itheima; 帶包的)ava類編譯和執(zhí)行
手動(dòng)建包:
1.按照以前的格式編譯java文件???????????????? javac HelloWorld.java
2.手動(dòng)創(chuàng)建包 ????????????????在E盤建立文件夾com,然后在com下建立文件夾theima
3.把class文件放到包的最里面 ????????????把HelloWorld.class文件放到com下的Jitheimai這個(gè)文件夾下
4.帶包執(zhí)行 ????????????????java com.itheima.HelloWorld
自動(dòng)建包:
javac-d,HelloWorld.java ????????????????java com.itheima.HelloWorld
2.2導(dǎo)包的概述和使用
使用不同包下的類時(shí),使用的時(shí)候要寫類的全路徑,寫起來太麻煩了 為了簡(jiǎn)化帶包的操作,Jva就提供了導(dǎo)包的功能
導(dǎo)包的格式:
1. 格試:import包名:
2. 范例:import cn.itcast..Teacher
為了簡(jiǎn)化帶包的操作,Jva就提供了導(dǎo)包的功能
導(dǎo)包的格式
格試:import? 包名:
-
范例:importcn.itcast.Teacher
2.3 修飾符權(quán)限
| private | yes | no | no | no |
| 默認(rèn) | yes | yes | no | no |
| protected | yes | yes | yes | no |
| public | yes | yes | yes | yes |
2.4 final
final關(guān)鍵字是最終的意思,可以修飾成員方法,成員變量,類
final修飾的特點(diǎn):
-
修飾方法:表明該方法是最終的方法,不能被重寫
-
修飾變量:表明該變量是常量,不能再次被賦值
-
修飾類:表明該類是最終類,不能被繼承
final修飾局部變量
-
變量是基本類型:final修飾指的是基本類型的數(shù)據(jù)值不能發(fā)生改變
-
變量是引用類型:final修飾指的是引用類型的地址值不能發(fā)生改變,但是地址里面的內(nèi)容是可以改變的
代碼塊 -- new
代碼塊概述:
-
代碼塊是類的成分之一(成員變量、構(gòu)造器,方法,代碼塊,內(nèi)部類Java類中,使用{ }括起來的代碼被稱為代碼塊。
-
在Java類中,使用{}括起來的代碼被稱為代碼塊。
代碼塊分為:
-
構(gòu)造代碼塊
-
格式:{}
-
特點(diǎn):每次構(gòu)造方法執(zhí)行之前,都會(huì)先執(zhí)行構(gòu)造代碼塊的代碼。
-
使用場(chǎng)景:將多個(gè)構(gòu)造方法中相同的代碼,抽取到構(gòu)造代碼塊中,提高代碼的復(fù)用性。 靜態(tài)代碼塊
-
靜態(tài)的代碼塊
-
格式:static{}
-
特點(diǎn):隨著類的加載而觸發(fā)執(zhí)行,并且只會(huì)執(zhí)行一次。
-
使用場(chǎng)景:在類加載的時(shí)候做一些靜態(tài)數(shù)據(jù)初始化的操作,以便后續(xù)對(duì)象可以使用。
2.5 static
static關(guān)鍵字是靜態(tài)的意思,可以修飾成員變量,成員方法
static修飾的特點(diǎn):
-
被類的所有對(duì)象共享;這是判斷是否使用靜態(tài)關(guān)鍵字的條件
-
可以通過類名調(diào)用;也可以通過對(duì)象名調(diào)用;推薦使用類名調(diào)用
2.6 static訪問特點(diǎn)
非靜態(tài)成員方法:
-
能訪問靜態(tài)的成員變量
-
能訪問非靜態(tài)的成員變量
-
能訪問靜態(tài)的成員方法
-
能訪問非靜態(tài)的成員方法
靜態(tài)成員方法:
-
能訪問靜態(tài)成員變量
-
能訪問靜態(tài)成員方法
總結(jié):靜態(tài)成員方法只能訪問靜態(tài)成員
3. 多態(tài)
3.1 多態(tài)的概述
-
同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來的不同形態(tài)
-
多種形態(tài),多種狀態(tài),編譯和運(yùn)行有兩個(gè)不同的狀態(tài)。
編譯期叫做靜態(tài)綁定。
運(yùn)行期叫做動(dòng)態(tài)綁定。
-
Animal a = new Cat();
? ? ? ? 1. a.eat();
? ? ? ? 2. 父類引用指向子類對(duì)象
????????3. 編譯的時(shí)候編譯器發(fā)現(xiàn)a的類型是Animal,所以編譯器會(huì)去Animal類中找eat()方法
? ? ? ? 4. 找到了,綁定,編譯通過。但是運(yùn)行的時(shí)候和底層堆內(nèi)存當(dāng)中的實(shí)際對(duì)象有關(guān)
? ? ? ? 5.?真正執(zhí)行的時(shí)候會(huì)自動(dòng)調(diào)用“堆內(nèi)存中真實(shí)對(duì)象”的相關(guān)方法。
多態(tài)在開發(fā)中的作用是: 降低程序的耦合度,提高程序的擴(kuò)展力。
多態(tài)的前提和實(shí)現(xiàn):
有繼承/實(shí)現(xiàn)關(guān)系
有方法重寫
有父類引用指向子類對(duì)象
3.2 多態(tài)中成員訪問特點(diǎn)
成員變量:編譯看左邊,執(zhí)行看左邊
成員方法:編譯看左邊,執(zhí)行看右邊
為什么成員變量和成員方法不一樣?
-
因?yàn)槌蓡T方法有重寫,成員變量沒有
3.3 多態(tài)的好處和弊端
-
多態(tài)的好處:提高程序的擴(kuò)展性
具體體現(xiàn):定義方法的時(shí)候,使用父類型作為參數(shù),將來使用的時(shí)候,使用具體的子類型參與操作
-
多態(tài)的弊端:不能使用子類的特有功能
3.4 多態(tài)中的轉(zhuǎn)型
向上轉(zhuǎn)型:子--->父 (upcasting) 又被稱為自動(dòng)類型轉(zhuǎn)換:Animal a = new Cat();
向下轉(zhuǎn)型:父--->子 (downcasting) 又被稱為強(qiáng)制類型轉(zhuǎn)換:Cat c = (Cat)a; 需要添加強(qiáng)制類型轉(zhuǎn)換符。
什么時(shí)候需要向下轉(zhuǎn)型?
1.需要調(diào)用或者執(zhí)行子類對(duì)象中特有的方法。
2.必須進(jìn)行向下轉(zhuǎn)型,才可以調(diào)用。
向下轉(zhuǎn)型有風(fēng)險(xiǎn)嗎?
1.容易出現(xiàn)ClassCastException(類型轉(zhuǎn)換異常)
怎么避免這個(gè)風(fēng)險(xiǎn)?
1. instanceof運(yùn)算符,可以在程序運(yùn)行階段動(dòng)態(tài)的判斷某個(gè)引用指向的對(duì)象是否為某一種類型。
不管是向上轉(zhuǎn)型還是向下轉(zhuǎn)型,首先他們之間必須有繼承關(guān)系,這樣編譯器就不會(huì)報(bào)錯(cuò)。
//1. package demo_01; ? public class Animal {public void eat(){System.out.println("吃東西");} } ? //2. package demo_01; ? public class Cat extends Animal{@Overridepublic void eat() {System.out.println("貓吃魚");}public void show(){System.out.println("貓捉老鼠");} } ? //3.測(cè)試類 package demo_01; ? public class AnimalDemo {public static void main(String[] args) {//父類引用指向子類對(duì)象Animal a = new Cat();a.eat(); // 報(bào)錯(cuò) ? ? ? a.show();//向下轉(zhuǎn)型Cat b = (Cat)a;b.eat();b.show();} } 3.5 貓和狗(多態(tài)版) //1. package catAndDog; ? 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("吃東西");} } ? //2. package catAndDog; ? public class Dog extends Animal{public Dog() {} ?public Dog(String name, int age) {super(name, age);} ?@Overridepublic void eat() {System.out.println("餓狗撲食");} ?public void show(){System.out.println("小狗玩耍");} } ? //3.測(cè)試類 package catAndDog; ? import demo_01.Cat; ? public class AnimalDemo {public static void main(String[] args) {//父類引用指向子類對(duì)象,創(chuàng)建對(duì)象Animal a = new Dog("小黃", 6);a.eat(); // ? ? ? a.show(); 報(bào)錯(cuò)System.out.println("--------------"); ?//向下轉(zhuǎn)型Dog d = (Dog) a;d.eat();d.show();System.out.println("--------------"); ?/* Dog s = new Dog("小紅", 2);s.show();s.eat();*/} } ? //運(yùn)行結(jié)果 餓狗撲食 -------------- 餓狗撲食 小狗玩耍 --------------4. 抽象類
4.1 抽象類的概念
在Java中,一個(gè)沒有方法體的方法應(yīng)該定義為抽象方法,而類中的如果有抽象方法,該類必須定義為抽象類
package demo_01; ? public abstract class Animal { ?public abstract void eat(); ? }4.2 抽象類的特點(diǎn)
-
抽象類和抽象方法必須用abstract關(guān)鍵字修飾?
public abstract class 類名{}
public abstract void eat();
-
抽象類不一定有抽象方法,有抽象方法的類一定是抽象類
-
抽象類不能實(shí)例化
抽象類如何實(shí)例化呢?參照多態(tài)的形式,通過子類對(duì)象實(shí)例化,這叫抽象類多態(tài)
-
抽象的子類
1.要么重寫抽象類中的所有抽象方法
2.要么是抽象類
4.3 抽象類的成員特點(diǎn)
-
成員變量
可以是變量
也可以是常量
-
構(gòu)造方法
有構(gòu)造方法,但不能實(shí)例化
構(gòu)造方法的作用是什么呢?用于子類訪問父類數(shù)據(jù)的初始化
-
成員方法
可以有抽象方法:限定子類必須完成某些動(dòng)作
也可以有非抽象方法:提高代碼復(fù)用性
4.4 貓和狗(抽象類版)
需求:采用抽象類的思想實(shí)現(xiàn)貓和狗的案例,并在測(cè)試類中進(jìn)行測(cè)試
//1.定義抽象類 package catAndDog; ? 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(); } ? //2. package catAndDog; ? public class Cat extends Animal{public Cat() {} ?public Cat(String name, int age) {super(name, age);} ?@Overridepublic void eat() {System.out.println("小貓吃魚");} ?public void show(){System.out.println("66666666");} } ? //3.測(cè)試類 package catAndDog; ? public class AnimalDemo {public static void main(String[] args) {Animal a = new Cat();a.setName("大菊");a.setAge(2);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();System.out.println("--------------"); ?Cat b = (Cat) a;b.show();} } ? //運(yùn)行結(jié)果 大菊, 2 小貓吃魚 -------------- 小黃, 3 小貓吃魚 -------------- 666666665. 接口
5.1 接口概述
-
接口就是一種公共的規(guī)范標(biāo)識(shí),只要符合標(biāo)準(zhǔn)規(guī)范,大家可以共享
-
Java中的接口更多體現(xiàn)在對(duì)行為的抽象
5.2 接口的特點(diǎn)
-
接口用關(guān)鍵字interface修飾
public interface 接口名{}
-
類實(shí)現(xiàn)接口implements接口名{}
public class 類名 implements 接口名{}
-
接口不能實(shí)例化
1.接口如何實(shí)例化? 參照多態(tài)的方式,通過實(shí)現(xiàn)子類對(duì)象實(shí)例化,這叫接口實(shí)例化
2.多態(tài)的形式:具體類多態(tài), 抽象類多態(tài), 接口多態(tài)
-
接口實(shí)現(xiàn)類
1.要么重寫接口中的所有抽象方法
2.要么是抽象類
5.3 接口成員的特點(diǎn)
-
成員變量
只能是常量
默認(rèn)修飾符:public static final(可省略)
-
構(gòu)造方法
1. 接口沒有構(gòu)造方法,因?yàn)榻涌谥饕菍?duì)行為進(jìn)行抽象的,是沒有具體存在的
2. 一個(gè)類如果沒有父類,默認(rèn)繼承Object
-
成員方法
-
只能是抽象方法
-
默認(rèn)修飾符:public abstract
5.4 貓和狗(接口版)
需求:對(duì)貓和狗進(jìn)行訓(xùn)練,他們就可以調(diào)高,這里加入了調(diào)高功能,請(qǐng)采用抽象類和接口來實(shí)現(xiàn)貓和狗案例
//1.定義接口 package catAndDog; ? public interface Jumpping {public abstract void jump(); } ? //2.定義動(dòng)物類 package catAndDog; ? public abstract class Animal {private String namne;private int age; ?public Animal() {} ?public Animal(String namne, int age) {this.namne = namne;this.age = age;} ?public String getNamne() {return namne;} ?public void setNamne(String namne) {this.namne = namne;} ?public int getAge() {return age;} ?public void setAge(int age) {this.age = age;} ?public abstract void eat(); } ? //3.定義貓類 package catAndDog; ? public class Cat extends Animal implements Jumpping{public Cat() {} ?public Cat(String namne, int age) {super(namne, age);} ?@Overridepublic void eat() {System.out.println("小貓吃魚");} ?@Overridepublic void jump() {System.out.println("小貓?zhí)?#34;);} } ? //4.測(cè)試類 package catAndDog; ? public class AnimalDemo {public static void main(String[] args) {Jumpping j = new Cat();j.jump();System.out.println("--------------"); ?Animal a = new Cat("加菲貓", 3);System.out.println(a.getNamne() + ", " + a.getAge());a.eat(); // ? ? ? a.jump(); ? ? 報(bào)錯(cuò)System.out.println("--------------"); ?a = new Cat("大菊", 2);System.out.println(a.getNamne() + ", " + a.getAge());a.eat();} ? } ? //運(yùn)行結(jié)果 小貓?zhí)?-------------- 加菲貓, 3 小貓吃魚 -------------- 大菊, 2 小貓吃魚5.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)系,可以單繼承,也可以多繼承
//接口1 package Demo_02; ? public interface Inter1 { } ? //接口2 package Demo_02; ? public interface Inter2 { } ? //接口3 package Demo_02; ? public interface Inter3 extends Inter1, Inter2 {//接口和接口的關(guān)系 } ? //創(chuàng)建類 package Demo_02; ? public class Demo extends Object implements Inter1,Inter2{//類和接口的關(guān)系(繼承Object,體現(xiàn)Inter1,Inter2) }5.6 抽象類和接口的區(qū)別
-
成員區(qū)別
抽象類:變量,常量;有構(gòu)造方法;有抽象方法,也有非抽象方法
接口:常量,抽象方法
-
關(guān)系區(qū)別
類與類:繼承,單繼承
類與接口:實(shí)現(xiàn),可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)
接口與接口:繼承,單繼承,多繼承
-
設(shè)計(jì)理念區(qū)別
抽象類:對(duì)類抽象,包括屬性和行為
接口:對(duì)行為抽象,主要是行為
//1.定義接口 package Demo_02; ? public interface Inter1 {void jump(); } ? //2.定義貓類 package Demo_02; ? public abstract class Cat {public abstract void eat(); } ? //3.測(cè)試類 package Demo_02; ? public class Demo extends Cat implements Inter1{@Overridepublic void jump() {//方法體} ?@Overridepublic void eat() {//方法體} }2.接口組成更新概述
2.1接口組成
常量?? ?public ?static final
?抽象方法 ? ?public abstract
默認(rèn)方法(Java8)
靜態(tài)方法(Java8)
私有方法(Java9)
2.2接口中默認(rèn)方法
接口中默認(rèn)方法的定義格式:
- 格式:public default ?返回值類型方法名(參數(shù)列表){}
- 范例:public default void show(){}
接口中默認(rèn)方法的注意事項(xiàng):
- 默認(rèn)方法不是抽象方法,所以不強(qiáng)制被重寫。但是可以被重寫,重寫的時(shí)候去掉default關(guān)鍵字
- public可以省略,default不能省略
2.3接口中靜態(tài)方法
接口中靜態(tài)方法的定義格式:
- 格式:public static ?返回值類型方法名(參數(shù)列表){}
- 范例:public static void show(){}
接口中靜態(tài)方法的注意事項(xiàng):
- 靜態(tài)方法只能通過接口名調(diào)用,不能通過實(shí)現(xiàn)類名或者對(duì)象名調(diào)用
- public可以省略,static不能省略
2.4 接口中的私有方法
接口中私有方法的定義格式:
- 格式1:private返回值類型方法名(參數(shù)列表){}
- 范例1:private void show() {}
- 格式2:private static 返回值類型方法名(參數(shù)列表){}
- 范例2:private static void method(){}
接口中私有方法的注意事項(xiàng):
- 默認(rèn)方法可以調(diào)用私有的靜態(tài)方法和非靜態(tài)方法
- 靜態(tài)方法只能調(diào)用私有的靜態(tài)方法
6. 形參和返回值
6.1 類名作為形參和返回值
-
方法的形參是類名,其實(shí)需要的是該類的對(duì)象
-
方法的返回值類名,其實(shí)返回的是該類的對(duì)象
6.2 抽象類名作為形參和返回值
-
方法的形參是抽象類名,其實(shí)需要的是該抽象類的子類對(duì)象
-
方法的返回值是抽象類名,其實(shí)返回的是該抽象類的子類對(duì)象
6.3 接口名作為形參和返回值
-
方法的形參是接口名,其實(shí)需要的是該接口的實(shí)現(xiàn)類對(duì)象
-
方法的返回值是接口名,其實(shí)返回的是該接口的實(shí)現(xiàn)類對(duì)象
7. 內(nèi)部類
7.1 內(nèi)部類概述
-
內(nèi)部類:就是在一個(gè)類中定義一個(gè)類。
-
舉例:在一個(gè)類A的內(nèi)部定義一個(gè)類B,類B就被稱為內(nèi)部類
-
內(nèi)部類的定義格式
-
格式:
public class 類名{
修飾符 class 類名{
}
}
-
內(nèi)部類的訪問特點(diǎn):
內(nèi)部類可以訪問外部類的成員,包括私有
外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對(duì)象
7.2 成員內(nèi)部類
按照內(nèi)部類在類中定義的位置不同,可以分為如下兩種形式:
-
在類的成員位置:成員內(nèi)部類(在成員變量定義的類)
-
在類的局部位置:局部?jī)?nèi)部類(在方法中定義的類)
成員內(nèi)部類,外界如何使用呢?
-
格式:外部類名.內(nèi)部類名 對(duì)象明 = 外部類對(duì)象.內(nèi)部類對(duì)象
-
范例:Outer.Inner oi = new Outer().new Inner();
局部?jī)?nèi)部類:
-
局部?jī)?nèi)部類是在方法中定義的類,所以外界是無法直接使用,需要在方法內(nèi)部創(chuàng)建對(duì)象并使用,該類可以直接訪問外部類的成員,也可以訪問的方法內(nèi)的局部變量
7.3 匿名內(nèi)部類
前提:存在一個(gè)類或者接口,在這里類可以是具體的類也可以是抽象的類
-
格式:
new 類名或者接口名(){
重寫方法;
};
-
范例:
new Inter(){
public void show(){
}
};
-
本質(zhì):是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象
7.4 匿名內(nèi)部類在開發(fā)中的使用
//1.跳高接口 package Demo_03; // public interface Jumpping {void jump(); } ? //2.接口操作類,里面有一個(gè)方法,方法的參數(shù)是接口名 package Demo_03; ? public class JumppingOpertor {public void method(Jumpping j){j.jump();} } ? //3.接口實(shí)現(xiàn)類 package Demo_03; ? public class Cat implements Jumpping{@Overridepublic void jump() {System.out.println("小貓?zhí)吡?#34;);} } ? //4.測(cè)試類 package Demo_03; ? public class JumppingDemo {public static void main(String[] args) {//創(chuàng)建接口操作類對(duì)象,調(diào)用method方法JumppingOpertor s = new JumppingOpertor();Jumpping c = new Cat();s.method(c);System.out.println("-----------"); ?//匿名函數(shù)作為參數(shù)調(diào)用方法(好處:不需要在d接口實(shí)現(xiàn)類)s.method(new Jumpping() {@Overridepublic void jump() {System.out.println("小狗跳高");}}); ?} } ? //運(yùn)行結(jié)果 小貓?zhí)吡?----------- 小狗跳高冒泡排序
排序:將一組數(shù)據(jù)按照固定的規(guī)則進(jìn)行排列
-
冒泡排序:一種排序的方式,對(duì)要進(jìn)行排序的數(shù)據(jù)中相鄰的數(shù)據(jù)進(jìn)行兩兩比較,將較大的數(shù)據(jù)放在后面,依次對(duì)所有的數(shù)據(jù)進(jìn)行操作,直至所有數(shù)據(jù)按要求完成排序
-
如果有n個(gè)數(shù)據(jù)進(jìn)行排序,總共需要比較n-1次
-
每一次比較完畢,下一次的比較就會(huì)少一個(gè)數(shù)據(jù)參與
更多內(nèi)容請(qǐng)?jiān)L問博主博客:逸樂的博客 - 今晚一起吃火鍋
文章如有紕漏請(qǐng)指出,整理不易多多包涵。
Java后續(xù)筆記將持續(xù)更新........
總結(jié)
以上是生活随笔為你收集整理的Java笔记 - 黑马程序员_03(继承,修饰符,多态,抽象类,接口,内部类)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器自动关闭远程打印服务,实现远程打印
- 下一篇: 汇编语言--微机CPU的指令系统(五)(