【java系列】java之抽象类与接口详解

大家好,我是walker
一个从文科自学转行的程序员~
爱好编程,偶尔写写编程文章和生活
欢迎关注公众号【I am Walker】,一块学习编程~

抽象类和接口的对比

抽象类是用来捕捉子类的通用特性的。
接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

相同点

1、接口和抽象类都不能实例化

案例:
1、定义接口和抽象类

//抽象类
public abstract class AbstractDemo {
}



//接口
public interface InterfaceDemo {

}

2、测试
image.png
image.png

2、都位于继承的顶端,用于被其他实现或继承

案例:

package objectOrientedTest.interfaceTest;

public class Test extends AbstractDemo implements InterfaceDemo{

    public static void main(String[] args) {
        /**
        * 无法实例化
        */
//        new AbstractDemo();
//        new InterfaceDemo();
    }
}

使用extends继承抽象类
使用implements继承接口
注意:extends要排在implements前面

3、都包含抽象方法,其子类都必须覆写这些抽象方法

如:
抽象类和接口

package objectOrientedTest.interfaceTest;

public abstract class AbstractDemo {

    /**
    * 定义抽象方法
    */
    abstract void abstractTest();
}



package objectOrientedTest.interfaceTest;

public interface InterfaceDemo {
    String interfaceMethod();
}

子类

package objectOrientedTest.interfaceTest;


public class Test extends AbstractDemo implements InterfaceDemo{    
    /**
    * 子类需要重写方法,否则会报错
    */
    @Override
    void abstractTest() {

    }

    @Override
    public String interfaceMethod() {
        return null;
    }
}

不同点

参数抽象类接口
声明抽象类使用abstract关键字声明接口使用interface关键字声明
实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
构造器抽象类可以有构造器接口不能有构造器
访问修饰符抽象类中的方法可以是任意访问修饰符接口方法默认修饰符是public。并且不允许定义为 private 或者 protected
多继承一个类最多只能继承一个抽象类一个类可以实现多个接口
字段声明抽象类的字段声明可以是任意的接口的字段默认都是 static 和 final 的
1、声明

image.png
image.png

2、实现

image.png

3、构造器

抽象类可以拥有构造器

package objectOrientedTest.interfaceTest;

public abstract class AbstractDemo {

    /**
    * 定义抽象方法
    */
    abstract void abstractTest();

    public AbstractDemo(){
        
    }
}

接口不可以有构造器,因为接口都是抽象方法,不能有方法体
image.png

4、访问修饰符
抽象类

所有类型都是支持的
image.png

接口

image.png
image.png
image.png
可以发现,接口中可以使用的修饰符只有public,默认的时候也是public,而不是default

5、多继承

抽象类
抽象类只能实现单继承
image.png

接口
接口是可以实现多继承的
image.png

6、字段声明

抽象类支持任意字段

接口
默认是final static的
案例:

package objectOrientedTest.interfaceTest;

public interface InterfaceDemo {

    /**
    * 定义一个变量
    */
    String a="a";
}

image.png

可以得出:在接口中定义的变量,默认是final static修饰的

备注
Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。
现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。
接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:

  • 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
  • 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能

普通类和抽象类有哪些区别?

1、普通类不能包含抽象方法,抽象类可以包含抽象方法。

如果普通类定义抽象方法,则会显示:
image.png
2、抽象类不能直接实例化,普通类可以直接实例化。
image.png

抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

创建一个对象用什么关键字?对象实例与对象引用有何不同?

  • new关键字
  • new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)
  • 一个对象引用可以指向0个或1个对象;一个对象可以有n个引用指向它

堆内存
堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放
栈内存
栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值