节制,是比仁慈更高尚的品德。|

subeipo

园龄:1个月粉丝:0关注:0

📂Java
🔖Java
2025-01-17 15:54阅读: 15评论: 0推荐: 0

Java初学者笔记-02、单例类枚举类抽象类接口

final关键字

可以修饰:类、方法、变量。

  1. 修饰类:不能被继承。
  2. 修饰方法:方法不能被子类重写。
  3. 修饰变量:有且仅能被赋值一次。

修饰变量分为:

  1. 修饰静态成员变量(static修饰)
public static final String NAME_ID = "666";

final修饰静态变量,被称为常量,通常这个值作为系统的配置信息。

  1. 修饰实例成员变量
private final String name = "666";

一般没有意义。

  1. 修饰局部变量。一般没有意义。

注意:final修饰引用类型的变量,变量存储的地址不能改,但指向的内容可以改。

单例类(设计模式)

什么是设计模式:一个问题的解法是最优的,这个最优解法被总结出来,称之为设计模式。
设计模式有23种。主要学什么:1)解决什么问题;2)设计模式怎么写。

单例类的作用

作用:确保某个类只能创建一个对象。(比如任务管理器只能开一个窗口,word可以开多个)

单例类的写法

  1. 饿汉式单例写法:(1)定义一个私有静态变量(即类变量,static修饰)new一个类对象。(2)类的构造器私有。(3)定义一个公开静态类方法getInstance()),返回对象。
//饿汉式单例:拿对象时,对象早就创建好了。
public class A{
private static A a = new A();
private A(){}
public static A getInstance(){
return a;
}
}
  1. 懒汉式单例写法:(1)定义一个私有静态变量(即类变量,static修饰),不new。(2)类的构造器私有。(3)定义一个公开静态类方法getInstance()),new对象,并返回对象。
//懒汉式单例类:用对象时,才开始创建对象。
public class A{
private static A a;
private A(){}
public static A getInstance(){
if(a == null){
a = new A();
}
return a;
}
}

懒汉式的优缺点:第一次拿对象没有饿汉式的快,但如果只用A中的静态方法,就不需要创建对象,到用到对象时调用getInstance()才会创建。

枚举类

枚举类是一种特殊类。是一种多例设计模式。如果名称只有1个,就是单例类。

枚举类的写法

写法:第一行只能罗列枚举对象的名称,这些名称本质是常量

修饰符 enum 枚举类名{
名称1,名称2,名称3 ...;
其他成员;
}

枚举类的注意事项

  1. 枚举类都是最终类,不可以被继承。
  2. 枚举类第一行只能罗列枚举对象的名称,这些名称本质是常量(static final),并且每个常量都会记住枚举类的一个对象。
  3. 枚举类的构造器是私有的,因此枚举类对外不能创建对象。
  4. 编译器为枚举类新增了几个方法。
public enum A{
X,Y,Z;
}
A a1 = A.X;
a1.name();//X
a1.ordinal();//0
a1.values();//拿到所有的枚举对象

枚举类的经典应用场景

很适合做信息分类和标志。比如东南西北四个方向,用枚举类。
虽然常量也可以做信息分类和标志,但使用常量,参数值不受约束。

抽象类

abstract可以修饰类、成员方法。修饰类就是抽象类。

抽象类的特点

  1. 抽象类不一定有抽象方法,但抽象方法一定在抽象类中。
  2. 抽象类可以有成员变量,方法,构造器。
  3. 抽象类不能创建对象,仅作为特殊的父类,让子类继承并实现。
  4. 一个抽象类的子类必须实现父类的所有抽象方法,不然这个子类也要定义为抽象类。
  5. 抽象类的使命就是被继承。
  6. 抽象类不是必须的技术,它只是一个最佳实践
  7. 更好支持多态。当父类知道每个子类都要做某个行为,子类的这个行为又不一样,就定义抽象方法,子类分别实现。

抽象类的应用-模板方法设计模式

模板方法的作用

提供一个方法作为完成某类功能的模板。模板方法封装了每个实现步骤,但允许子类提供特定步骤的实现。提高代码复用,简化子类设计。

模板方法的写法

  1. 定义抽象类。定义final模板方法和抽象方法。
public abstract class People{
private int age;
public final void write(){
"111".sout;
writeMain();
"333".sout;
}
public abstract void writeMain();
}
  1. 定义子类。重写抽象方法。
public class Student extends People{
@Override
public void writeMain{
"Student1 is Writing".sout;
}
}
Student s = new Student();
s.write();

接口

关键字:interface

JDK8之前

在JDK8之前,接口只能定义:

  1. 常量(必须初始化,接口public static final可以省略)。
  2. 抽象方法(public abstract可以省略)。

接口是被类实现(implements),实现类,一个类可以同时实现多个接口,必须重写所有接口的全部抽象方法,否则要定义为抽象类。

JDK8之后

JDK8之后新增的三种方法。
defaultprivatestatic修饰。

  1. default使用接口的实现类的对象来调用。
  2. private使用接口中其他实例方法调用。
  3. static只能使用当前接口名来调用。

优点:在开发时,已经有很多实现类,如果突然要在接口中新增一个功能,JDK8需要在所有的实现类里重写这个新增抽象方法,JDK8之后直接定义带方法体的方法,工作量少。

接口的作用

  1. 弥补了单继承的不足,角色可以更多。
  2. 面向接口编程,更容易解耦合。

接口的注意事项

  1. 接口和接口可以多继承,一个接口可以同时继承多个接口。
  2. 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则不支持多继承,也不支持多实现。

方法签名冲突,比如同样的返回值和方法名是可以合并的,但不同的返回值相同的方法名就会冲突。

  1. 父类和接口中有同名的方法,实现类会优先用父类的。
class Dog extends Animal implements A2{
public void go{//想要用接口中的,只能用这样的方法中转
show();//父类的
super.show();//父类的
A2.super.show();//接口的
}
}
  1. 一个类实现的多个接口中有同名方法,可以不冲突,只要重写该方法即可。

抽象类和接口的区别

相同点

  1. 都是抽象形式,都可以有抽象方法,都不能创建对象。
  2. 都是派生子类形式,抽象类是被子类继承使用,接口是被实现类实现。
  3. 继承抽象类或者所有接口,都必须重写所有抽象方法,否则自己要成为抽象类。
  4. 都能支持多态,都能够实现解耦合。

不同点

  1. 抽象类中可以定义类的全部普通成员,接口只能定义常量和抽象方法。
  2. 抽象类只能被类单继承,接口可以被类多实现。
  3. 抽象类体现模板思想,更利于做父类,实现代码的复用性。接口更适合做功能的解耦合,更灵活(多个实现类作为多个方案一起实现解耦合)。这只是最佳实践,最佳实现,最优雅。

本文作者:subeipo

本文链接:https://www.cnblogs.com/subeipo/p/18677193/java-chu-xue-zhe-bi-ji02-dan-li-lei-mei-ju-lei-cho

版权声明:本作品采用署名—非商业性使用—相同方式共享 4.0 协议许可协议进行许可。

posted @   subeipo  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起