抽象類與接口
一、抽象類
1.抽象類的介紹
I 代碼展示
public class 抽象類 {
public static void main(String[] args) {
Chinese chinese = new Chinese();
chinese.country();
chinese.nation();
}
}
abstract class Human{//關鍵字 abstract 修飾,抽象類
public void speak(String s){
System.out.println();
}
//抽象類中不一定有抽象方法,但抽象方法一定在抽象類中;
abstract void country();//抽象方法,功能由其子類進行實現
abstract void nation();
}
//一個具體的實現類 Chinese
class Chinese extends Human{
@Override//覆蓋抽象方法並重寫
void country() {
this.speak("我是一箇中國人。");//通過覆蓋重寫實現具體的功能
}
@Override
void nation() {
this.speak("我是漢族人。");
}
}
II 總結
- 有abstract關鍵字修飾;
- 必須由其子類創建對象,抽象類不能被實例化;
- 抽象類實體中可以有abstract方法,該方法只能聲明不可實現;
- 抽象類中不一定有抽象方法,但抽象方法一定在抽象類中;
- 抽象類的子類必須重寫abstract方法;
- 抽象類只關心它的子類是否具有某種功能,並不關心功能的具體實現;
- 功能的具體行爲由子類負責實現。
2.抽象類的應用
I 代碼展示
abstract class Shape{//聲明表示形狀的抽象類Shape
abstract void draw();
abstract void erase();
}
class Circle extends Shape {//聲明表示圓形的子類
@Override
void draw() {
System.out.println("Circle.draw()");
}
@Override
void erase() {
System.out.println("Circle.erase()");
}
}
class Square extends Shape {
@Override
void draw() {
System.out.println("Square.draw()");
}
@Override
void erase() {
System.out.println("Square.erase()");
}
}
class Triange extends Shape {//聲明表示三角形的子類
@Override
void draw() {
System.out.println("Triange.erase()");
}
@Override
void erase() {
System.out.println("Triange.erase()");
}
}
public class 抽象類的應用 {
public static Shape randShape() {
switch ((int) (Math.random() * 3)) {
default:
case 0:
return new Circle();
case 1:
return new Square();
case 2:
return new Triange();
}
}
public static void main(String[] args) {
Shape[] s = new Shape[9];
for (int i = 0; i < s.length; i++) {
s[i] = randShape();
s[i].draw();
}
}
}
II 總結
- 繼承層越高,類就越通用,並且越抽象
- 抽象:本質上相同的具體概念的抽象
二、接口
1.接口的聲明與接口體
I 代碼實現
public class 接口 {
public static void main(String[] args) {
//可以聲明一個接口的引用變量,那麼所有實現此接口的類的對象引用都可以賦給此引用變量
A a;
a = new D();
a.aaa();
int s = a.num;
}
}
class D implements A, B{
@Override
public void aaa() {
//包含接口的類,要實現該接口的方法
}
}
abstract class E implements A{
//沒有完全實現接口的方法,該類必須是abstract類型
}
interface A {
final int num = 0;//接口的變量一般爲 final或static 類型,必須以常量值來初始化
static int count = 0;
void aaa();//沒有方法體,本質上還是抽象方法
}
interface B{
}
interface C extends A{//通過關鍵字 extends 繼承其他接口
}
II 接口的聲明與接口體
- (public) interface + name ;
- 接口中的方法沒有方法體,雖然沒有abstract修飾,但本質上都是抽象的方法
- 接口中指定的方法沒有默認的實現,每個包含接口的類必須實現所有方法
- 接口的變量一般爲 final或static 類型,必須以常量值來初始化
- 如果接口本身定義爲public類型,則接口中所有的方法和變量均爲public
- (public) class classname implements interfacename
- 類中實現接口的方法必須聲明成public,而且實現方法的類型必須跟接口定義中的類型一致
- 一個類包含一個接口但不完全實現接口定義的方法,那麼該類一定是抽象類
- 接口可以通過關鍵字 extends 繼承其他接口
- 可以聲明一個接口的引用變量,那麼所有實現此接口的類的對象引用都可以賦給此引用變量
2.理解接口
- 接口只關心功能,而不關心功能的具體實現
- 接口與抽象類的重要區別:接口是用來定義操作和行爲的,而抽象類是用來定義實體的
三、接口的應用
1.接口回調
I 代碼展示
//接口的回調
interface ShowMessage{
void showMessage();
}
class TV implements ShowMessage{
@Override
public void showMessage() {
System.out.println("This is a TV");
}
}
class Computer implements ShowMessage{
@Override
public void showMessage() {
System.out.println("This is a Computer");
}
}
public class 接口的應用1 {
public static void main(String[] args) {
ShowMessage sm;//聲明接口變量
sm = new TV();//接口變量中存放對象的引用
sm.showMessage();//接口回調
sm = new Computer();//接口變量中存放對象的引用
sm.showMessage();//接口回調
}
}
II 總結
接口回調是多態的另一種實現,指:可以使用某一接口的類創建的對象的引用賦值給該接口聲明的接口的變量,則該接口變量就可以調用被雷實現的接口中的方法。當接口變量調用被類實現的接口中的方法時,就是通知相應的對象調用接口的方法
2.接口作爲參數
I 代碼展示
//接口作爲參數
interface Speak {
void speak();
}
class UserOne implements Speak {
@Override
public void speak() {
System.out.println("hello");
}
}
class UserTwo implements Speak {
@Override
public void speak() {
System.out.println("hi");
}
}
class Listener {
public void listen(Speak s){//方法的參數爲接口類型
s.speak();
}
}
public class 接口的應用2 {
public static void main(String[] args) {
Listener listener = new Listener();
listener.listen(new UserOne());
listener.listen(new UserTwo());
}
}
II 總結
- 當一個方法的參數是一個接口類型時(如果一個類實現了該接口),就可以把該類的實例引用傳值給該參數,參數就可以回調類實現的方法
- 使用接口還可以實現對調用方法的權限限制
學習從點滴開始,學到的東西可能會忘記,記得點贊收藏哦
System.out.println("我選擇滑稽取寵");