Java中抽象类与接口的区别
在介绍区别之前,我们应该先来了解抽象类与接口的简单定义
1.抽象类
指以abstract修饰的类
2.接口
接口以interface修饰符来声明
抽象类
1.方法
抽象类中的方法可以以``public``、``protected``、``private``修饰,也可以缺省不写,此类方法为普通方法,需要方法体。
也可以以``abstract``修饰,表明此方法为抽象方法,不需要具体实现,可以留给继承方法去实现。
抽象类中可以有构造方法,构造方法可以用来初始化成员变量。
2.变量
抽象类允许存在普通成员变量,同样可以以``public``、``protected``、``private``修饰,也可以缺省不写。可以以``static``、``final``修饰,表明为常量。
注意:abstract不能用来修饰变量,只能用来修饰类与方法
3.代码块
抽象类中允许存在静态代码块与非静态代码块
//静态初始化
static{
//TODO
}
//非静态初始化
{
//TODO
}
接口
接口较于抽象类有许多限制
1.方法
接口中方法默认以public abstract
修饰,所以在IDEA中会与灰色显示。
所以接口中的方法不能以protected
、private
修饰。
Jdk1.8之后,接口中允许有静态方法,即以static
修饰的方法,需要方法体。
static void test(){
//TODO
}
允许以default
修饰的方法,需要方法体。
default void test(){
//TODO
}
接口中不可以有构造方法。
2.变量
接口中变量默认以public abstract final修饰,所以接口中的变量不能以protected
、private
修饰。
3.代码块
接口中不允许有代码块。
在Java中,只允许继承一个类,允许实现多个接口。对于抽象类的继承,抽象类中的方法有两种实现方法,一是直接实现,二是将类再次抽象(以abstract修饰),交给下一个继承者来实现。所以我们可以认为,抽象类的抽象方法并不需要全部实现
public abstract class TestAbstract {
abstract void test1();
abstract void test2();
}
继承类
public abstract class TestAbs01 extends TestAbstract{
//不需要实现方法,甚至还可以再加抽象方法
abstract void test3();
//也可以单独对某个方法实现
@Override
void test1() {
System.out.println("TestAbs01实现test1()方法");
}
}
public class TestAbs02 extends TestAbs01{
//对于已经实现的方法,再次继承可以不用实现,也可以再次实现
@Override
void test1() {
System.out.println("TestAbs02实现test1()方法");
}
@Override
void test2() {}
@Override
void test3() {}
public static void main(String[] args) {
new TestAbs02().test1();//TestAbs02实现test1()方法
//如果不实现,调用方法
//new TestAbs02().test1();TestAbs01实现test1()方法
}
}
注意:虽然抽象类可以有构造方法,但是不是用来实例对象时使用,因为抽象类不能实例化对象。
接口的实现
Java中接口允许多实现,但是需要实现全部的抽象方法(除了static修饰的静态方法)。
所以说,当我们需要为接口添加某方法时,由于接口中只能时抽象方法,接口的所有实现类都需要实现此方法。
public interface TestInterface {
void show();
}
public class TestImpl01 implements TestInterface{
@Override
public void show() {
System.out.println("TestImpl01->>show()");
}
}
public class TestImpl02 implements TestInterface{
@Override
public void show() {
System.out.println("TestImpl02->>show()");
}
}
JDK1.8新特性
在JDK1.8中接口中的方法可以以static
、default
修饰,则所有实现类不需要重写即可调用此方法。
public interface TestInterface {
static void show(){
System.out.println("接口中的静态方法");
}
default <T> void show2(Class<T> tClass){
System.out.println(tClass.getName()+"->>show()");
}
}
public class TestImpl01 implements TestInterface{
public static void main(String[] args) {
new TestImpl01().show2(TestImpl01.class);//TestImpl01->>show()
TestInterface.show();//接口中的静态方法
}
}
public class TestImpl02 implements TestInterface{
public static void main(String[] args) {
new TestImpl02().show2(TestImpl02.class);//TestImpl02->>show()
}
}
注意:此
default
并不意味着默认
,default
只能用于接口方法和switch中,在普通类或抽象类中不能使用
纯属Java小白个人总结,如有纰漏,欢迎指正。