抽象类与接口的区别及其原因?
抽象类与接口的区别是什么?想必大家对这个问题都不陌生,也是让很多人头疼的问题之一!因为我们面试之前都会巩固复习这个问题,但是时隔不久又会忘记,主要的原因是没有了解抽象类和接口的实质及作用。
抽象类:
抽象类的产生:在java面向对象设计编程中,抽象类产生于类的继承;如Student类和Teacher类都可以继承Person类,而现实生活中有具体的学生(Student)、教师(Teacher),而没有一种叫人类(Person)的人,所以Person类就属于抽象中的概念,
进而Person类不具有实例化的意义,通常就会把Person类定义为抽象类来限制其实例化。
抽象类和抽象方法的定义:
1 /** 2 * 父类Person 3 * @author bianxc 4 */ 5 public abstract class Person { 6 7 protected String name = ""; 8 protected int age = 0; 9 10 public Person(String name, int age) { 11 this.name = name; 12 this.age = age; 13 } 14 15 /** 16 * 抽象方法,展示个人信息 17 */ 18 public abstract void showInfo(); 19 20 /** 21 * 抽象类中可以有抽象方法,也可以有方法实现 22 */ 23 public void otherMethod() { 24 System.out.println("我是方法实现"); 25 } 26 } 27 28 /** 29 * 子类Student 30 * @author bianxc 31 */ 32 public class Student extends Person { 33 34 private String grade = ""; 35 36 public Student(String name, int age, String grade) { 37 super(name, age); 38 this.grade = grade; 39 } 40 41 @Override 42 public void showInfo() { 43 System.out.println("姓名:" + super.name + ",年龄:" + "," 44 + "年龄:" + super.age + ",年级:" + this.grade); 45 } 46 }
注意:抽象类中可以有零到多个抽象方法。当父类中定义了抽象方法,则子类(非抽象类)必须重写该抽象方法,否则子类必须定义为抽象类。
总结:
1.抽象类不能被实例化
2.抽象类中可以有零到多个抽象方法,也可以有普通方法
3.如果一个类中包含抽象方法,那么类必须定义为抽象类
4.抽象类中可以有构造方法
接口:
接口的产生:java面向对象中,类的继承属于 is a 关系,只支持单继承;如果学生又具有一种特殊行为考试,就不能让Student类继承Person类又继承exam类。
接口的定义:
1 /** 2 * 考试接口 3 * @author bianxc 4 */ 5 public interface Exam { 6 7 void test(); 8 } 9 10 /** 11 * 子类Student 12 * @author bianxc 13 */ 14 public class Student extends Person implements Exam { 15 16 private String grade = ""; 17 18 public Student(String name, int age, String grade) { 19 super(name, age); 20 this.grade = grade; 21 } 22 23 @Override 24 public void showInfo() { 25 System.out.println("姓名:" + super.name + ",年龄:" + "," 26 + "年龄:" + super.age + ",年级:" + this.grade); 27 } 28 29 @Override 30 public void test() { 31 System.out.println("学生正在考试"); 32 } 33 }
总结:
1.接口可以理解为一个特殊的抽象类(不能被实例化),但又和抽象类以完全不同的语法定义
2.接口中只能定义常量,不能定义变量;接口中的属性默认用 public static final 修饰,接口中的属性都是全局静态常量(由于静态常量不能重新被赋值,因此接口中不允许存在构造方法)
3.接口中的方法全部都是抽象方法,因此类实现接口必须重写接口中的所有方法,否则必须定义为抽象类
4.接口可以实现多继承,但是接口不能继承类;一个类只能继承一个父父类
5.接口产生就是为了达到多重继承的效果