java_关于接口及多态

接口:
有时,我们需要从多个不相干的类中设计出一个子类,而java继承是单继承的,单继承无法满足我们的要求,所以,我们可以使用接口实现多继承的目的

接口实际上就是一种规范制度(区别于规则)

接口的特点:
(1)接口使用interface关键字,而不是class,但我们可以理解成接口是特殊的抽象类
(2)接口里只能抽象方法常量
(3)接口不能实例化,创建对象没有意义
(4)接口不能提供构造器

接口中的常量:
默认使用修饰词:public,static,final

接口里的方法:
默认用public abstract

接口的实现
(1)子类需要实现接口中的所有抽象方法
(2)使用implements关键字进行实现
(3)如果子类没有实现所有抽象方法,那么子类需要abstract修饰
(4)子类可以实现多个接口,使用”,”分开

接口间的继承:
(1)接口与接口间可以使用继承
子接口继承了父接口的抽象方法
(2)支持多继承

这里写图片描述

多态:面向对象的特征之一

向上造型:
父类型的变量引用子类型的对象
(1)父类的变量指向不同子类的对象,可以调用不同实现的功能

        Animal a = new Dog();
        a.noise();//实现Dog中重写的noise()
        a = new cat();
        a.noise();//实现Cat中重写的noise()

(2)对象造型成不同的父类型(即不同的父类型指向同一个对象)有不同的功能

        Person p = new Person("张三");
        Home p1 = p;//在家
        p1.clear();
        p1.cook();
        p1.housework();
        Company p2 = p;//在公司
        p2.work();
public interface Home {
    public void cook();
    public void housework();
    public void clear();
}
/**在公司*/
interface Company{
    public void work();
}
/**在商场*/
interface Supermarket{
    public void shopping();
}
public class Person implements Home,Company,Supermarket{
    String name;
    public Person(String name){
        this.name = name;
    }
    public void cook(){
        System.out.println(name+"正在做饭");
    }
    public void housework(){
        System.out.println(name+"正在做家务");
    }
    public void clear(){
        System.out.println(name+"正在打扫卫生");
    }
    public void work(){
        System.out.println(name+"正在工作");
    }
    public void shopping(){
        System.out.println(name+"在购物中");
    }
}
public class Test {
    public static void main(String[] args) {
        //不同父类的变量指向同一个对象
        Person p = new Person("张三");
        Home p1 = p;//在家
        p1.clear();
        p1.cook();
        p1.housework();
        Company p2 = p;//在公司
        p2.work();
        Supermarket p3 = p;//在商场
        p3.shopping();
    }
}

这里写图片描述
向下造型:
将父类型(接口)的变量赋值给子类型或其他父类型(接口)的变量

        Animal a = new Dog(); 
        Dog dog = (Dog)a;
        dog.吃骨头();
        Cat cat = (Cat)a;//编译通过,语法正确,运行期间,造型错误(狗不能造型成猫)
        cat.捉老鼠();

运行期间可能会发生的造型异常:java.lang.ClassCastException
为了避免出现错误:我们需要使用关键字instanceof来判断对象是不是要转换成的类型

猜你喜欢

转载自blog.csdn.net/yc_hen/article/details/81459138