Java基础之抽象类和接口的区别

Java基础之抽象类和接口的区别(JDK1.8)

  • 接口

      定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承(或实现)接口的方式,从而继承(或实现)接口的抽象方法。从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。
    
  1. 接口中不允许有构造方法。
  2. 接口中的成员变量默认是static final的。
  3. 在jdk1.8中接口中的抽象方法可以使用 defaultstatic 修饰。使用 default 修饰的方法可以被子类重写,也可以被this调用。使用 static 修饰的方法只能由接口本身调用。
  4. 接口允许被多实现。(使用 implements 关键字。一个类可以实现多个接口)。
  5. 接口中的方法默认都是抽象的。但是不需要abstract关键字,且方法的访问修饰符可以是是public或者default。
  • 抽象类

      定义:使用[abstract](https://so.youkuaiyun.com/so/search?q=abstract&spm=1001.2101.3001.7020)修饰符修饰的类。(如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。)
    
  1. 抽象类被abstract修饰符来修饰。抽象类不能被实例化。只能被子类继承。可以有构造器。

  2. 抽象类的构造器不能用于创建实例,主要是用于被其子类调用。

  3. 抽象类中可以有包含成员变量、 方法(普通方法和抽象方法都可以)、 构造器、初始化块、 内部类(接 口、枚举)5种成分。

  4. 抽象方法没有方法体。形式如(public abstract void test()😉。只能由其子类进行重写。

  5. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  6. abstract static不能同时修饰一个方法 (abstract方法没有方法体不能直接调用,static方法可以直接调用,冲突)

  7. 抽象类的内部类可以使用static进行修饰。

/**
 * TestAbstract 抽象类 抽象类不能创建实例,只能当成父类来被继承。
 * 1、抽象类必须使用abstract修饰符来修饰,
 * 抽象方法也必须使用abstract修饰符来修饰,
 * 抽象方法不能有方法体。
 * 2、抽象类不能被实例化,
 * 无法使用new关键字来调用抽象类的构造器创建抽象类的实例。
 * 3、抽象类可以包含成员变量、
 * 方法(普通方法和抽象方法都可以)、
 * 构造器、初始化块、
 * 内部类(接 口、枚举)5种成分。
 * 4、抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
 * 5、抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
 * 6、abstract static不能同时修饰一个方法  (abstract方法没有方法体不能直接调用,static方法可以直接调用,冲突)
 */
public abstract class TestAbstract {

    //抽象类的内部类可以使用static进行修饰.在子类进行继承该内部类时可以调用
    static abstract class inner{
         public abstract void eat();
    }
}
class A extends TestAbstract.inner{

    @Override
    public void eat() {
        System.out.println("eat方法执行了");
    }
}
public class TestMain {
    public static void main(String[] args) {
        //向上转型。多态体现
        TestAbstract.inner inner = new A();
        inner.eat();

    }
}
结果:eat方法执行了
  • 抽象类和接口的区别总结

    1. 抽象类是通过abstract修饰符修饰的类。而接口是一系列抽象方法的集合。

    2. 抽象类只能被单继承。而一个类可以实现多个接口。

    3. 抽象类中可以有普通方法和抽象方法。抽象方法一定要用abstract进行修饰且没有方法体。普通方法有方法体。抽象类中可以存在有参和无参构造方法。这些构造方法只能由继承的子类在其内部进行初始化调用。接口中没有构造器。

    4. 抽象类的抽象方法必须在子类内重写。接口中的所有非静态抽象方法必须在实现该接口的类内全部重写。接口中可以存在静态方法。但只能由接口本身调用。

    5. 抽象类中可以存在普通成员变量、类变量。接口中的成员变量默认都是static final类型的。

    6. 有抽象方法不一定是抽象类,也可能是接口。抽象类不一定有抽象方法,可以有非抽象的普通方法。

  • 抽象类和接口的使用场景

    这个文章写的不错。可以看看增加对场景的应用理解。

搞了这么多年终于知道接口和抽象类的应用场景了 - 腾讯云开发者社区-腾讯云
如有错误,希望大佬批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值