抽象类和接口【详解】

抽象类

abstract修饰的类就是抽象类

抽象方法:就是被abstract修饰的方法,没有方法体

作用:

         1.某个父类知道其所有子类要完成某功能,但是每个子类完成情况都不一样,父类就指定义该功能的基本要求, 具体实现由子类完成,这个类就可以是一个抽象类,抽象类其实就是一种不完全的设计图

        2.被子类继承

特点

        1.类有的成员(成员变量、方法、构造器)抽象类都具备

        2.抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

        3.一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

        4.不能用abstract修饰变量、代码块、构造器。

模板方法设计模式:

        解决了代码的复用性

        建议模板方法使用final关键字修饰,这样不能被子类重写

        步骤:

                1.定义一个抽象类

                2.定义两个方法

                               一个普通方法(模板方法)

                                一个抽象方法(不同的代码,子类重写)

package com.itheima.day03.teacher.abstract03;
/*
 抽象父类  模板父类
     因为 里面有模板方法
 */
public abstract class Music {


    /*
     一个是模板方法  来放 相同代码的  相同的提取 不同的调用
     一个是抽象方法  来表示不一样代码的
     */
    // 模板方法 代表相同代码 和执行
    public final void sing(){
        System.out.println("alalalalala1673365314152");

        //调用不同歌词
        geci();
        System.out.println("eneneneneneenen1112333");
    }


    // 歌词不同 定义成抽象的 由子类实现
    public abstract void geci();

}
----------------
package com.itheima.day03.teacher.abstract03;

/**
    继承子类
*/
public class FSSX extends Music{
    @Override
    public void geci() {
        System.out.println("攔路雨偏似雪花 飲泣的你凍嗎\n" +
                "這風褸我給你磨到有襟花\n" +
                "連調了職也不怕 怎麼始終牽掛\n" +
                "苦心選中今天想車你回家\n" +
                "原諒我不再送花 傷口應要結疤\n" +
                "花瓣鋪滿心裡墳場才害怕\n" +
                "如若你非我不嫁 彼此終必火化\n" +
                "一生一世等一天需要代價");
    }
}

-------------------
package com.itheima.day03.teacher.abstract03;
/**
    另一个继承子类
*/
public class AQZY extends Music{

    //模板方法好处在于 只重写不同部分
    @Override
    public void geci() {
        System.out.println("徘徊過多少櫥窗 住過多少旅館\n" +
                "才會覺得分離也並不冤枉\n" +
                "感情是用來瀏覽 還是用來珍藏\n" +
                "好讓日子天天都過得難忘");
    }


}
--------------------
package com.itheima.day03.teacher.abstract03;

/**
 * 测试类
 */
public class Demo {

    public static void main(String[] args) {
        AQZY aqzy = new AQZY();
        aqzy.sing();
        System.out.println("===========");
        FSSX fssx = new FSSX();
        fssx.sing();
    }
}

接口

        java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口

1.格式:

抽象类和接口【详解】_第1张图片

        注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称为实现类。

        一个类可以实现一个或多个接口,实现类实现多个接口,必须重写完全部接口中的全部抽象方法,否则实现类需要定义成抽象类。

2.接口与接口的关系:多继承

        注意:实现子接口名的类必须实现后面所有接口中的所有抽象方法。

3.使用接口的好处

        弥补了类单继承的不足,一个类在单继承的同时还可以实现多个接口。

        让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(多态思想)。

4.JDK8开始接口新增的方法

        当前功能不满足,有上万个方法实现这个接口,每一个都写太麻烦
不如直接写到接口,

        抽象类和接口【详解】_第2张图片

        

package com.itheima.day03.teacher.interface03;

/**
    接口
*/
public interface FlyAble {

    void fly();
    //默认方法 用default修饰  主要是给子类提供的
    default void stop(){
        System.out.println("停飞");

        time();
    }
    default void up(){
        System.out.println("起飞");

        time();
    }
    // 私有方法
    private void time(){
        System.out.println("计时");
    }
    // 静态方法
    public static void show(){
        System.out.println("我是一个很帅的飞行接口...");
    }
}

-----------
package com.itheima.day03.teacher.interface03;

/**
    实现类
*/
public class IronMan implements FlyAble{
    @Override
    public void fly() {
        System.out.println("带着盔甲飞");
    }


}
-----------
package com.itheima.day03.teacher.interface03;

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        FlyAble.show();
        FlyAble flyAble=new IronMan();
        flyAble.stop();
        flyAble.up();
    }
}

最后总结
                类和接口之间  实现关系 类实现接口 可以多实现
                类和类之间 继承关系 只能单继承 不能多继承 可以多层继承
                接口和接口之间 继承关系 支持多继承
                java中不存在多继承!  错!类之间不存在,但是接口之间存在的

你可能感兴趣的:(java,开发语言)