Java(抽象类与接口)

目录

abstract关键字

接口

抽象类和接口

代码演示


abstract关键字

抽象方法:在类中没有方法体的方法称为抽象方法,抽象方法用abstract修饰

抽象类:使用abstract修饰的类

抽象类与抽象方法

抽象类中可以没有抽象方法,包含抽象方法的类必须是抽象类

如果子类没有实现父类中的全部抽象方法,子类也必须是抽象类

抽象类与构造方法

没有抽象构造方法,抽象类不能被实例化

抽象类中可以有非抽象构造方法,创建子类的实例时可以调用

抽象类和非抽象子类之间也能存在多态性

abstract关键字与其他修饰符

abstract和修饰符static不能连用,没有抽象静态方法

abstract和修饰符private不能联用,abstract与权限修饰符联用时没有顺序要求

abstract和修饰符final不能联用

接口

概念性接口:系统对外提供的所有服务

用关键字interface定义的接口,也成为接口类型

组成:静态常量、抽象方法(只有定义,没有实现)、可以有非抽象方法

定义接口:

接口只能用权限修饰符public和默认修饰符(一种特殊的抽象类)

每一个接口文件可以包含多个类和接口,但只能有一个和文件名相同的public接口

接口中的常量默认用public static final 修饰

接口中的方法默认用public abstract 修饰

接口的实现:

[public] class 类名 [extends 祖先类名] implements 接口名 [,其它 接口名...]

接口与接口的关系

继承:接口可以继承一个或多个其他接口,并添加新的属性、方法

接口与类的关系

类实现接口:多个(无关)类可以实现同一个接口,多个(无关)接口可以也可以被一个列实现(多对多关系)

与子类继承抽象类相似,当非抽象类实现接口时必须实现接口中的所有(抽象方法),否则定义为抽象类

一个类只能继承一个直接父类,但能实现一个或多个接口

类在继承其他类的同时也可以实现一个或多个接口,但要保证关键字在extend在implements前使用

接口无构造方法,不能创建接口的实例,但可以定义接口类型的引用变量,该变量的引用是这个接口的实现类的实例

接口与实现类之间也存在多态性

抽象类和接口

相同点:接口和抽象类都不能实例化 ,都可以通过继承实现,都可以定义静态常量和抽象方法
不同点:
1.类只能继承一个抽象类,类可以实现多个接口
2.抽象类中的抽象方法必须加abstract关键字,接口中的抽象方法可以不加abstract关键字
3.抽象类中的非抽象方法权限修饰符无要求,接口中的非抽象方法的权限修饰符必须使用default或者权限修饰符不做要求的时候用静态方法static修饰
4.抽象类中属性无要求,接口中只能写静态常量

代码演示

//AbstractTest01
//包含抽象方法的类必然是一个抽象类,但是抽象类中可以没有抽象方法
//抽象类可以继承父类
public abstract class AbstractTest01 extends Test01{
    int age;
    String name;
    //抽象类中有构造方法
    public AbstractTest01(){}
    //不能有抽象的构造方法
//    public abstract AbstractTest01(int a);
    //没有方法体的方法并且使用abstract修饰的方法称为抽象方法
    //抽象方法只有存在的意义没有实现的意义
    public abstract void method();
    //抽象类中可以包含非抽象方法
    public void method1(){};
}
class Test01{}
//抽象类可以作为父类,但是子类会报错,原因是,能继承抽象方法。
//解决方案:
//1.将子类也定义成抽象类
//2.重写抽象类中所有的抽象方法,如果不重写或者只重写部分抽象方法,那么代码还会报错
class Test02 extends AbstractTest01{
    @Override
    public void method() {
        //抽象类不能创建对象
//        AbstractTest01 a = new AbstractTest01();
        //可以创建抽象类类型的对象,由非抽象子类赋值
        //抽象类和非抽象子类之间存在多态性    继承 重写 向上转型
        AbstractTest01 a = new Test02();//向上转型
    }
}
//InterfaceTest02
//接口文件中可以有多个接口,多个类
public interface InterfaceTest02 {
    //静态常量  能用类名.的形式调用
    //默认用public static final修饰
    int age = 10;//age倾斜

    //接口中没有构造方法   接口中的属性都是静态常量 不需要构造方法初始化 所以没有构造方法
//    public InterfaceTest02();

    //方法是抽象方法默认用public abstract修饰
    void method();//不能有方法体{}    有抽象方法是一个抽象类

    //jdk1.8后接口中可以有非抽象方法
    //权限修饰符default必须写才能是非抽象方法   或者是静态方法
    //在接口中权限修饰符不写默认是public 而类中默认default
    default void doSomething(){}//default修饰的才能有方法体
    public static void saySomething(){}//静态的不能被重写所以可以
}
//类和类之间有继承关系—单继承

//可以有零个或一个由public修饰的接口,但是public修饰的名字跟文件的名字相同
//接口和接口之间有继承关系 而且是多继承关系 多个父接口之间用","分割  但不能写多个继承关键字
interface Demo01 extends Demo02,Demo03{}

//接口和类之间没关系,指的是接口在前不能继承或实现一个类
interface Demo02{}
//一个class或一个interface生成一个字节码文件
interface Demo03{}

//类和接口之间不存在继承关系,但是是实现关系,使用implements表示实现关系,多实现关系
//类可以同时继承一个类实现多个接口,但是要求是继承关键字在实现关键字的前面
class Demo04 extends Demo06 implements Demo02,Demo03{}//不报错没有抽象方法
//类在实现接口的时候,需要重写接口中所有的抽象方法,否则需要将类定义成抽象类
class Demo05 implements InterfaceTest02{
    @Override
    public void method() {
        //接口不能直接创建对象,但是可以创建接口类型的对象,由非抽象实现类赋值
        InterfaceTest02 i = new Demo05();
    }
}
class Demo06{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值