一:抽象类:由abstract关键字修饰的类称作为抽象类。也是类,只不过多了可以定义抽象方法的功能。
抽象方法:由abstract关键字修饰的方法称作为抽象方法。特点:父类定义的抽象方法,子类必须重写。
定义抽象类语法:[public] abstract 类名{}
定义抽象方法语法:public abstract void|返回值类型 方法名(参数列表);
- 注意点:
- 抽象类中不一定存在抽象方法,但是存在抽象方法的类一定是抽象类。
- 抽象类不能被实例化(不能创建对象)
- 构造器和静态方法不能定义为抽象的。
关键字abstract(抽象的)和final(最终的)相互冲突,不能同时使用。
二:接口(interface):比抽象类还要抽象。接口中只有功能的声明,没有功能的任何实现。
定义接口:interface 接口名{}
对比对象接口和抽象类:
- 抽象类是半抽象化的,可以定义抽象方法,也可以定义普通的功能。
- 接口是完全抽象的,只能抽象方法。
三:类和接口的关系类和接口的关系
- 类与类之间的关系:只有继承关系,并且只能是单继承。关键字extends
- 类与接口之间的关系:类可以实现接口,并且可以实现多个接口。关键字implements
- 接口和接口之间的关系:接口可以继承接口,并且可以实现多继承
四:内部类:定义在类中的类称之为内部类。
- 局部内部类:类似于局部变量。 定义的位置:在类中的方法中定义的类。
- 成员内部类:类似于成员变量。定义的位置:在类中方法外定义的类。
- 静态内部类:类似静态变量。定义的位置:在类中方法外定义的类,但是有static修饰, 先于构造器加载。
作用:通常用于执行类中只需要执行一次的操作,比如初始化某些静态属性。
- 匿名内部类:没有名字的内部类。
//使用匿名内部类
testFly(new Bird() {//创建匿名内部类
//必须重写父类的抽象方法
@Override
public void fly() {
System.out.println("大鹏一日同风起,扶摇直上九万里");
}
});
五:什么时候:类会加载?
- 调用静态的属性或方法
- 通过new创建该类的对象
- 注意:只是声明类型不会加载类