接口和多态

接口的定义:

    我们在学习继承的时候,知道子类是不可以继承多个父类的,但我们想要子类实现多个功能的时候,就可以使用借口来实现多继承的目的

   (1)接口使用interface关键字,而不是class关键字,可以把接口看作是抽象类;

一个完整接口的定义:

public interface A{

public static final  double PI = 3.14;//定义常量

public abstract void method();//定义抽象方法

}

   (2)接口只能有抽象方法和常量;

抽象方法使用abstract修饰,可以不用写方法体

public abstract int sum();用分号结尾,常量用public abstract final修饰,常量用大写字母

   (3)接口不能实例化对象

因为接口没有成员变量以及构造器,所以无法进行实例化对象

   (4)接口不能提供构造器

因为接口没有成员变量,所以不能提供构造器对成员变量进行初始化

接口在创建常量时。默认使用public static final修饰

接口在创建方法时,默认使用public abstract修饰

实现接口:

(1)子类可以实现接口中所有抽象方法;

(2)子类在没有实现接口中的所有抽象方法时,需要使用abstract修饰

(3)子类在实现接口时。使用implements关键字

(4)子类可以实现多个接口,中间用逗号隔开

如:

public class A implements B,C{}

(5)子类可以在继承父类的同时也可以实现一个或多个接口

如:

public class A extends B implements C,D{}

接口之间的继承

接口之间是继承关系,使用extends关键字,子接口可以继承父类所有的抽象方法

语法:

public interface A extends B{}

接口之间支持多继承

如:

public interface A extends B, C{}

接口与类之间的关系:

接口与接口之间是继承关系,可以多继承

接口与类是实现关系,类实现接口中的抽象方法,可以实现多个抽象方法

类与类之间是继承关系,只能单继承

注意:接口不可以继承类!

多态:

多态是指一个变量在不同的环境中有不同的体现,是面向对象特征之一;

(1)向上造型:

父类型的变量指向不同的子类时功能有不同的体现:

(因为子类在重写父类方法时,方法名相同,返回值类型可以相同,也可以是父类返回值类型的子类,方法内的逻辑子类可以自己改写,可以与父类不同)

如:

public class Test01{

    public Object run(){

    System.out.println("小狗汪汪汪");  

    return new Object;

    }

}

public class Test02 extends Test01{

    public String run(){

    System.out.printnln("小猫喵喵喵");

    return new String ;

    }

}

public class Test03 extends Test01{

     public Object run(){

    System.out.println("小鸡咕咕咕");

    return new Object;

    }

}

在这个父类中,有两个子类

Test01 p = new Test02();

p.run();//父类型的变量p指向Test02子类时,其实现的功能是:小狗汪汪汪

p = new Test03();

p.run();//父类型的变量指向Test03子类时,其实现的功能是:小鸡咕咕咕

(2)不同的父类型指向同一子类时,会有不同的功能

ZhengYangDoor a= new ZhengYangDoor();

a.theift();

a.open();

Enter a1 = a;

a1.open();

Outer a2 = a;

a2.theift();

子类在继承父类时,只能继承单个父类,但是继承具有传递性,子类可以继承父类的父类的基本特性,所以这些类在指向同一子类时会有不同的功能

向下造型:

将父类型的变量赋值给子类型或者其他父类(接口)

Animal animal = new Dog();

Dog dog = (dog)animal;

dog.eat();

Cat cat = (Cat) animal;//编译错误

cat.eat();

在这里会出现一种异常,类造型异常

java.lang.ClassCaseException;

原因是:Cat cat = (Cat)dog;

本来狗这个类与猫这个类有共同的父类,但是两个子类之间不能进行强转,会出现类造型异常,符合向下造型的只能是将父类(接口)赋值给子类型

为了防止出现类造型异常,我们可以先进性判断:

if(animal instanceof Cat){

Cat cat = (Cat)animal;

}else if(animal instanceof Dog){

Dog dog = (Dog)animal;

}

在这里先判断animal是否属于Cat类型,然后进行强转,不会出现类造型异常

猜你喜欢

转载自blog.csdn.net/Peanut_508/article/details/81585406