Java 接口和抽象类的区别

Java 接口和抽象类的区别

@author ixenos

 

接口和抽象类的区别


1.接口没有构造函数,因为接口是不能被实例化的;抽象类也不能被实例化,但抽象类有public构造函数,因为Java语言规范在编译期限定其不可实现,所以功能上相当于protected(子类可使用);

2.接口里面的成员变量默认都是public static final的,在编译期就被显示的初始化

  (参考:为了使用类的准备工作

  ***static final int = 47 是编译期常量,不需要对类进行初始化就可以读取

  ***static final int = Random.nextInt(100)  是运行时常量,这种一般要在对象创建后才会运行,超过初始化的阶段了!

  ***static int = 47 是非常数的静态域,不是常量,更不是编译期常量,链接阶段只分配存储空间,初始化阶段才初始化

  );

  抽象类中的成员变量是普通变量;

3.接口里面的方法默认都是public abstract类型的抽象方法,抽象方法只能申明,不能直接实现:比如abstract void abc()不能写成abstract void abc(){};

  而抽象类除了有抽象方法外还可以有已实现的方法;甚至抽象类还可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象;

  而如果任意一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过(Java语言规范)。

4.二者相同的是:

  抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类

  接口同理。

5.接口不能实现另一个接口,但可以多继承多个接口(extends A,B,C),类只能单继承

 

抽象类的构造函数


1.如果在父类中(这里就是你的抽象类)中显示的写了又参数的构造函数,在子类继承是就必须写一个构造函数来调用
父类的构造函数
例子:

 1 abstract class Person { //定义一个抽象类,必须被继承
 2     Person(int i) {
 3     }
 4 }
 5 
 6 public class Student extends Person {
 7     Student() {
 8     super(int i)://必须显示的调用父类构造方法//super代表父类对象
 9     }
10 }

2.如果父类中有没有参数的构造函数,在子类中可以不显示的写父类的构造函数,Java会自动调用没有参数的构造函数
例子:

 1 abstract class Person { //定义一个抽象类,必须被继承
 2     Person() { //此构造函数也可以不写,Java会默认添加一个没有参数的构造函数
 3     }
 4 }
 5 
 6 public class Student extends Person {
 7     //构造函数
 8     Student() {
 9     //super();//可以不写,Java会自己调用这个super()方法
10     }
11 }

 

原文地址:https://www.cnblogs.com/ixenos/p/5792282.html