抽象类VS接口
抽象类
抽象类:作为一个模板,由子类实现自己的具体功能。抽象类是一个跟类一样的结构,抽象类本质也是一个类
比如计算面积,提供一个抽象方法 计算面积公式,子类必须覆写,有各自自己的计算面积公式
包含:字段,构造方法,普通方法,抽象方法
支持多态的写法
**特点:
- 使用abstract 修饰的方法就是抽象方法没有方法主体;
- 抽象方法必须存于抽象类中[接口也可以],不能够放在普通类中
- 构造方法是私有的,不能实例化
- 抽象类的子类
- 非抽象类必须覆写父类中的所有的抽象方法,
- 抽象类不用覆写父类中的抽象方法**
class Abstract{
public static void main(String[] args){
System.out.println("");
}
}
abstract class Animal{
int i=1;
void get(){}
abstract void get1();//抽象方法不能有方法体 用;结束
}
class Person extends Animal{//非抽象类的子类,必须覆写父类的抽象方法
void get1(){
System.out.println("我是非抽象类子类的方法,我必须覆写");
}
}
abstract class Pig extends Animal{//抽象类的子类,不用覆写父类的抽象方法
}
接口
接口:规定某一类事物必须具备某些功能,但不管类具体怎么实现这些功能
- 接口没有构造方法,也不能实例化
- 接口的方法全是抽象方法,默认public abstract修饰
- 接口只能继承接口,可以多继承,不能继承类
- 接口的字段全是全局静态常量,默认public static final修饰
- 接口的内部类都是静态的,默认修饰public static修饰
实现接口:支持多实现
- 格式:修饰符 class 类名 implements 接口1,接口2……
- 接口的实现必须在extends之后
- 实现(覆写)接口的方法必须使用public访问修饰符
- 接口不能创建实例,但是可以声明引用类型的变量 -->父类变量引用子类对象
public class Interface{
public static void main(String[] args){
Dog d=new Dog();//创建Dog的对象
d.swim();//实现了ISwim的接口
Animal a=d;//多态
a.name="dog";//给父类赋值名字
System.out.println(d.name);//
IWalk w=d;//实现了ISwim接口
}
}
interface IWalk{
int i=1;
void walk();
}
interface ISwim{
void swim();
}
class Animal{
String name;
}
class Dog extends Animal implements IWalk,ISwim{//多实现,实现必须放在extends之后
public void walk(){
System.out.println("四条腿跑");
}
public void swim(){
System.out.println("狗刨式");
}
}
抽象类VS接口的异同点:
相同点:
1.都位于继承的顶端,用于杯其他子类或接口实现或者继承
2.都不能实例化
3.都可以定义抽象方法,其非抽象子类必须覆写这些抽象方法
区别
1.接口没有构造方法,抽象类有
2.抽象类可以包含普通方法和抽象方法,接口只能包含抽象方法
3.一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口(接口弥补了java的单继承)
4.变量:接口里默认是public static final,抽象类默认是默认包访问权限
5.方法:接口里默认是public abstract ,抽象类默认是默认包访问权限
6.内部类:接口里默认是public static,抽象类默认是默认包访问权限
【接口中的方法如果被static和default修饰,可以有方法主体,不需要实现类去覆写,这是java1.8的特性】
二者的选用:
优先选用接口,尽量少用抽象类。若需要定义子类的行为,又要为子类提供共性功能时选用抽象类。