java-抽象类与接口

本文从类关键字、成员变量、构造器、方法、继承与实现、创建对象等多个角度详细比较了Java中抽象类与接口的区别,并强调了它们在实际编程中的应用和选择。总结了两者在类与类之间的关系、成员变量、构造器、方法等方面的不同特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、从类关键字方面

抽象类使用的是abstract关键字修饰类,而接口使用的是interface。

//class前面使用abstract修饰
public abstract class AbstractClassTest {
}
//只是用interface修饰
public interface InterfaceTest {
}

二、从成员变量方面

接口的成员变量默认是 public final static的,所以一定要进行初始化

//错误:不能是protected的访问级别成员变量的访问级别不能是protected、private
public interface Father {
    protected int age =1;//不能是protected的访问级别
    private String name = "abc";//不能是private的访问级别
    public void sayHello();
}


//正确:接口中的成员变量默认的访问级别是public的,且是常量,这里不管我们在变量前面加不加final static,都是常量
public interface Father {
    int age =1;
    String name="abc";
    public void sayHello();
}

不能包含静态代码块,否则会出现编译错误

//错误包含静态代码块
public interface Father {  
    static{
        System.out.println("接口中不能有静态代码块");
    }
    public void sayHello();
}

抽象类的成员变量可以是static 类型的、final、final static类型的、且访问级别可以是public、protected、private;同时可以包含静态代码块。

public abstract class Human {
    public  static int age;
    private  String name;
    protected final static int GENDER =0;
    static{
        System.out.println("我是一个Human");
    }
}

三、从构造器层面

抽象类实例构造器,而接口没有实例构造器init

//错误:接口中不允许有实例构造器
public interface Father {
    public void sayHello();

    public Father(){

    }
}
//正确:抽象类有实例构造器

public abstract class Human {

    public Human(){

    }
}

抽象类和接口都有类构造器clinit。但是这两者类构造器执行的时间是不同的,抽象类的构造器如果子类开始执行初始化,那么必须先执行父类的类构造器,但是接口只有在使用接口的成员变量时才会执行类构造器。
总结

四、从方法层面来讲

抽象类的方法可以有一个或多个抽象方法或者没有抽象方法,抽象方法没有具体的实现,方法由abstract修饰,访问级别是public和protected的。

public abstract class Human {
    abstract protected  void sayHello();
    abstract void hunt();//默认public
}

接口中的方法访问级别只能是public的(不用加public,默认是public),不能是protected和private的。

//错误:接口中的方法访问级别不能是protected和private的
public interface Father {
    int age =1;

    protected void sayHello();
    private void work();
}
//正确:接口中的方法访问级别只能是public的(不用加public,默认是public)
public interface Father {
    int age =1;

    void sayHello();
    void work();
}

五、从继承和实现的角度来看

一个类可以实现多个接口,而只能继承一个抽象类

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

接口与接口之间采用继承的方式

public interface Set<E> extends Collection<E> 

六、 从创建对象的角度来看

抽象类和接口都不能创建对象

七、总结

  • 从类与类之间的关系:抽象类是一类物体的属性和行为的对象,子类和父类的关系是is-a的关系;而接口表示一类食物的行为的抽象,子类与接口之间的关系是is-a的关系
  • 从类关键字层面:抽象类使用的是abstract关键字修饰类,而接口使用的是interface。
  • 从成员变量的层面:接口中的成员变量默认final static修饰的,也就是常量,而且访问级别只能是public的,不能有静态代码块;对于abstract类变量可以是static、final static、final、或者一般的成员变量、而且访问级别可以是private、protected、public的。
  • 从构造器层面来讲:抽象类有实例构造器,而接口没有实例构造器;抽象类和接口都有类构造器clinit。但是这两者类构造器执行的时间是不同的,抽象类的构造器如果子类开始执行初始化,那么必须先执行父类的类构造器,但是接口只有在使用接口的成员变量时才会执行类构造器。
  • 从方法的层面来讲:抽象类的方法可以有一个或多个抽象方法或者没有抽象方法,抽象方法没有具体的实现,方法由abstract修饰,访问级别是public和protected的。接口中的方法访问级别只能是public的(不用加public,默认是public),不能是protected和private的。当然不管是抽象类还是接口的方法都不能被final和static关键字修饰
  • 从类继承和实现的:一个类只能继承一个abstract类,但是可以实现多个接口,也就是多实现单继承。普通类、抽象类实现接口采用的是implements关键字,而子类继承父类使用的是extends关键字。
  • 从创建对象来说:抽象类和接口都不能创建实例对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值