抽象方法和抽象类
抽象方法
使用abstract修饰的方法,没有方法体,只有声明。 抽象方法必须为public或者protected,因为如果为private,则不能被子类继承,子类便无法实现该方法。
实例:public abstract void xxx();
抽象类
用abstract修饰,不能被实例化,必须被继承,目的是为了重写。
-
抽象类中可以有普通方法,甚至允许全部为普通方法。
-
抽象类可以有构造方法。并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
-
抽象类不能用来创建对象(不能被实例化)。
-
抽象类可以继承抽象类,也可继承普通类
-
子类继承抽象类就必须覆写抽象类之中的全部抽象方法。不然就将子类也设成抽象类。
-
抽象类不能用private修饰,因为抽象类能继承,private又不允许继承,矛盾了
-
抽象类不能用final修饰,因为抽象类必须有子类,而final定义的类不能有子类,矛盾了。
-
外部抽象类不允许使用static修饰,而内部的抽象类可以使用static修饰。
Demo
//定义一个抽象类
abstract class A{
//普通方法
public void fun(){
System.out.println("存在方法体的方法");
}
//抽象方法,没有方法体,有abstract关键字做修饰
public abstract void print();
}
//单继承
//B类是抽象类的子类,是一个普通类
class B extends A{
//强制要求覆写
@Override
public void print() {
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String[] args) {
//向上转型
A a = new B();
//被子类所覆写的过的方法
a.print();
}
}
运行结果:
Hello World !
接口
接口中只有抽象方法,没有构造方法,不能被实例化,但是可以被实现,并且支持多实现。想要实现接口的类,必须实现接口中的所有方法,否则就必须声明为抽象类
Demo
interface IAnimal {
void run();
}
class AnimalImpl implements IAnimal {
public static void main(String[] args) {
IAnimal animal = new AnimalImpl();
animal.run();
}
@Override
public void run() {
System.out.println("AnimalImpl Run.");
}
}
抽象类与接口的联系与区别
相同点
- 都不能被实例化
- 非抽象类 想要实现接口或抽象类,都需要重写其中 所有的抽象方法 ,否则就必须声明为抽象类。
不同点
-
一个类可以实现多个接口,但只能继承一个抽象类
-
抽象类中可以有普通方法的实现,可以有构造方法,可以有静态方法,可以有普通成员变量;接口中只能有抽象方法的声明和 public static final 的变量,其他什么内容都不能有。
-
从设计层面上来说,抽象类主要用来抽象类别,是一种模板设计;接口主要用来抽象功能(行为),是一种规范。接口的抽象级别更高。
用抽象类实现一个接口,和普通类实现接口会有什么不同么?
一般来说我们使用普通类来实现接口,这个普通类就必须实现接口中所有的方法,这样的结果就是普通类中就需要实现多余的方法,造成代码冗余。
但是如果我们使用的是抽象类来实现接口,那么就可以只实现接口中的部分方法,并且当其他类继承这个抽象类时,仍然可以实现接口中有但抽象类并未实现的方法。