接口
有时我们需要从多个不相关的类中设计出一个子类型,而java继承是单继承的特点,无法满足 我们的需求,所以我们可以使用接口来达到多继承的目的。
接口实际上就是一种规范制度。
接口的特点:
(1)接口使用interface关键字,而不是class
但是我们可以理解成接口是特殊的抽象类
(2)接口里只能有抽象方法和常量
(3)接口不能实例化,没有任何意义
(4)接口不能提供构造方法 [gdk1.8以上版本支持静态方法和默认方法]
接口中的常量:
默认使用修饰词为:public static final
接口中的方法
默认使用public abstract
接口的实现
(1)子类可以实现接口中的抽象方法
(2)使用implements关键字进行实现
(3)如果子类没有实现所有抽象方法,那么子类需要使用abstract
(4)子类可以实现多个接口,接口间使用逗号分开。
接口间的继承
(1)接口与接口之间可以使用继承。子接口继承了父接口的抽象方法
(2)支持多继承
多态
父类型的变量引用子类型的对象
向上造型
(1)父类型的变量指向不同的子类型对象,调用的功能有不同的实现
Animal a = new Dog();
Animal a = new Cat();
a.noise();//叫
(2)不同的父类型变量指向同一个对象有不同的功能
ZhengYangDoor a = new ZhengYangDoor();
a.thefproof();//防盗
a.openDoor();//开门
InterA ia = a ;
ia.theftproof();
ia.waterproof();
Door d = a;
d.openDoor();
d.closeDoor();
向下造型
将父类型(接口)的变量赋值给子类型的变量或者是其他父类型的变量(接口)的变量
Animal a = new Dog();
Dog dog = (Dog)a;
dog.吃骨头();
Cat cat = (Cat)a;//编译通过,语法正确,运行期间,造型错误
cat.捕捉老鼠();
运行期间有可能会发生类造型异常:java.lang.ClassCastException
为了避免出现错误:我们需要使用关键字instanceof来判断对象是不是要转换成的类型
if(a instanceof Cat){
Cat cat = (Cat)a;
}
内部类
是定义在一个类的内部的新类型。即内部类,另外一个类称之为外部类。
分为:
成员内部类:以类的成员来定义,可以使用任何修饰词来修饰
匿名内部类:没有名字的类型,写在外部类的方法中,通常只用一次,不需要定义类的结构。
通常都是为了实现接口,抽象类或某一现有的类型的子类。--------------------较常用
方法内部类:定义在方法中,相当于局部变量,仅限于在方法中使用 定义时不能使用修饰词,可以直接访问外部类的 非静态成员变量。
静态内部类:也是以类的成员来定义的,只不过多了一个修饰词static,可以直接访问外部类的静态成员。
--------------------不常用
为什么需要需求建立匿名内部类:
当我们想使用某个类或抽象类或接口的子类对象时,因为只使用一次,此时可以不定义子类
的结构,因此可以使用匿名内部类的写法。因为没有子类名称,在写法上用向上造型,等号
后面是new 父类(){};【分号一定不能丢】
大括号内重写接口或抽象类里的所有抽象方法,或重写某一个实现方法
内部类的使用:
创建对象:
要先创建一个外部类的对象outer
然后使用外部类对象去使用new调用内部类的构造器实例化
Inner inner = outer.new Ineer(有参传参);