28. 知道 enum 关键字怎么用吗
1⃣️ 常量定义
public enum WeekDay {
SUN, MON, TUE, WED, THT, FRI, SAT
}
2⃣️ switch
public enum WeekDay {
SUN, MON, TUE, WED, THT, FRI, SAT
}
public class SelectDay{
WeekDay weekday = WeekDay.SUN;
public void select(){
switch(weekday){
case SUN:
weekday = WeekDay.SUN;
break;
...
}
}
}
3⃣️ 向枚举添加新方法
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色 ", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
4⃣️ 覆盖枚举方法
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色 ", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆盖方法
@Override
public String toString() {
return this.index + "_" + this.name;
}
}
5⃣️ 实现接口
public enum Color implements Behaviour {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色 ", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index + ":" + this.name);
}
}
6⃣️ 接口组织枚举
public interface Food {
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
}
enum Dessert implements Food {
FRUIT, CAKE, GELATO
}
}
7⃣️ 枚举集合
public class Test {
public static void main(String[] args) {
EnumSet<WeekDay> week = EnumSet.noneOf(WeekDay.class);
week.add(WeekDay.MON);
System.out.println("EnumSet 中的元素:" + week);
week.remove(WeekDay.MON);
System.out.println("EnumSet 中的元素:" + week);
week.addAll(EnumSet.complementOf(week));
System.out.println("EnumSet 中的元素:" + week);
week.removeAll(EnumSet.range(WeekDay.FRI, WeekDay.SAT));
System.out.println("EnumSet 中的元素:" + week);
}
29. 听说过 strictfp 关键字吗?(了解)
strictfp 的意思是 FP-strict,也就是说精确浮点的意思。在 Java 虚拟机进 行浮点运算时,如果没有指定 strictfp 关键字时,Java 的编译器以及运行环 境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,导 致得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口 或者方法时,那么所声明的范围内 Java 的编译器以及运行环境会完全依照浮点规范 IEEE-754 来执行。因此如果你想让你的浮点运算更加精确, 而且不会因 为不同的硬件平台所执行的结果不一致的话,那就请用关键字 strictfp。
你可以将一个类、接口以及方法声明为 strictfp,但是不允许对接口中的方法 以及构造函数声明 strictfp 关键字。
30. final 和 abstract 关键字
final 和 abstract 是功能相反的两个关键字,不可能同时存在
1⃣️ final 可以修饰:类、方法(构造方法除外)、属性
a. final 修饰的类不能作为父类被继承,如:String, Math
b. final 修饰的方法不能被重写
c. final 修饰的变量值不能改变,也就成了常量
2⃣️ abstract 可以修饰:类、方法(构造方法除外)
a. abstract 修饰的类是抽象类,需要被继承才可以实例化
b. abstract 修饰的方法是抽象方法,需要被子类重写
c. abstract 不能用来修饰私有方法、静态方法
注意:final 修饰基本类型变量,其值不能改变,由原来的变量变为常量;但是 final 修饰引用类型变量时,栈内存中的引用不能被改变,但是所指向的堆内存 中的对象的属性值仍然可以改变。如:
public class Test {
public static void main(String[] args) {
final Dog dog = new Dog("yuanBao");
dog.name = "wangWang";//正确
dog = new Dog("DingDang");//错误
}
}
31. final,finally,finalize 的区别
除了长的像,在用法上三者没有一点联系
1⃣️ final(见 30)
2⃣️ finally
异常处理中最后不管是否发生异常,finally 内的语句都会被执行。
常用于清除操作,如:关闭 IP 流,数据库连接,Socket 连接
3⃣️ finalize
是方法名,Object 类中最后的一个方法。Java 允许使用 finalize()方法在垃 圾收集器将对象从内存中清除前做必要的清理工作。由 jvm 调用,程序员不调!
32. throw 和 throws 的区别
1⃣️ 意义不同
throw 代表动作——手动抛出一个异常的动作,用在方法内只能抛出一个异常 throws 代表状态——该方法可能有异常,用在方法声明处可抛多个异常
2⃣️ 作用不同
throw 关键字用来在程序中明确的抛出异常
throws 语句用来表明方法不能处理的异常
3⃣️ 操作不同
throw 操作是主动的,即方法代码内,由程序员主动捕获异常后手动抛出
throws 操作是被动的,方法内没有捕获异常并处理而是在声明处抛出异常信息
参考:
http://www.bjsxt.com/javamianshiti.html
https://blog.csdn.net/a1436445152/article/details/94010198
https://www.nowcoder.com/