Java (Final 抽象类 接口)

发布于 2024-01-22  899 次阅读


最终类(final)

final修饰的类为最终类,不能被继承。
修饰的方法为最终方法,不能被重写。
修饰的变量为最终变量,仅可在声明时进行一次赋值。

public final class a{}
//不可被继承
public final void run(){}
//不可被重写
public final double discount = 0.7;
//不可重新赋值

用static final修饰的变量为常量,不能被修改。
代码可读性更好,更易于维护。
程序编译后,常量会被宏替换成字面量 -> 使用中常量和字面量的效率是一样的。

抽象类(abstract)

抽象类可以有所有类能够包含的成员(变量、方法、构造器)
抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
抽象类中有abstract修饰的方法为抽象方法,不能写方法体(仅有方法名,继承抽象方法的类必须重写抽象方法,否则该类也为抽象类)

设计抽象类能更好的实现行为多态。

public abstract class book{
    private String name;
    private int page;
    public abstract void COUNT_WORD();
//getter setter 忽略
}

public class Educated extends book(){
     public void COUNT_WORD(){
        System.out.println("3760450 words included");
     }
     //必须重写抽象方法。
}

接口(interface and implements)

用interface关键字可以定义出一种特殊的结构 接口:

public interface circle{
     /*public static final*/int pi = 3.1415926;//默认为常量
     /*public abstract*/void COUNT_LENGTH();//默认为抽象方法
     //不能有构造器和代码块{};
}

接口中的变量默认是常量,方法默认是抽象方法,不能有构造器。用接口不能创建对象。

类可以用接口实现(implement)一些接口内的功能,实现接口的类称为 实现类。
一个类可以实现多个接口,弥补了子类只能继承一个类的不足。支持面向接口编程。

public class house implements door,light{
     int light_switch=0;
     public void open(){
       System.out.println("Door opened!");
     }
     public void close(){
       System.out.println("Door closed!");
     }
     public void switch_(){
       light_switch = (light_switch==0? 1 :);
}
public interface door{
   void open();
   void close();
}
public interface light{

   void switch_();
}

使用接口能灵活切换各种实现。

接口在jdk8后新增的三种方法:

默认方法:用default修饰,默认用public修饰(需要被频繁调用),需要带方法体,是实例方法,可以用实现类创建的对象调用。
私有方法:从jdk9开始支持!用private修饰,需要带方法体,是实例方法,可以用默认方法访问私有方法,或在其他私有方法中访问私有方法。
静态方法:用static修饰,默认用public修饰需要带方法体,仅接口内部可调用。

使用新增方法,不用将每个调用接口的类都重写一遍方法,仅调用即可,降低扩展与维护成本。

接口的多继承:一个接口可以继承多个接口

public interface a{}
public interface b{}
public interface c{}

public interface d extends a,b,c{}
//d能够合并abc接口的所有功能,简单高效。

使用接口的注意事项:

  1. 一个类 / 接口继承多个接口时,若不同接口存在方法签名(方法名和返回值)冲突,则不能进行继承。
  2. 如果一个类继承了父类实现了接口,父类和接口存在相同的方法,会优先使用父类的方法。
  3. 如果一个类实现的多个接口有重名的默认方法,可以在类中直接重写方法。