Java中抽象类与接口的区别

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中会与灰色显示。
所以接口中的方法不能以protectedprivate修饰。
Jdk1.8之后,接口中允许有静态方法,即以static修饰的方法,需要方法体。

static void test(){
	//TODO
}

允许以default修饰的方法,需要方法体。

default void test(){
	//TODO
}

接口中不可以有构造方法。

2.变量

接口中变量默认以public abstract final修饰,所以接口中的变量不能以protectedprivate修饰。
在这里插入图片描述

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中接口中的方法可以以staticdefault修饰,则所有实现类不需要重写即可调用此方法。

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小白个人总结,如有纰漏,欢迎指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值