目录
1.抽象类:
凡是用abstract修饰符修饰的类称为抽象类。抽象类就是没有具体对象的概念类。
抽象类不能被实例化,否则会产生编译错误。
抽象类的特点:
- 不能创建一个实例即不能new一个抽象类,即使创建出抽象类对象,调用抽象方法 ,根本没有方法体。
- 可以不包含抽象方法,若一旦包含,该类必须 作为抽象类,抽象类可以包含普通方法(留给子类调用),抽象类是有构造方法的,子类构造方法必须先调用父类构造方法。
- 如果子类没有实现/重写父类所以的抽象方法,那么子类也得作为抽象类(让它的子类去实现)
- 构造方法不能都定义为私有的,否则不能有子类(调用子类时先调用父类的构造方法)。
- 抽象类不能用final修饰,因为必须有子类,抽象方法才能够实现
- 抽象类时不完整的类,必须作为父类(必须有子类),功能才能得以实现。
抽象类与普通类的区别:
1.普通类有的成员(方法、字段、构造器),抽象类都有
2.抽象类不能创建对象,抽象类中包含抽象方法。
3.抽象类必须作为父类。
代码如下:
定义一个抽象类
//定义一个抽象类
public abstract class Animal {
//定义一个抽象方法
public abstract void eat();
//定义一个普通方法
public void show() {
System.out.println("我有眼睛和鼻子");
}
}
抽象方法里必须是在抽象类中,而抽象类中可以有普通方法。抽象方法没有方法体,以“;”结束。
定义一个Cat类,继承抽象方法
//继承抽象方法
public class Cat extends Animal {
//重写父类的抽象方法
@Override
public void eat() {
System.out.println("我喜欢吃猫粮");
}
}
继承Animal类后,需要重写Animal类中的抽象方法,如果不想重写可以将Cat类定义一个抽象类,否则会编译错误。
定义一个测试类
public class Text {
public static void main(String[] args) {
//Animal不能实例化,否则会报错。
// Animal a = new Animal();
//实例化Cat类
Cat c= new Cat();
c.show();
c.eat();
}
}
因为Animal是抽象类,所以Animal不能实例化。
1.2.抽象方法
被abstract修饰的方法叫做抽象方法,抽象方法的作用是为所有子类定义一个统一的接口。对象方法只需声明,而不需实现,即用分号(;)而不是{}。
抽象类可以包含抽象方法,也可以不包含抽象方法,但是一旦包含了抽象方法,该类必须为抽象类。
抽象方法在子类必须实现,否则子类仍是抽象类。
注意:
1.abstract不能与final并列修饰同一个类
2.abstract不能与private, static, final或native并列修饰同一方法
3.abstract方法必须位于abstract类中
1.3.小结
被abstract修饰的类是抽象类
1.抽象类无法实例化对象
2.抽象方法没有方法体
3.父类的抽象方法必须被子类重写
4.抽象方法必须在抽象类中
5.抽象类中不一定有抽象方法
6.抽象方法不能有private、static、final关键字
7.若子类不想重写父类的抽象方法,可以将子类改为抽象类
8.抽象方法在子类实现时访问权限必须大于等于父类方法
2.接口
接口的概念
1.Java只支持单重继承机制,不支持多重继承,即一个类只能有一个超类。单继承性使得Java结构简单,层次清楚,易于管理,更安全可靠,从而避免了 C++中因多重继承而引起的难以预测的冲突。但在实际应用中也需要使用多重继承功能。 但Java中并不允许多重继承,所以Java提供了接口(interface)来解决这类问题。
2.接口是用来实现类似多重继承功能的一种结构,它在语法上和类很相似,它也有属性和方法,接口间也可以 形成继承关系,但接口和类有着很大的区别,它的属性都是常量,方法都是抽象方法,没有方法体,所以它的名 字也就称为“接口” 。接口只是一个口,里边是空的。
接口的定义
为了区分接口与类,Java采用了下面的语句来定义接口
修饰符 interface 接口名{
// 常量声明
// 方法签名
}
实例如下:
public interface InterfaceName {
}
使用接口或多或少都有点想使用抽象类。例如:可以使用接口作为引用变量的数据类型或类型转换的结果等。与抽象类相似,不能使用new操作符创建接口的实例。
接口特点和接口继承:
接口的特点:
- 没有构造方法,也不能显示定义构造器,不能实例化。
- 接口只能继承接口,不能继承类,而且接口支持多继承(类是单继承关系)
[修饰符] interface 接口名 extends 接口1,接口2
3.接口里的方法全是抽象的,默认修饰符是public abstract。
4.接口里的字段全是全局静态常量,默认的修饰符是public static final。
5.接口里的内部类全是公共静态的,默认的修饰符是public static。
接口的继承;
接口与接口之间的关系只能是继承(多继承) 使用extends来表示
接口与实现类之间只能是实现关系 使用implements来表示
接口的实现者:实现类
接口仅仅只是定义了某一事物一个具有某些功能,但是没有提供任何实现。
此时,我们就要提供类,让该类去实现接口,并覆盖接口中的方法,从而实现接口中定义的功能。
实现:class 类名 implements 接口{}
子类要实现接口的所有方法,否则接口就是抽象类
面向接口编程:
接口 变量 = 创建实现类对象;
接口与抽象类的区别:
相同点:
- 都位于继承的顶端,用于被其他实现或继承
- 都不能实例化
- 都可以定义抽象方法,其子类/实现类都必须重写这些方法。
不同:
- 接口没有构造方法,抽象类有构造方法
- 抽象类可以包含普通方法和抽象方法,接口只能包含抽象方法
- 一个类只能继承一个直接父类(可能是抽象类),接口是多继承的并且支持一个类多个接口
- 成员变量:接口是默认public static final,抽象类是欧仁包权限
- 方法:接口时默认public abstract,抽象类默认是默认包权限
- 内部类:接口里欧仁是public static,抽象类默认是默认包权限