# 抽象类

# 抽象类简介

在Java中被abstract关键字修饰的类被称为抽象类,被abstract关键字修饰的方法被称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类是用来捕捉子类的通用特性的,它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模版。

# 特点

  • 抽象类不能被实例化,即不能使用new关键字来实例化对象,只能被继承
  • 包含抽象方法的一定是抽象类,但是抽象类不一样含有抽象方法。
  • 抽象类中的抽象方法的修饰符只能为public或者protected,默认为public。
  • 抽象类中的抽象方法只有方法体,没有具体实现。
  • 如果一个子类实现了父类抽象类的所有抽象方法,那么这个子类可以不是抽象类。否则该子类必须为抽象类
  • 抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。

# 抽象类和普通类的主要有三点区别:

1、抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

2、抽象类不能用来创建对象;

3、如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

public class TestAbstract {
    public static void main(String[] args) {
        Employee e = new Salary();
        e.t1();
        e.t2();
        System.out.println("---------------------------");
        Salary s = new Salary();
        s.t1();
        s.t2();

    }

}

abstract class Employee {
    public void t1() {
        System.out.println("Employee----t1");
    }

    public void t2() {
        System.out.println("Employee-----t2");
    }
}

class Salary extends Employee {
    @Override
    public void t2() {
        System.out.println("Salary-----t2");
    }
}

image.png 从上述可以看到,虽然我们不可以直接实例化抽象类,但是我们可以实例化继承了抽象类的子类(Employee e = new Salary())。并且根据结果我们可以看出当子类重写抽象类中的方法以后当方法被调用时弗雷德方法将会被覆盖,执行的是子类的方法。
有个问题之前被问到过静态方法和静态属性能否被继承重写。最近才恍然大悟呀!!!!!重写的定义是什么?可能大家耳熟能详的是重写是子类对父类中允许访问的方法的实现过程进行重新编写,返回值和行参都不能改变。但是重写的更深层的含义说的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。突然恍然大悟有没有!!!关键字static的作用是什么?静态变量和静态方法在编译的时候就将其与类绑定在一起。既然都在编译时期被绑定了所以就和重写没什么关系了!!虽然在语法上面可以静态方法和静态属性貌似可以重写!但记住和重写一点关系都没有。

# 2.接口

# 介绍

Java中接口使用interface关键字修饰。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就必须实现接口中所有的方法。接口中的方法会被隐式地指定为public abstract方法并且只能是这种,(用其他关键字,比如private、protected、 final等修饰会报编译错误)。

# 特点

  • 接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题。
  • 接口中的方法会被隐式地指定为public abstract
  • 接口中可以定义常量 但必须是public static final修饰的。
  • 一个类可以实现多个接口
  • Java1.8中对接口增加了新的特性:
    • 默认方法:JDK1.8允许给接口添加非抽象的方法实现,但必须使用defualt关键字修饰,定义了default的方法可以不被实现子类所实现,只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法。
    • 静态方法:JDK1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用。
public class TestAbstract {
    public static void main(String[] args) {
        UserSerivice userSerivice=new UserSerivice();
        userSerivice.selectUser();
        User.selectAll();

    }

}
interface User {
    default void selectUser(){
        System.out.println("111");
    }
    static void selectAll(){
        System.out.println("222");
    }
}
class UserSerivice implements User{

}

image.png