一、抽象类
类的设计应该保证父类和子类能够共享特征,有时将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。
1 抽象类:在class前面加 abstract
特点:
- 抽象方法所在的类必须是抽象类
- 抽象类不能实例化
- 抽象类是用来被继承的,如果要实现抽象类,必须创建一个子类去继承抽象类
- 子类继承一个抽象类,必须重写抽象类中所有的抽象方法(子类也是抽象类除外),重写父类方法的快捷键 ctrl + i
- 抽象类里面可以定义普通方法
- 抽象类里面可以定义构造方法,如果不能定义构造方法,也就代表不能使用object里面定义的方法和属性了
- abstract不能用来修饰属性、构造器、private、static、final
2 抽象方法特点:只有方法的定义,没有方法的实现
例:public abstract void eat();
3 匿名对象 匿名类 抽象类的匿名方法
public class TestPerson {
public static void main(String[] args) {
Person person = new Student();
method(person);// 非匿名对象非匿名类
method(new Student());// 匿名对象,只能被调用一次
// 其实是new了一个子类,只是这个子类没有名字
// 创建了一个匿名子类的对象person1
Person person1 = new Person() {
@Override
public void eat() {
System.out.println("人在吃饭");
}
@Override
public void sleep() {
}
};
person1.eat();
// 匿名子类最简单的写法 匿名子类,匿名对象
method(new Person() {
@Override
public void eat() {
System.out.println("hahhahah");
}
@Override
public void sleep() {
}
});
}
public static void method(Person person){
System.out.println("学生");
}
}
4 抽象类 vs 一般类
相同点:
- 抽象类和一般方法都是用来描述事物的,都在内部定了成员
不同点:
- 一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足
- 一般类中不能定义抽象方法,只能定义非抽象方法;抽象类中可定义抽象方法,同时也可以定义非抽象方法
- 一般类可以被实例化;抽象类不可以被实例化
二、接口
1.接口是什么?
- 就是多个类之间的公共规范
- 接口的出现就是为了解决java单继承的问题,java不支持多继承
- 接口里面的方法都是抽象方法,它相当于一个特殊的抽象类
2.怎么定义一个接口
- public interface 接口名{}
3 接口的作用
- 通过接口可以实现不相关类的相同行为,不需要考虑类之间的层次关系
- 通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能
- 可以使处于不同层次甚至互不相关的类具有相同的行为
- 接口主要用来定义规范,解除耦合关系
4.接口的特点
- (1)接口里面成员变量都是常量,默认会加上public static final进行修饰,不写也会默认
- (2)接口里面的方法都是抽象方法(默认方法除外),默认会加上public abstract进行修饰
- (3) 接口不能实例化,抽象类通过继承实现,接口通过创建一个类去实现这个接口
- (4)接口里面不能定义普通方法,可以定义默认方法
- (5)接口里面没有构造方法
- (6)一个接口可以继承一个接口,并且可以继承多个接口
5.实现类
- (1)实现接口的类叫做实现类,格式:class 类名 implements 接口名{}
- (2)实现类要重写接口里面所有的抽象方法(实现类是抽象类除外)
- (3)一个实现类可以实现多个接口,每个接口之间用","隔开
- (4)如果一个类在继承一个类的同时实现一个接口,那么继承要放到接口实现的前面
6.接口和抽象类的相同点和不同点(面试题)
相同点:
- 接口和抽象类都不能被实例化,只能被其他类实现和继承
- 接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类
- 都可以定义静态方法
不同点:
- 抽象类与接口的定义不同:抽象类 abstract ,接口 interface
- 接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通方法
- 接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量
- 接口不包含构造函数;抽象类可以包含构造方法,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作
- 接口不包含初始化块,但抽象类可以包含初始化块
- 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补java的单继承不足
7 补充
- 因为有几个类需要单独实现一些方法的情况,所有对接口进行了升级,从1.8开始,接口里面允许定义默认方法,主要为了接口升级:public default 返回值类型 方法名(形参){方法体;},默认方法会被实现类继承
- 从1.8开始,接口里面允许定义静态方法:public static void metnod(){}