抽象类和接口
1.抽象类
-
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
-
当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法。
-
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
-
抽象类,不能使用new关键字来创建对象,它是用来让子类继承的,只能靠子类去实现它。
-
抽象方法,只有方法的声明,没有方法的实现(也就是没有方法体),它是用来让子类去实现的。
-
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法(通过方法重写),否则该子类也要声明为抽象类。
-
抽象类的本质还是类。
//抽象类
public abstract class Action {
public abstract void doSomething(); //抽象方法,没有方法的实现(也就是没有方法体)!
}
2.接口
-
基本介绍:接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法重写出来。
-
接口就是规范,定义的是一组规则。
-
接口的本质是契约,就像我们人间的法律一样,制定好后大家都要遵守。(约束)
-
类实现接口可以看作是特殊的继承,也就是接口可以看作是父类。
-
语法:
接口类:
public class interface 接口名{
//属性
//方法
}
-
实现类:
public class 类名 implements 接口{
//自己属性;
//自己方法;
//必须实现接口的所有抽象方法,除非该实现类是抽象类
}
小结:
-
在Jdk7.0前 接口类的所有方法都是没有方法体,既都是抽象方法
-
在Jdk8.0后接口类可以有静态实现方法和default修饰的实现方法,也就是说接口中可以有方法的具体实现
//接口所有的方法默认是public,再用default修饰可以实现该方法
default public void ok(){ //public是默认的
System.out.println("太棒了");
}
-
接口不能被实例化
-
接口中所有的方法是public方法,可以不用public修饰。
-
在接口中写抽象方法,可以不用abstract修饰,默认就是abstract。
void aaa();// 实际上是 public abstract void aaa();
-
一个普通类(除了抽象类)实现接口,就必须将该接口的所有抽象方法都实现。
-
抽象类实现接口,可以不用实现接口的抽象方法。
-
一个类可以同时实现多个接口,而继承只能是单继承
-
接口中的属性,只能用final修饰,而且是public static final (默认被隐藏)修饰符。
int a = 1; //实际上是 public static finalint a = 1;(必须初始化)
-
接口中的属性的访问形式:接口名.属性名
public class D {
public static void main(String[] args) {
System.out.println(Ib.a);
}
}
interface Ib {
int a = 66;
}
-
一个接口不能继承其它类,但是可以继承多个接口
public interface A extends B,C {
}
-
接口的修饰符只能是public和默认的,这点和类的修饰符一样的。
继承和实现的联系
public class Demo15 {
public static void main(String[] args) {
C c = new C();
c.method();
}
}
interface A{
void method();
}
interface B extends A{
}
class C implements B{
@Override
public void method() {
System.out.println("需要重写接口A的抽象方法");
}
}