0727(018天 面向对象的不太重要的东西)
每日一狗(奥利奥喜欢趣多多)
面向对象的不太重要的东西
文章目录
1. 实例的数量有限的类:枚举
1.1 基本概念
取值范围有限、且离散、公共
限制类的实例化的对象数、且可以指定可选择的几个对象
1.2 注意事项
不能继承其他类,他原本就是继承enum的,但是可以实现接口。
枚举类型的构造方法是私有的,用的时候只能在几个已定义的选择进行选择。
要定义构造器的话也要构造一个私有的。
枚举是一个具有实例缓存的类
1.3 使用
package com.yang2;
public class T01 {
public static void main(String[] args) {
Teacher t = Teacher.物理; // 调用对象
System.out.println(t.getName()); // 张三
Teacher h = Teacher.化学;
h.setAge(20);
h.setName("王五");
System.out.println(h.toString()); // 王五::20
System.out.println(h); // 王五::20
}
}
enum Teacher {
物理("张三", 30), 化学, 数学;
private String name;
private int age;
public String toString() {
return this.name + "::" + this.age;
}
private Teacher(String name, int age) {
this.name = name;
this.age = age;
}
// =================
private Teacher() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
不用枚举实现相同的目的
- 不让外界创建对象
- 只允许在所定义的几个对象中进行选择
package com.yan2;
public class 季节 {
public static final 季节 春天 = new 季节("春天");
public static final 季节 夏天 = new 季节("夏天");
public static final 季节 秋天 = new 季节("秋天");
public static final 季节 冬天 = new 季节("冬天");
private String name;
private 季节(String name) {
this.name = name;
}
}
1.4 应用
- 单例模式
package com.yang2;
public class 单例模式 {
public static void main(String[] args) {
System.out.println(Earth.地球); // 地球
}
}
enum Earth {
地球;
}
- 在switch开关分支语句中直接使用(1.6+可以使用)
1.5 不可变类的
- 属性设定为私有常量
1.6 默认方法
-
valueOf()方法:
- 这是一个静态方法,传入一个字符串(枚举的名称),获取枚举类。如果传入的名称不存在,则报错。
- System.out.println(Teacher.valueOf(“物理”)); // 张三::30
-
values()方法:
-
返回包含枚举类中所有枚举数据的一个数组。
for (Teacher t : Teacher.values()) { System.out.println(t); /* * 张三::30 null::0 null::0 */ }
-
-
ordinal()方法
- 默认情况下,枚举类会给定义的枚举提供一个默认的次序,ordinal()方法就可以返回枚举的次序。(从零开始)
- System.out.println(Teacher.化学.ordinal()); // 1
2. Lambda表达式
2.1 概念
参考文章 Java中的lambda表达式如何理解——精简-Java架构师必看 (javajgs.com)
也称闭包
Lambda表达式是JDK1.8开始后的一种新语法形式
**作用:**简化匿名内部类的代码写法
格式:
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码
}
注:->是语法形式,无实际意义
一般情况下配合着接口和抽象类一起来使用,而且只有一个抽象类
2.2 应用
package com.yang3;
public class T01 {
/*
show 开始
有名的匿名内部类
show 结束
show 开始
lanmbda表达式
show 结束
show 开始
有名内部类
show 结束
show 开始
匿名lambda表达式
show 结束
show 开始
匿名lambda表达式简写
show 结束
*/
public static void main(String[] args) {
// 有名的匿名内部类
IA1 ia1 = new IA1() {
@Override
public void pp() {
System.out.println("有名的匿名内部类");
}
};
show(ia1);
// lanmbda表达式
IA1 ia2 = () -> {
System.out.println("lanmbda表达式");
};
show(ia2);
// 匿名内部类
show(new IA1() {
@Override
public void pp() {
System.out.println("有名内部类");
}
});
// 匿名lambda表达式
show(() -> {
System.out.println("匿名lambda表达式");
});
// 匿名lambda表达式简写
show(() -> System.out.println("匿名lambda表达式简写"));
}
public static void show(IA1 a) {
System.out.println("show 开始");
a.pp();
System.out.println("show 结束");
}
}
// 只能有一个抽象方法
interface IA1 {
public void pp();
}
3. 租车系统大体思路
需求:
车型:轿车、卡车、皮卡、汽车
折扣:不同车型按照租用时间具有不同的优惠政策