- 抽象类
- 接口
- 抽象类和接口的相同点
- 抽象类和接口的不同点
一.抽象类的介绍
当父类的某些方法需要声明,但又不确定如何实现,可以将其声明为抽象方法,那么这个类就是抽象类。
范例:定义一个抽象类 讲语法
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
@Override
public void eat() {
}
}
1)用abstract关键字来修饰一个类时,这个类就叫抽象类
访问修饰符 abstract 类名{}
2)用abstract关键字来修饰一个方法时,这个方法就叫抽象方法
访问修饰符 abstract 返回类型 方法名(形参列表);//没有方法体
二.抽象类的注意事项
1.抽象类不能被实例化(举例)
public class Abstract {
public static void main(String[] args) {
new Animal();//'Animal' is abstract; cannot be instantiated
}
}
abstract class Animal{
public abstract void eat();
}
2.抽象类不一定包含abstract方法。就是说抽象类可以没有abstract方法
3.一但包含了抽象方法,则这个类必须声名为抽象类(举例)
class Animal{
public abstract void eat();//Abstract method in non-abstract class
4.abstract 只能修饰类和方法 不能修饰属性和其它的
5.抽象类可以有任意成员(抽象类本质还是类),比如:静态成员 非静态成员 构造器 代码块等等
abstract class Animal{
public abstract void eat();
Animal(){
}//构造器
public void hi(){}//普通方法
static{}//静态代码块
int a;//属性
}
6.抽象方法不能有主体()
7.如果一个类继承了抽象类,则这个类必须实现即重写抽象类的所有方法,除非这个类也声明为抽象类(举例)
abstract class Animal{
public abstract void eat();
public abstract void sleep();
}
class Cat extends Animal{ //需要重写抽象类的所有抽象方法否则编译通不过
@Override
public void eat() {
}
@Override
public void sleep() {
}
}
abstract class Dog extends Animal{//声明为抽象类不用实现抽象类的抽象方法
}
8.抽象方法不能用private final static来修饰,因为这些关键字和重写相违背
接口一.接口的介绍
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。总之,接口是为了规定一些东西才能发挥其价值的
语法:
interface 接口名{
//方法
//属性
}
注意:jdk8以前接口里只能有抽象方法 但jdk8开始后可以有抽象方法,静态方法,默认方法(也就是可以有方法的具体实现)
二.接口的注意事项
1.接口不能被实例化 类似于抽象类
2.接口中所有的方法是public方法,接口中抽象方法可以不用abstract修饰(举例)
interface A{
void say(); //等价于public abstract void say()
}
3.一个普通类实现接口,就必须实现该接口的所有方法
interface A{
void hi();
void say(); //等价于public abstract void say()
}
class B implements A{
@Override
public void hi() {
//实现接口的hi方法
}
@Override
public void say() {
//实现接口的say方法
}
}
4.抽象类实现接口,可以不用实现该接口的方法(跟抽象类类似)
5.一个类同时可以实现多个接口(简单理解为是对java单继承机制的补充)
interface A{
void hi();
void say(); //等价于public abstract void say()
}
interface C{
}
class B implements A,C{//实现了接口A和C
@Override
public void hi() {
}
@Override
public void say() {
}
}
6.接口中的属性 是public final static的 比如 int a 实际上是 public static final int a = 1;
7.接口中属性的访问形式:接口名.属性名(因为是static 所以可以通过接口名访问 类似于访问静态属性一样)
8.接口不能继承类 但可以继承多个别的接口
interface D extends C,A{}
9.接口的修饰符 只能是public 和 默认 (这点和类一样)
抽象类和接口的相同点1.都不能被实例化对象
2.都可以定义抽象方法
| 参数 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract | interface |
| 属性访问修饰符 | public,protected,private等 | 只能是public static final |
| 抽象方法访问修饰符 | 不能用private,static,final(与重写违背无法实现方法) | 只能是public |
| 构造器 | 有构造器 | 无构造器 |
| 继承 | 只能被普通类或抽象类继承 | 可以多继承或单继承接口,可以被类实现 |
| main方法 | 抽象方法可以有main方法且可以运行 | jdk8以前没有main jak8后可以有main方法因为有默认方法和静态方法 |



