day10(接口、多态)

目录

 

接口

接口的实现

接口多实现

接口多继承

多态


接口

java的三种引用类型之一,方法的集合,内部封装了方法。

接口的实现

关键字implements

抽象方法:子类必须重写。

默认方法:可继承与重写。

静态方法:无法重写。

私有方法(了解):默认方法调用。

私有静态方法(了解):默认方法与静态方法调用。

package ch_interface;

/*
* 接口:第三大引用类型(数组、类、接口)
*
* 接口{
* 成员方法(抽象、默认、静态、私有)
* }
* */

public interface Demo01 {
    public abstract void eat();
    public abstract void sleep();
    public default void la(){
        System.out.println("上厕所");
    }
    public static void sa(){
        System.out.println("上洗手间");
    }
}



package ch_interface;

public class Test implements Demo01 {
    @Override
    public void eat() {
        System.out.println("吃东西");
    }

    @Override
    public void sleep() {
        System.out.println("睡觉");
    }

    @Override
    public void la() {
        System.out.println("我上厕所");
        //super.la();
    }

    public static void main(String[] args) {
        Test t1 = new Test();
        t1.eat();
        t1.sleep();
        t1.la();
        Demo01.sa();

    }
}

接口多实现

一个类实现多个接口

1、抽象方法重名:只重写一个

2、默认方法重名:必须重写一次

3、类继承的父类与实现的方法重名:优先继承父类中方法

package ch_interface;

public class Demo {
    //public abstract void sleep();
    public void la(){
        System.out.println("上厕所");
    }

}



package ch_interface;

public interface Demo02 {
    public abstract void eat();
    public default void la(){
        System.out.println("上厕所");
    }

    public static void sa(){
        /*
        * 静态方法重名不冲突
        * */
        System.out.println("上洗手间");
    }
}



package ch_interface;

public class Test01 extends Demo implements Demo01,Demo02 {
    @Override
    public void eat() {
        System.out.println("重名了,只写一次");
    }

    @Override
    public void sleep() {

    }

    @Override
    public void la() {//如果类继承了父类又实现接口,父类与接口方法重名,则优先继承父类方法
        System.out.println("默认方法重名,必须重写一次");
    }
}

接口多继承

接口继承父接口

父接口默认方法重名,子接口需重写一次。

package ch_interface;

public interface Demo3 extends Demo01,Demo02 {
    @Override
    void eat();

    @Override
    void sleep();

    @Override
    default void la() {
        System.out.println("接口多继承,default可以保留");

    }
}

多态

继承——方法的重写——父类指向子类对象。

好处:父类型为函数参数,传递子类对象给方法,当父类被多个继承时,只需写一个方法,简便的调用子类重写的方法

package ch_duotai;
/*
* 不重写,失去多态的意义
* */
public  abstract class Fu {
    public abstract void eat();
}



package ch_duotai;

public class Zi02 extends Fu {
    @Override
    public void eat() {
        System.out.println("我吃");
    }

    public void la(){
        System.out.println("456");
    }
}



package ch_duotai;

public class Zi01 extends Fu {
    @Override
    public void eat() {
        System.out.println("你吃");
    }

    public void sleep(){
        System.out.println("123");
    }
}



package ch_duotai;

public class Test {
    public static void main(String[] args) {
        Fu f1 = new Zi01();//向上转换
        f1.eat();

        Fu f2 = new Zi02();
        f2.eat();

        Zi01 z1 = new Zi01();

        showEat1(z1);
        showEat2(z1);

        Zi02 z2 =(Zi02)f2;//向下转换

        //防止转换中出错
        if (f1 instanceof Zi01){
            Zi01 z3 = (Zi01)f1;
            z3.sleep();
        }
        else if (f1 instanceof Zi02){
            Zi02 z4 = (Zi02)f1;
            z4.la();
        }

    }

    public static void showEat1(Zi01 z1){
        z1.eat();
    }

    public static void showEat2(Fu f1){//多态的好处:规定调用子类重写的方法,则父类有多个子类时,减少了代码量
        f1.eat();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42499471/article/details/107648736
今日推荐