接口:
有时,我们需要从多个不相干的类中设计出一个子类,而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来判断对象是不是要转换成的类型