接口:
接口中定义抽象方法,是一组功能的集合,是比抽象类更抽象的‘类’
作用:定义规范 进行功能的扩展(一个类可以实现多个接口) 符合开闭原则 实现多继承
特点:无构造方法 属性都是常量 (不写修饰符时默认public static final修饰)
接口中方法隐式自动添加public sbastract修饰
一个接口内不可定义太多方法在(一般一个接口有一个方法)
接口可以继承另一个接口(接口多继承,了解)
好处:(面向接口编程):
- 接口将功能的定义与实现分离,提高了程序的维护性和扩展性。
- 接口可以强制类必须实现某些行为或规则,保证类行为的一致性。
接口的多实现:解决多继承的弊端(当多个父类中有相同功能时,子类调用会产生不确定性)
类继承类同时实现接口:更为灵活,便于扩展(继承用于多个对象共有的特性,实现用于扩展某个子类独有的功能)
JDK1.8对接口的更新:
JDK7之前接口都是抽象方法,JDK8之后有了默认方法和静态方法。
默认方法: public default 返回值类型 名(参数){} 用于接口升级,是接口中预留的一个扩展点
默认方法注意事项:
1)默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字。
2)如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写(防止接口冲突)。
静态方法:public static 返回值类型 名(参数){} 让接口来使用,不被继承,也不需要重写
接口和抽象类异同点:
相同:继承体系顶端 不可实例化对象 都可有抽象方法
不同:1) 抽象类中可以有具体方法; 接口只能包含抽象方法(1.7版本及以下)。
2)类与类之间只能单继承,类与接口之间可以多实现,接口和接口之间可以多继承(接口弥补了Java的单继承)。
3)抽象类中的内容, 是某一类事物中应该具备的基本特征。
4)接口是这个事物中的额外内容(功能)。
多态:一类对象的同一个行为,具有多种不同的形态
多态的使用前提:必须有实现或者继承 父类引用指向子类对象 必须有方法重写
语法:父类类型 对象名 = new 子类类型();
多态中访问成员变量的特点:编译和运行时都看左边 不加载子类独有的变量 ,引用子父类共有的变量时取父类变量的值。
多态中访问成员方法的特点:编译看左边,运行时都看右边(这一特点导致多态只可调用子类重写了父类的方法。不可调用子类特有的方法。)
向上转型 向下转型(调用子类特有功能时,将父类转为子类,转换失败时ClassCastException,解决boolean b = 对象 instanceof 数据类型; 父对象 instanceof 子类 结果 true)
多态的好处:隐藏了子类类型,提高了代码的扩展性(更多是在方法中体现)。(IOC容器中注入接口类型的实现类对象就是多态的扩展性。可以解耦)(当参数是接口或抽象类时,可以传递一个接口的实现类或子类,如果实现类或子类改变,这个参数不用动,如下图)
多态的弊端:只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。
内部类:一个类的内部的类
内部类可以直接访问外部类的成员,包括私有(同名的变量,内部类会覆盖外部类)。
外部类要访问内部类的成员,必须创建对象。
私有成员内部类:将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
匿名内部类:没有名字,只使用一次。必须继承一个父类或者接口。
public class Demo2 {
public static void main(String[] args) {
new A(){
@Override
public void functionInterface() {
System.out.println();
}
}.functionInterface(); //也可以赋值给A类型的变量,这样就是多态。但这样就不 //能叫做匿名内部类了
}
}
interface A{
void functionInterface();
}