Java抽象类与接口的区别
由 abstract 修饰的没有方法体的方法是抽象方法;含有抽象方法的类是抽象类;Java接口是抽象类的集合,即接口中的方法都是抽象方法。
一、关键字
抽象方法的关键字是 abstract,接口的关键字是 interface;
public abstract class Mammal{ //这定义一个抽象类
//方法体
}
-----------------------------------------------------------
public interface IB{ //这定义一个接口
//常量
//抽象方法
//内部类
}
二、定义变量
抽象类可自由定义变量而且可以被继承;
public abstract class Mammal{
String name;
int age;
}
public class Ocean extends Mammal{
public Ocean(){
}
public Ocean(String name, int age){
this.name = name;
this.age = age;
}
public static void main(String[] args){
Mammal m = new Ocean("Tom",18);
System.out.println(m.name);
System.out.println(m.age);
}
}
Tom
18
接口定义变量时有默认的 public static final,因此接口定义的量都是常量;
public interface IC {
int AGE = 12;
}
public class Test implements IC{
public static void main(String[] args){
//AGE = 13; //证明final修饰,不注释掉会报错,因为常量无法修改
System.out.println(Test.AGE); //证明是static修饰,类.属性名 引用
System.out.println(AGE); //证明Public
}
}
三、有无构造方法 接口命名规则
抽象类可以有构造方法,但接口不能有构造方法;
接口命名都以大写 “I” 开头,可参考上下文中全部接口。
四、具体方法 访问控制符
抽象类中可以定义各种访问级别(除private外)的非抽象方法;而接口中只能定义访问级别为 public 包含 static 和default 修饰的非抽象方法(JDK8或更高版本才有此功能),同时接口的方法默认由 public abstract 修饰,所以可以忽略,但不可更改
public abstract class Mammal{
public void eat(){
System.out.println("正在吃。。。");
}
void sleep(){
System.out.println("正在睡觉......");
}
}
--------------------------------------------------
public interface IC {
public static void move(){
System.out.println("正在移动......");
}
public default void breathe(){
System.out.println("正在呼吸......");
}
void eat(); //此处若为 protected abstract void eat(); 则报错
}
接口定义的 default 修饰的方法是可以被继承的,在这里不再作过多的解释了,有兴趣的可自行探索。
五、实现方法
抽象类和接口中的抽象方法都没有方法体,如果想要实现,就需要重写;
抽象类的实现是由自定义类通过 extends 继承抽象类并重写所有的抽象方法;
接口的实现是由自定义类通过 implements 继承接口并重写所有的抽象方法;
例题3:
public abstract class Mammal{
abstract void move(); //抽象方法必须重写
public abstract void breathe(); //抽象方法必须重写
public void eat(){ //非抽象方法,可重写可不重写
System.out.println("正在吃。。。");
}
void sleep(){ //非抽象方法,可重写可不重写
System.out.println("正在睡觉......");
}
}
public class Ocean extends Mammal{
public void move(){
System.out.println("正在移动。。。");
}
public void breathe(){
System.out.println("正在呼吸。。。");
}
public void eat(){
System.out.println("正在撕咬。。。");
}
}
-------------------------------------------------
public interface IA{
void eat();
}
public interface IC extends IA{
void sayName();
void sleep();
}
public class Test implements IA{
public void eat(){
System.out.println("正在吃......");
}
public void sayName(){
System.out.println("I'm Tom");
}
public void sleep(){
System.out.println("正在睡觉......");
}
}
接口除 static 和 default 修饰的非抽象方法外,都是抽象方法,因此接口实现类需要重写除 static 和 default 修饰的方法外的所有方法。
六、继承数量
类的继承只可以继承一个,而接口的继承可以继承多个;例题5是抽象类的继承和实现,下图是接口的继承;
public interface IA{
void eat();
}
public interface IB{
}
public interface IC extends IA,IB{ //可同时继承接口IA,IB
void sayName();
void sleep();
}