抽象類和接口

抽象類和接口的區(qū)別:

抽象類:
1.抽象類是一個類
2.定義抽象類時,使用abstract關(guān)鍵字修飾,繼承抽象類時,使用extends
3.只能繼承一個抽象類
4.抽象類中可以有抽象方法,也可以沒有抽象方法,抽象類中可以有具體的方法

接口:
1.接口不是一個類
2.定義接口時使用interface,實現(xiàn)接口時使用implements
3.可以實現(xiàn)多個接口
4.jdk1.8之前接口中的方法都是抽象方法,jdk1.8之后接口中可以有非抽象方法、靜態(tài)方法

抽象類和接口的相同點:

1.都不可以實例化,即不能使用new關(guān)鍵字來實例化對象
2.子類/實現(xiàn)類需要實現(xiàn)抽象類父類/要實現(xiàn)的接口中的所有抽象方法,如果沒有實現(xiàn)它們中的全部抽象方法,子類/實現(xiàn)類需要定義成抽象類
3.可以引用抽象類/接口,指向子類/實現(xiàn)類---》形成多態(tài)

抽象方法:只有方法體,沒有具體實現(xiàn)。eg:

public abstract void a();

jdk1.8之前和jdk1.8之后,接口區(qū)別:

jdk1.8之前接口中有:1.常量 2.抽象方法
jdk1.8之后接口中有:1.常量 2.抽象方法 3.非抽象方法 4.靜態(tài)方法

常量:public static final
抽象方法:public abstract
非抽象方法:public default
靜態(tài)方法:public static

注意:接口中的靜態(tài)方法不能被繼承。實現(xiàn)類實現(xiàn)接口時,重寫接口中的的非抽象方法不可以帶關(guān)鍵字default

抽象類:

abstract public class Person {
    int age;
    String name;

    public void eat(){
        System.out.println("能吃是福");
    }

    public abstract void sleep();
}

jdk1.8之前接口:

public interface TestInterface01 {
    //常量
    public static final int NUM = 10;
    //抽象方法:
    public abstract void a();
    public abstract void b(int num);
    public abstract int c(String name);
}

interface TestInterface02{
    public abstract void e();
    public abstract void f();
}

繼承父類、實現(xiàn)接口:

class Student extends Person implements TestInterface01, TestInterface02{
    @Override
    public void a() {
        System.out.println("------aaa");
    }

    @Override
    public void b(int num) {
        System.out.println("------bbb");
    }

    @Override
    public int c(String name) {
        return 110;
    }

    @Override
    public void e() {
        System.out.println("--------eee");
    }

    @Override
    public void f() {
        System.out.println("-------fff");
    }

    @Override
    public void sleep() {
        System.out.println("我喜歡睡硬板床");
    }
}
class Test{
    //這是一個main方法,程序的入口
    public static void main(String[] args) {
        //10.接口不能創(chuàng)建對象:
        //TestInterface02 t = new TestInterface02();
        //抽象類不能創(chuàng)建對象
        //Person p = new Person();
        Person p = new Student();   //  父類指向子類---》多態(tài)
        TestInterface02 t = new Student();  //接口指向?qū)崿F(xiàn)類---》多態(tài)

        //11.接口中常量如何訪問:
        System.out.println(TestInterface01.NUM);
        System.out.println(Student.NUM);
        Student s = new Student();
        System.out.println(s.NUM);
        TestInterface01 t2 = new Student();
        System.out.println(t2.NUM);
    }
}

jdk1.8之后接口:

package com.test12;

/**
 * jdk1.8之后,除了常量,抽象方法,還新增了非抽象方法、靜態(tài)方法
 * 常量:public static final
 * 抽象方法:public abstract
 * 非抽象方法:public default
 * 靜態(tài)方法:public static
 */
public interface TestInterface {
    //常量
    public static final int NUM = 10;

    //抽象方法
    public abstract void a();

    //非抽象方法
    public default void b(){
        System.out.println("-----TestInterface---b()---");
    }

    //靜態(tài)方法
    public static void c(){
        System.out.println("這是TestInterface的靜態(tài)方法c()");
    }
}
package com.test12;

public class Demo implements TestInterface{
    @Override
    public void a() {
        System.out.println("Demo重寫接口TestInterface的a()方法");
        b();
        //調(diào)用接口中的方法
        TestInterface.super.b();
    }

    @Override
    public void b() {
        System.out.println("Demo重寫接口TestInterface中的b()方法");
    }

    public static void c(){
        System.out.println("Demo中的靜態(tài)方法c()");
    }
}

class TestDemo{
    //這是一個main方法,程序的入口
    public static void main(String[] args) {
        Demo d = new Demo();
        d.a();
        Demo.c();
        TestInterface.c();
    }
}

打印結(jié)果:

Demo重寫接口TestInterface的a()方法
Demo重寫接口TestInterface中的b()方法
-----TestInterface---b()---
Demo中的靜態(tài)方法c()
這是TestInterface的靜態(tài)方法c()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容