抽象类(abstract class)和接口(interface)有什么异同?

相同点:

(1)不能直接实例化。如果要实例化,抽象类变量必须实现所有抽象方法,接口变量必须实现所有接口未实现的方法。

(2)都可以有实现方法(Java8 以前的接口不能有实现方法)。

* @since 1.8
     */
    default void replaceAll(UnaryOperator<E> operator) {
        Objects.requireNonNull(operator);
        final ListIterator<E> li = this.listIterator();
        while (li.hasNext()) {
            li.set(operator.apply(li.next()));
        }
    }

Java 1.8 新增了default关键字,可以使接口有自己的默认的实现类,而且还不影响接口的实现类。

 

(3)都可以不需要实现类或者继承者去实现所有方法(Java8 以前的接口,Java8 及以后的接口中可以包括默认方法,不需要实现者实现)。

public interface A {

    default int c(){
        return i;
    }

     int i = 0;


}



public class main {

    public static void main(String[] args) {
        A a = new A() {};
        System.out.println(a.c());
    }
}


 

不同点:

(1)抽象类和接口所反映出的设计理念不同。抽象类表示的是对象 / 类的抽象,接口表示的是对行为的抽象。

abstract  class AbstractStudent{
 
     abstract void study();
 
     void sleep(){
 
           System.out.println("sleep");
 
      }
 
      void smoke(){
 
              System.out.println("抽烟");
 
       }
 
}
 
//所有的Student被创建都会抽烟,是不是很搞笑?
 
class Student  extends  AbstractStudent{
 
        Student Demo stu = new Student();
 
         ...
 
}
abstract  class AbstractStudent{
 
      abstract void study(); 
 
       void sleep(){ 
 
               System.out.println("sleep"); 
 
        }
 
}
 
interface Smoking{
 
      void smoke();
 
}
 
 
 
//普通的学生,继承AbstractStudent,有学习、睡觉的方法,不抽烟
 
class Student extends AbstractStudent{
 

 

(2)抽象类不可以多重继承,接口可以多重继承。即一个类只能继续一个抽象类,却可以继承多个接口。

(3)访问修饰符 ——

  • 抽象类中的方法可以用 public protected 和 default abstract 修饰符,不能用 private、static、synchronize、native 修饰;变量可以在子类中重新定义,也可以重新赋值;
  • 接口的方法默认修饰符是 public abstract, Java8 开始出现静态方法,多加 static 关键字;变量默认是 public static final 型,且必须给其初值,在实现类中也不能重新定义,也不能改变其值。

(4)抽象类可以有构造器,接口没有构造器。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值