7、抽象类、接口

132 阅读5分钟

一、抽象类

抽象方法:使用关键字abstract修饰,并且没有方法体,直接以;结尾的方法

将子类的共性方法抽取到父类中,而父类针对这个方法无法描述每个子类的具体实现时,这种方法就是抽象方法。

注:

  1. 抽象方法所在的类必须是抽象类
  2. 抽象类不能被实例化
  3. 子类继承了抽象类,必须重写父类中所有抽象方法,否则子类也是抽象类
  4. 抽象类中可以有构造函数
  5. 抽象类中可以有非抽象方法
  6. 抽象类中可以没有抽象方法
  7. 抽象类一定是一个父类

抽象类的使用步骤:

  1. 创建类继承抽象类
  2. 重写抽象类中的所有抽象方法
  3. 创建子类对象调用

匿名对象:创建对象时,不指定数据类型和引用变量名

好处:方便

弊端:同一个匿名对象只能使用一次

匿名内部类:

new 类名(){
 // 重写
};

作用是创建指定类的子类对象

二、关键字final

final关键字可以用来修饰:

  1. 变量:变量的值不能改变
  2. 方法:方法不能被重写
  3. 类:类不能被继承

三、关键字static

static关键字可以用来修饰:

  1. 变量:如果这个变量是类中所有对象的共享属性时,可以修饰成static
  2. 方法:一般工具类中的方法都是静态的
  3. 代码块

注:

  1. 静态成员随着类的加载而加载
  2. static只能修饰成员,不能修饰局部
  3. static修饰的成员属于整个类的所有对象,是类中所有对象的共享内容,不属于某一个对象
  4. static成员应该通过类名访问
  5. 静态方法只能调用静态成员,不能调用非静态成员;非静态的方法可以调用静态成员也可以调用非静态成员
  6. 静态方法中不能使用thissuper
  7. 静态方法不能被重写,父类中的静态方法可以用父类名或者子类名调用

静态常量:被public static final修饰的变量

不能同时使用的关键字:abstract和staticabstract和finalprivate和abstract

四、接口

4.1、概念

关键字:interface

概念:接口是一种特殊的类,接口在编译后也生成.class文件,接口中方法全部都是抽象方法,它是一个比抽象类更加抽象的一种类型

格式:

public interface 接口名{
​
}

好处:

  1. 扩展了功能
  2. 对外提供了规则

注:

  1. 接口不能创建对象

接口中成员的特点:

  1. 成员变量:默认被public static final修饰
  2. 成员方法:默认被public abstract修饰

4.2、接口的使用步骤

关键字:实现implements

  1. 创建实现类实现接口

    格式:

    public interface 接口名{
    ​
    }
    ​
    public class 实现类 implements 接口名{
    ​
    }
    
  2. 实现接口中的所有抽象方法

  3. 创建实现类对象进行调用

接口的使用也可以通过匿名内部类来实现:

public class Test {
    public static void main(String[] args) {
        new Usb(){
            @Override
            public void connect() {
                System.out.println("哈哈");
            }
        }.connect();
    }
}
​
interface Usb{
    void connect();
}

4.3、类和接口的关系

类与类的关系:继承,子类继承父类

public class 子类 extends 父类{
​
}

注:类与类之间只有单继承

类与接口的关系:实现,实现类实现接口

public class 实现类 implements 接口1,接口2,..{
​
}
​
public class 子类 extends 父类 implements 接口1,接口2,..{
​
}

注:

  1. 一个类可以实现多个接口
  2. 子类在继承父类的同时还可以实现接口

接口与接口的关系:继承,子接口继承父接口

public interface 子接口 extends 父接口1,父接口2,...{
​
}

注:子接口可以继承多个父接口

4.4、接口中的新特性

  1. 默认方法

    从JDK1.8开始,接口中允许定义非抽象方法

    public default 返回类型 方法名(参数列表){
    ​
    }
    

    注:

    1. 接口中的默认方法可以不重写,重写时不能使用default
    2. 实现类实现的多个接口中有同名方法,实现类就必须重写
    3. 实现类中调用接口的默认方法:接口名.super.方法名()
    4. 子类继承父类的同时实现接口,父类中的非抽象方法和接口中的默认方法同名时,子类可以不重写,子类对象调用时优先访问父类中的
  1. 静态方法

    从JDK1.8开始,接口中允许定义静态方法

    public static 返回类型 方法名(参数列表){
    
    }
    

    注:接口中的静态方法只能由接口名调用

  1. 私有方法

    从JDK1.9开始,接口中允许定义私有方法

    private 返回类型 方法名(参数列表){
    
    }
    

    接口中私有方法的意义:那些只对接口中的默认方法进行支持,又不需要对外暴露的方法就应该是私有的

4.5、抽象类和接口的异同

同:

  1. 都不能实例化
  2. 都需要子类(实现类)来继承(实现)
  3. 都可以有抽象方法

异:

  1. 类只能单继承,接口可以多继承
  2. 抽象类中的成员变量与普通类中的成员变量相同;接口中的成员变量都是静态常量
  3. 抽象类中除了抽象方法其他方法与普通类相同;接口中的成员方法都是抽象方法
  4. 抽象类中有构造函数;接口中没有构造函数
  5. 抽象类是一类事物的集合;接口是功能的集合

抽象类和接口的选用:建议使用接口,实现接口避免了单继承的局限性