抽象类和接口

抽象类

  1. 抽象类中的变量和普通类的变量一样使用,可以被 (public、private、protected、static、final)关键字修饰。

  2. 抽象类中的成员方法和普通类的成员方法一样使用,没有限制。但抽象方法必须是被public/protected abstract修饰(protected 同类、同包、子类中可访问)。
  3. 抽象类中可以不含有抽象方法,但有抽象方法的类必须是抽象类

  4. 抽象类中可以含有静态方法,静态方法是先于类而存在的,生命周期很长。
  5. 抽象类不能被实例化(也就是不能被new出来)。

  6. 抽象类的子类只能继承一个抽象类(Java中类是单继承)
  7. 抽象类只能被继承,要实现只能实例化子类(如果子类也是抽象类那么就实例化孙子辈去调用抽象类的方法)。

  8. 抽象类中可包含属性、方法、构造方法,如果要调用抽象类的构造方法,只能通过子类实例对象来调用。

接口

  1. 接口中没有成员变量这个说法,只有常量。而且是静态不可改变的常量(用public static final 修饰)。

  2. 接口中的方法是没有实现的抽象方法(用关键词public abstract修饰)。

  3. 接口中没有构造方法

  4. 接口中的方法在jdk1.8版本以后可以不用子类去实现,只需在方法访问修饰符前加一个default。

 

public class Boy implements People{
    /**
     * Boy类实现了People接口中格得a方法,却没有实习People接口中的show方法
     * 因为show方法被default修饰了,实现类不需要实现这个方法。
     */
    @Override
    public void a() {

    }
}

interface People {
    default public void show() {
        System.out.println("我是人类");
    }
    //抽象方法
    public abstract void a();
}

 

 5. 接口可以多继承接口

public class Test {
    public static void main(String[] args) {
        //实例化D对象
        D d = new D();
        d.show();
    }
}

class D implements C{
    /**
     * D类实现C接口 
     */
    @Override
    public void show() {
        C.super.show();
        //注意:在D类中是无法调用AB接口中的方法,只能在接口C中才可以调用
    }
}

interface A{
    default public void show() {
        System.out.println("我是A");
    }
}

interface B{
    default public void show() {
        System.out.println("我是B");
    }
}

interface C extends A ,B{
    /**
     * 接口C继承了A和B,由于默认方法冲突所以要重写这个冲突的方法
     */
    @Override
    default void show() {
        //调用A里面的show代码如下
        A.super.show();
        //调用B里面的show代码如下
        B.super.show();
    }
}

代码运行结果如下:
我是A
我是B

 

     6. 接口无法被实例化(也就是不能被new出来),但是可以用类去实现它,类实现的关键字:implement。

接口和抽象类的区别

  1. 抽象类中的方法可以有方法体,但接口中的方法不能有方法体。

  2. 抽象类中的成员变量可以是各种类型的,但接口中的成员变量只能被 public static final 修饰的。

  3. 接口中不能含有静态代码块和静态方法,而抽象类是可以有静态代码块和静态方法。

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

posted @ 2020-11-14 13:57  阿水弟弟  阅读(54)  评论(0)    收藏  举报