Java日志第19天 2020.7.24

接口中的注意事项

1.接口中不能有静态代码块和构造方法

2.一个类的直接父类是唯一的,但可以实现多个接口

3.实现类实现的多个接口中有重复的方法,只需要覆盖重写一次即可。

4.如果实现类没有实现该类所有接口的所有方法,则该类是抽象类。

5.如果实现类实现的多个接口中存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写

6.一个类如果直接父类中的方法和接口中的默认方法产生冲突,优先使用父类中的方法。

接口与接口之间是多继承的

public interface MyInterfaceA {

    public abstract void methodAbs();

    public default void methodDefault(){
        System.out.println("重复默认方法");
    }
}
public interface MyInterfaceB {

    public abstract void methodAbs();

    public default void methodDefault(){
        System.out.println("重复默认方法");
    }
}
public interface MyInterface extends MyInterfaceA, MyInterfaceB{

    @Override
    void methodAbs();

    @Override
    default void methodDefault() {
        System.out.println("覆盖重写重复默认方法");
    }
}

父接口中默认方法重复,子接口必须进行方法覆盖重写。

多态性

extends和implements是多态性的前提

代码中多态性的体现,其实就是父类引用指向子类对象

格式:父类名称 对象名 = new 子类名称();

    或者 接口名称 对象名 = new 实现类名称();

访问方法:new的是谁就调用谁,没有则向上找

访问变量:等号左边是谁就调用谁,没有则向上找

对象的向上转型

其实就是多态的写法

格式: 父类名称 对象名 = new 子类名称()

含义 预测创建一个子类对象,当做父类使用

注意事项 向上转型一定要是安全的

public abstract class Animal {

    public abstract void eat();

}

public class Cat extends Animal {

    public void eat(){
        System.out.println("猫吃鱼");
    }

}

public class Test {
    public static void main(String[] args) {

        //向上转型
        Animal animal = new Cat();
        animal.eat();
    }
}

结果如下

对象的向上转型

向上转型后的对象不能调用子类特有的方法,如果想要调用这些方法,就需要对象的向下转型。对象的向下转型就是一个还原的动作。

格式:子类名称 对象名 = (子类名称)父类对象

含义 将父类对象还原为本来的子类对象

public class Cat extends Animal {

    public void eat(){
        System.out.println("猫吃鱼");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }

}
public class Test {
    public static void main(String[] args) {

        //向上转型
        Animal animal = new Cat();
        animal.eat();
//      animal.catchMouse();//报错!不能这样调用

        //进行向下转型
        Cat cat = (Cat) animal;
        cat.catchMouse();
    }
}

instanceof关键字

对象名 instanceof 类名称

返回的是布尔值,判断对象能否当做类的实例

public class Test {
    public static void main(String[] args) {

        //向上转型
        Animal animal = new Cat();
        animal.eat();
//      animal.catchMouse();//报错!不能这样调用

        //进行向下转型
        //判断能否向下转型后再进行
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
        
    }
}
原文地址:https://www.cnblogs.com/Gazikel/p/13372052.html