JAVA基礎再回首(七)——final關鍵字、抽象類abstract、接口interface、權限修飾符、導包
沒有到不了的明天。
嬉皮笑臉面對人生的難。
相信自己,不然你什麼都做不了。
final關鍵字
- final關鍵字是最終的意思,可以修飾類,成員變量,成員方法。
- 修飾類,類不能被繼承
- 修飾變量,變量就變成了常量,隻能被指派一次
- 修飾方法,方法不能被重寫
我們可以寫一個Demo來驗證一下final關鍵字
class Fu {
public int num = ;
public final int num2 = ;
/*
public final void show() {
}
*/
}
class Zi extends Fu {
// Zi中的show()無法覆寫Fu中的show()
public void show() {
num = ;
System.out.println(num);
//無法為最終變量num2配置設定值
//num2 = 200; //打開注釋會報錯
System.out.println(num2);
}
}
public class FinalDemo{
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
輸出結果:
100
20
那麼final在繼承中如何展現呢?
由于繼承中方法有一個現象:方法重寫。是以,父類的功能就會被子類覆寫掉。有時候為了不讓子類去覆寫掉父類的功能,隻能讓他用,是以,針對這種情況,java就提供了一個關鍵字:final。
class Fu {
public final void show() {
System.out.println("這裡是絕密資源,任何人都不能修改");
}
}
class Zi extends Fu {
// Zi中的show()無法覆寫Fu中的show()
// public void show() {
// System.out.println("這是一堆垃圾");
// }
}
public class FinalDemo{
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
輸出結果:
肯定是父類中的輸出結果了。
抽象類(abstract)
概述:
動物不應該定義為具體的東西,而且動物中的吃,睡等也不應該是具體的。
我們把一個不是具體的功能稱為抽象的功能,而一個類中如果有抽象的功能,該類必須是抽象類。
- 抽象類特點
- 抽象類和抽象方法必須用abstract關鍵字修飾
- 格式
- abstract class 類名 {}
- public abstract void eat();
- 抽象類不一定有抽象方法,有抽象方法的類一定是抽象類
- 抽象類不能執行個體化
- 因為它不是具體的。
- 那麼,抽象類如何執行個體化呢?
- 按照多态的方式,由具體的子類執行個體化。其實這也是多态的一種,抽象類多态。
- 抽象類的子類
- 如果不想重寫抽象方法,該子類是一個抽象類。
- 重寫所有的抽象方法,這個時候子類是一個具體的類。
- 抽象類和抽象方法必須用abstract關鍵字修飾
abstract class Animal {
//抽象方法
//public abstract void eat(){} //空方法體,這個會報錯。抽象方法不能有主體
public abstract void eat();
public Animal(){}
}
//子類是抽象類
abstract class Dog extends Animal {}
//子類是具體類,重寫抽象方法
class Cat extends Animal {
public void eat() {
System.out.println("貓吃魚");
}
}
輸出結果:貓吃魚
- 抽象類的成員特點:
- 成員變量:既可以是變量,也可以是常量。
- 構造方法:構造方法不能被執行個體化。是以構造方法的特點是:用于子類通路父類資料的初始化。
- 抽象類的成員方法特性:
- 可以有抽象方法,強制要求子類做的事情。
- 也可以有非抽象方法,子類繼承的事情,提高代碼複用性。
abstract class Animal {
public int num = ;
public final int num2 = ;
public Animal() {}
public Animal(String name,int age){}
public abstract void show();
public void method() {
System.out.println("method");
}
}
class Dog extends Animal {
public void show() {
System.out.println("show Dog");
}
}
public class AbstractDemo {
public static void main(String[] args) {
//建立對象
Animal a = new Dog();
a.num = ;
System.out.println(a.num);
//a.num2 = 200;
System.out.println(a.num2);
System.out.println("--------------");
a.show();
a.method();
}
}
輸出結果: 我們學習了抽象方法,但是讓我有兩個疑惑的問題,不知道你們是不是也同樣疑惑,我給大家解答一下。
- 一個類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什麼意義?
答案肯定是可以的,意義就是為了不讓建立對象。
- abstract不能和哪些關鍵字共存?
private沖突、final沖突、static無意義
下面我們執行個體一個Demo
public class AbstractDemo {
public static void main(String[] args) {
Father.methods();
}
}
abstract class Father{
//public abstract void show();
//非法的修飾符組合: abstract和private
//private abstract void show();
//非法的修飾符組合 abstract和final
//final abstract void show();
//非法的修飾符組合abstract和static
//static abstract void show();
public static void methods() {
System.out.println("method");
}
}
class Son extends Father {
public void show() {}
}
接口(interface)
- 接口用關鍵字interface表示
- 格式:interface 接口名 {}
- 類實作接口用implements表示
- 格式:class 類名 implements 接口名 {}
- 接口不能執行個體化
- 那麼,接口如何執行個體化呢?
- 按照多态的方式,由具體的子類執行個體化。其實這也是多态的一種,接口多态(下一節講)。
- 接口的子類
- 可以是抽象類。但是意義不大。
- 可以是具體類。要重寫接口中的所有抽象方法。(推薦方案)
//定義動物教育訓練接口
interface AnimalTrain {
public abstract void jump();
}
//抽象類實作接口
abstract class Dog implements AnimalTrain {
}
//具體類實作接口
class Cat implements AnimalTrain {
public void jump() {
System.out.println("貓可以跳高了");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 無法執行個體化
//AnimalTrain at = new AnimalTrain();
//at.jump();
AnimalTrain at = new Cat();
at.jump();
}
}
輸出結果:貓可以跳高了
- 接口成員特點
- 成員變量;隻能是常量,并且是靜态的。
- 預設修飾符:public static final
- 建議:自己手動給出。
- 構造方法:接口沒有構造方法。因為接口主要是擴充功能的,而沒有具體存在
- 成員方法:隻能是抽象方法。
- 預設修飾符:public abstract
- 建議:自己手動給出。
interface Inter {
public int num = ;
public final int num2 = ;
public static final int num3 = ;
//錯誤: 需要<辨別符>,接口沒有構造方法
//public Inter() {}
//接口方法不能帶有主體
//public void show() {}
//abstract void show(); //預設public
public void show(); //預設abstract
}
class InterImpl extends Object implements Inter {
public InterImpl() {
super();
}
@Override
public void show() {
}
}
public class InterfaceDemo {
public static void main(String[] args) {
//建立對象
Inter i = new InterImpl();
System.out.println(i.num);
System.out.println(i.num2);
//i.num = 100;
//i.num2 = 200;
//System.out.println(i.num); //無法為最終變量num配置設定值
//System.out.println(i.num2);//無法為最終變量num2配置設定值
System.out.println(Inter.num);
System.out.println(Inter.num2);
}
}
輸出結果:
10
20
10
20
類與類,類與接口以及接口與接口的關系
覺得他們的關系好複雜,快看暈了,沒關系,我們逐個學習
- 類與類:
- 繼承關系,隻能單繼承,可以多層繼承。
- 類與接口:
- 實作關系,可以單實作,也可以多實作。
- 并且還可以在繼承一個類的同時實作多個接口。
- 接口與接口:
- 繼承關系,可以單繼承,也可以多繼承。
interface Father{
public abstract void show();
}
interface Mother {
public abstract void show2();
}
interface Sister extends Father,Mother {
}
class Son extends Object implements Father,Mother {
public void show() {
System.out.println("show son");
}
public void show2() {
System.out.println("show2 son");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
//建立對象
Father f = new Son();
f.show();
//f.show2(); //報錯
Mother m = new Son();
//m.show(); //報錯
m.show2();
}
}
輸出結果:
show2 son
show son
上面我們學習了抽象類,又學習了接口。那麼他們之間有什麼差別呢?我們繼續開車…
抽象類和接口的差別
- 成員差別
- 抽象類:
- 成員變量:可以變量,也可以常量
- 構造方法:有
- 成員方法:可以抽象,也可以非抽象
- 接口:
- 成員變量:隻可以常量
- 成員方法:隻可以抽象
- 抽象類:
- 關系差別
- 類與類
- 繼承,單繼承
- 類與接口
- 實作,單實作,多實作
- 接口與接口
- 繼承,單繼承,多繼承
- 類與類
- 設計理念差別
- 抽象類
- 被繼承展現的是:”is a”的關系。
- 抽象類中定義的是該繼承體系的共性功能。
- 接口
- 被實作展現的是:”like a”的關系。
- 接口中定義的是該繼承體系的擴充功能。
- 抽象類
權限修飾符
- 修飾符:
- 權限修飾符:private,預設的,protected,public
- 狀态修飾符:static,final
- 抽象修飾符:abstract
- 類:
- 權限修飾符:預設修飾符,public
- 狀态修飾符:final
- 抽象修飾符:abstract
- 用的最多的就是:public
- 成員變量:
- 權限修飾符:private,預設的,protected,public
- 狀态修飾符:static,final
- 用的最多的就是:private
- 構造方法:
- 權限修飾符:private,預設的,protected,public
- 用的最多的就是:public
- 權限修飾符:private,預設的,protected,public
- 成員方法:
- 權限修飾符:private,預設的,protected,public
- 狀态修飾符:static,final
- 抽象修飾符:abstract
- 用的最多的就是:public
- 除此以外的組合規則:
- 成員變量:
- public static final
- 成員方法:
- public static
- public abstract
- public final
- 成員變量:
最後我們在學一個小知識點——>導包
導包
- 導包概述
- 不同包下的類之間的通路,我們發現,每次使用不同包下的類的時候,都需要加包的全路徑。比較麻煩。這個時候,java就提供了導包的功能。
- 導包格式
- import 包名;
- 注意:
- 我們用那個報就導那個包。
那麼,package,import,class有沒有順序關系?
答案是肯定有關系。
package > import > class
Package:隻能有一個
import:可以有多個
class:可以有多個,以後建議是一個
今天我們就學到這裡,明天我們來學習多态。
最後呢,歡迎有興趣的同學加我朋友的QQ群:555974449
群主呢,也就是我在第一篇部落格我畢業了中給大家提到的劉某人程式員。
我們在群裡等你!