Java基础笔记(13)—— Java抽象类和接口的区别
Java抽象类和接口的区别
一.抽象类
1.abstract修饰的类为抽象类(没有对象,不能用new此关键字来创建抽象类的对象从而进行实例化);
2.abstract修饰的方法为抽象方法(不能有方法体);
3.有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;
4.抽象类中的抽象方法必须在子类中被重写。
代码举例:
创建Car抽象类,并定义抽象方法
package AbstractTest;
public abstract class Car {
public abstract void drive();
public abstract void type();
public void Look(){
System.out.println("看上去是辆车");
}
}
创建BMW子类继承Car抽象类,需要重写父类抽象方法,其他方法不需要重写;也可以创建子类本身的方法
package AbstractTest;
public class BMW extends Car{
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("适合山路越野");
}
@Override
public void type() {
// TODO Auto-generated method stub
System.out.println("宝马X5");
}
public void price(){
System.out.println("特别贵");
}
}
二.接口
1.通过interface关键字修饰的类;
1.接口中的属性默认为:public static final ****;
2.接口中的方法默认为:public abstract ****;
3.接口不用关键字 extends去“继承”,而是用 implements 去“实现”,(例如:A类实现了B接口,那么成为A为B接口的实现类。而类与类之间的继承的话,叫做A类继承了B类,其中B类即为A类的父类)。
代码举例:
创建接口:
package InterfaceText;
public interface Drive {
public static int a = 1;
public static int b = 2;
public void ioDrive(int i);
}
package InterfaceText;
public interface Type {
public abstract void ioType();
}
package InterfaceText;
public interface Look {
public void ioLook();
}
创建接口的实现类:
package InterfaceText;
public class BMW implements Drive,Type,Look{
@Override
public void ioLook() {
// TODO Auto-generated method stub
System.out.println("买不起太贵了");
}
@Override
public void ioType() {
// TODO Auto-generated method stub
System.out.println("看上去是辆宝马");
}
@Override
public void ioDrive(int i) {
// TODO Auto-generated method stub
System.out.println("速度很快");
}
}
三.联系
1.抽象类和接口都不能被实例化;
2.抽象类和接口都位于继承顶端,用于被其他类进行实现和继承;
3.抽象类和接口都可以包含抽象方法,实现接口或继承抽象类的子类都必须实现这些抽象方法。
四.区别
1.接口: 只包含抽象方法、静态方法和默认方法,不能为普通方法提供方法实现(接口中的普通方法默认为抽象方法);
抽象类: 可以完全包含普通方法;
2.抽象类中的成员变量可以定义普通成员变量,也可以定义静态常量(public static final 赋值),而接口中的成员变量只能是静态常量(public static final 类型的),并且必须赋值,否则通不过编译
3.接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4.接口: 不能包含初始化块,抽象类: 可以包含初始代码块
5.类的继承是“单继承”,可以“多对一”,但是不允许“一对多”。而一个类却可以同时实现多个接口