抽象类与接口

接口

接口用来描述类应该做什么,而不是指定它们具体应该如何做  主要用于定义规范

一个类可以实现多个接口

接口中所有方法自动是public abstract    不必显示声明

接口不会有实例字段,字段默认添加  public static final 修饰  即常量

接口不能有初始化块、构造器

子类实现接口方法需要显示声明方法的访问属性为public,类的默认访问属性是包可见的,子类如不是抽象类,需要实现接口中全部抽象方法

接口可以继承接口  多继承,不能继承类,级别比类高

jdk8以前,接口不会有实现方法

jdk8以后可以有default修饰的普通实现方法,通过对象调用,重写不需要添加@overwrite,可以有静态的实现方法,通过接口名调用

 

父接口的子类实例不能向无关的子接口强转  视为两个不同分支

eg:接口A的实现类是D,接口E继承A,D的实例仍然不能转换为E的实例,报运行时错误

 

抽象类

主要用于代码重用

定义:

修饰符 abstract 类名{
    //类体
修饰符 abstract  返回值类型 方法名(参数列表)
}
关键字为abstract 
 
抽象类的抽象方法没有方法体:public abstract void test();  不用被实现,必须由子类重写实现且是重写全部抽象方法(强制性要求,普通类不能继承抽象方法,必须重写),如果子类是抽象类则不用强制,因为抽象类中允许出现抽象方法
 
抽象类中的普通方法可以有方法体:
public   void test(){xxx};

 

抽象类必须被继承使用,不能被直接实例化

抽象类可以有成员变量、构造方法、成员方法,可以用构造方法来初始化属性

允许包含抽象成员

 

有构造方法却不能被实例化?

在抽象类中可以有构造方法,只是不能直接new 抽象类的实例对象,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类会先初始化父类。java中构造器是用来初始化的,不是用来实例化对象的。抽象类中的构造器是用来给成员变量赋值的,供子类使用

 

异同

不同点:

目的不同:接口定义一组类的执行规范,抽象类为了代码重用

定义关键字不同:接口interface,抽象类abstract

实现或继承的关键字不同:接口用implements来实现,抽象类用extends来继承

访问控制符不同:接口中只能public,抽象类中都可以

允许的组成结构不同:接口中不能有构造方法、静态代码块、实例变量,抽象类可以有
 
相同点:
都属于引用数据类型,不属于基本数据类型
都不能直接实例化
其中的抽象部分都需要被实现来使用
 
 
 
 
 
 

 

posted on 2023-04-21 20:39  or追梦者  阅读(5)  评论(0编辑  收藏  举报