接口的定义:
我们在学习继承的时候,知道子类是不可以继承多个父类的,但我们想要子类实现多个功能的时候,就可以使用借口来实现多继承的目的
(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类型,然后进行强转,不会出现类造型异常