009_抽象类和接口

抽象类和接口

final关键字

  • final关键字是最终的意思,可以修饰类、方法、变量。
    • 修饰类:该类被称为最终类、特点不能再被继承了。
    • 修饰方法:该方法被称为最终方法,特点是不能被重写。
    • 修饰变量:该变量有且仅能被赋值一次。
  • final修饰基本类型的变量,变量存储的数据不能被改变。
  • final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。

常量

  • 使用了static final 修饰的成员变量称为常量。
  • 作用:常用于记录系统的配置信息、
  • 常量命名规范:建议使用大小写英文单词,多个单词使用下划线连接起来。
  • 常量记录系统配置信息的优势、执行原理
    • 代码可读性更好,可维护性也更好。
    • 程序编译后,常量会被"宏替换":出现常量的地方全部会被替换成其记住的字面量,可以保证使用常量和直接用字面量的性能是一样的。

单例模式(设计模式)

  • 设计模式:一个问题通常由n种解法,其中肯定有一种解法是最优解。
  • 设置模式有20多种,对应20多种软件开发中会遇到的问题。
    -单例设计模式
    • 作用:确保某各类中只能创建一个对象。
    • 写法,实现步骤:
      • 把类的构造器私有。
      • 定义一个静态变量记住类的一个对象。
      • 定义一个静态方法,返回对象。
java 复制代码
 // 单例类
public class A {
    // 2、定义一个静态变量记住类的一个对象
    private static A a = new A();
    // 1、私有构造器
    private A(){
    }
    // 3、定义一个静态方法返回对象
    public static A getObject(){
        return a;
    }
}
  • 单例类有很多形式
    • 如"饿汉式单例":拿对象时,对象早就创建好了。
java 复制代码
public class A {
    // 2、定义一个静态变量记住类的一个对象
    private static A a = new A();
    // 1、私有构造器
    private A(){
    }
    // 3、定义一个静态方法返回对象
    public static A getObject(){
        return a;
    }
}
  • 如"懒汉式单例":拿对象时,才开始创建对象。
    • 特点:延迟加载对象
    • 写法:
      • 把类的构造器私有。
      • 定义一个静态变量由于存储对象。
      • 提供一个静态方法,保证返回的是同一个对象。
java 复制代码
public class B {
    // 2、定义一个类变量量用于存储对象
    private static B b ; // null
    // 1、单例必须私有构造器
    private B(){
    }
    // 3、提供一个类方法返回类的一个对象
    public static B getObject(){
        if(b == null){
            b = new B();
        }
        return b;
    }
}

枚举类

  • 枚举类是一种特殊类。
  • 写法
java 复制代码
修饰符 enum 枚举类名{
    名称1 ,  名称2, ... ; 
       其他成员...
}
  • 特点:
    • 枚举类中的第一行,只能写枚举类的对象名称,其要用逗号隔开。
    • 这些名称,本质是常量,每个常量都记住了枚举类的一个对象。
java 复制代码
public enum A{
X , Y , Z;
}

Compiled from "A.java"
public final class A extends java.lang.Enum<A> {
    public static final A X = new A();
    public static final A Y = new A();
    public static final A Z = new A();
    public static A[] values();
    public static A valueOf(java.lang.String);
}
  • 枚举类都是最终类,不可以被继承、枚举类都是继承java.lang.Enun类的。
  • 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
  • 枚举类很适合做信息分类和标志。

抽象类

  • java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。
  • abstract修饰类,这个类就是抽象类
  • abstract修饰方法,这个方法就是抽象方法。
java 复制代码
修饰符 abstract class 类名{ 
	修饰符 abstract 返回值类型 方法名称(形参列表);
 }
 
 public abstract class A {
    // 抽象方法:必须abstract修饰,只有方法签名,不能有方法体
    public abstract void test();
 }

抽象类的注意事项、特点

  • 抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。
  • 类有的成员:成员变量、方法、构造器,抽象类都可以有。
  • 抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
  • 一个类的继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

使用抽象类的好处

  • 父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。

模版方法设计模式

  • 提供一个方法作为完成某类功能的模版、模版方法封装了每个实现步骤,但允许子类提供特定步骤的实现。
  • 模版方法设计模式可以:提高代码的复用、并简化子类设计。
  • 写法
    • 定义一个抽象类。
    • 在里面定义2个方法
      • 一个是模版方法:把共同的实现步骤放里面去。
      • 一个是抽象方法:不确定的实现步骤,交给具体的子类来完成。
  • 建议使用 final 关键字修饰模版方法
    • 模范方法是给子类直接使用的,不能被子类重写。
    • 一旦子类重写了模版方法,模版方法就失效了。

接口

  • java提供了interface关键字定义接口。
java 复制代码
public interface 接口名 {
    // 成员变量(常量)
    // 成员方法(抽象方法)
} 
  • 接口不能创建对象,
  • 接口是用来被类实现(implements)的,实现接口的类称为实现类,一个类可以实现多个接口。
java 复制代码
修饰符 class 实现类类名 implements 接口1, 接口2, 接口3 , ... {
    //实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。
} 

接口的好处

  • 弥补了类单继承的不足,一个类同时可以实现多个接口,使类的角色更多,功能强大。
  • 让程序可以面相接口编程,这样程序员就可以灵活方便的切换各种业务实现(更利于程序的解耦合)。
  • JDK 8开始,接口新增了三种形式的方法
  • 增强了接口的能力,更便于项目的扩展和维护。
java 复制代码
public interface A{
    /**
    * 1、默认方法(实例方法):使用用default修饰,默认会被加上public修饰。
    * 注意:只能使用接口的实现类对象调用
    */
    default void test1(){
    ...
    }
    /**
    * 2、私有方法:必须用private修饰(JDK 9开始才支持)
    */
    private void test2(){
        ...
    }
    /**
    * 3、类方法(静态方法):使用static修饰,默认会被加上public修饰。
    * 注意:只能用接口名来调用。
    */
    static void test3(){
        ...
        }
    
}

接口的注意事项

  • 接口与接口可以多继承:一个接口可以同时继承多个接口[重点]。
  • 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承,也不支持多实现。
  • 一个类继承了父类,又同时实现了接口,如果父类中和接口中有同名的默认方法,实现类会优先用父类的。
  • 一个类实现了多个接口,如果多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
相关推荐
zilong_zzz几秒前
系统编程3(共享内存/信号量)
java·开发语言
字节源流10 分钟前
【RabbitMQ】死信队列
java·rabbitmq·java-rabbitmq
肾透侧视攻城狮10 分钟前
深入浅出一下Python函数的核心概念与进阶应用
开发语言·python·map·filter·闭包·reduce·py偏函数
zy01010114 分钟前
useEffect
开发语言·前端·javascript·react·useeffect
五行星辰17 分钟前
SAX解析XML:Java程序员的“刑侦破案式“数据处理
xml·java·开发语言
kovlistudio19 分钟前
红宝书第四十讲:React 核心概念:组件化 & 虚拟 DOM 简单教程
开发语言·前端·javascript·学习·react.js·前端框架
向哆哆21 分钟前
Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路
java·eclipse·intellij-idea
地球驾驶员27 分钟前
NX二次开发C#---搭建NX开发环境(NX1926+VS2019)
开发语言·c#
zx132342 分钟前
chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
开发语言·javascript·ecmascript
你是狒狒吗1 小时前
HttpServletRequest是什么
java