Java基础琐碎知识点
IDEA 断点调试
设置断点,一步步的查看代码的执行过程是 debug 的重要途径。
这里介绍 IDEA 对 java 进行断点调试的一些基本操作。
快捷键:
- F7 跳入,即跳入方法体内
- F8 跳过,即逐行执行
- shift + F8 跳出,即跳出方法体
- F9 执行到下一个断点
设置断点只需单击代码左边的数字编号和代码之间的空白处即可。
通常,点击 F7 并不能进入源码查看方法,而是需要强制跳入,快捷键 alt + shift + F7。或者是更新一下 IDEA 的设置。
- 点击左上角的 File,选择 Setting
- 选择 Build,Exception,Deployment
- 选择 Debugger,再选择 Stepping
- 将 Do not step into the classes 取消勾选,或者是将其下方框内的部分源码类取消勾选。一般选择 java, javax 就够了
IDEA 快捷键
IDEA 有很多方便日常开发的快捷键,可以通过 settings -> Keymap -> Editor Actions 查看所有的快捷键,也可对已有的进行增改
而且,在开发时可以通过 ctrl + j 快捷键显示所有的快捷键
IDEA 运行时加命令行参数
- 在 IDEA 右上角的执行标志(绿色三角)左侧的下拉框中选择 Edit Configurations
- 在出现的设置页面中,找对应的 Program Arguments选项,在里面填入参数即可。注意,字符串由空格隔开;不同版本 IDEA 选项位置可能不一样,但是都在这个设置里
添加参数后效果:
代码:
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
执行情况:
jerry
is
a
dog
枚举类
自定义枚举
- 构造器私有化,去掉属性的 Set 方法,防止属性被修改
- 在枚举类的内部创建固定的对象,使用 static + final 修饰
- 枚举对象名通常全部大写,这是常量的命名规范
- 枚举对象也可以有多个属性
例子:
public class EnumerationTest01 {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
System.out.println(Season.SUMMER);
}
}
class Season {
private String name;
private String desc;
// 定义了四个对象,固定下来不能修改
// 加入 final 优化
public static final Season SPRING = new Season("春天", "温暖");
public static final Season SUMMER = new Season("夏天", "炎热");
public static final Season AUTUMN = new Season("秋天", "凉爽");
public static final Season WINTER = new Season("冬天", "寒冷");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return this.name;
}
public String getDesc() {
return this.desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
使用 enum 关键字实现
- 使用关键字 enum 替代 class
- public static final Season SPRING = new Season(“春天”, “温暖”) 改为 SPRING(“春天”, “温暖”) , 即 常量名(实参列表)
- 如果有多个常量,使用 , 号间隔,最后一个要有分号
- 如果使用 enum ,需要将定义的常量对象写在最前面
例子:
enum Season2 {
// 使用了 enum 实现枚举类
// 1. 使用关键字 enum 替代 class
// 2. public static final Season SPRING = new Season("春天", "温暖")
// 改为 SPRING("春天", "温暖") , 即 常量名(实参列表)
// 3. 如果有多个常量,使用 , 号间隔
// 4. 如果使用 enum ,需要将定义的常量对象写在最前面
SPRING("春天", "温暖"),
SUMMER("夏天", "炎热"),
AUTUMN("秋天", "凉爽"),
WINNER("冬天", "寒冷");
private String name;
private String desc;
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return this.name;
}
public String getDesc() {
return this.desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
注意:
- 当使用 enum 构建枚举类时,在底层会默认继承 Enum 类,而且是一个 final 类
- 传统的 public static final Season SPRING = new Season(“春天”, “温暖”) 改为 SPRING(“春天”, “温暖”)
- 而若使用无参构造器创建枚举对象,则实参列表和小括号都可以省略,即可以只写常量名
- 如果有多个常量,使用 , 号间隔,最后一个要有分号
- 如果使用 enum ,需要将定义的常量对象写在最前面
- enum 关键字修饰的枚举类不能继承其他类
- 枚举类也可以实现接口
Enum 类方法
方法名 | 功能 |
---|---|
name | 返回当前的枚举常量名称 |
ordinal | 输出当前枚举常量的顺序(编号,从0开始) |
values | 返回一个枚举对象数组,包含所有已经定义的枚举常量,数组中元素顺序与定义顺序相同 |
valueOf | 将一个字符串转换为枚举常量,但是要求字符串对应的枚举常量应该存在 |
compareTo | 比较两个枚举常量的编号大小( A.compareTo(B) ,底层是 A的编号 - B的编号 ) |
注解(Annotation)
- 注解也被称为元数据,用于修饰解释代码的数据信息(包、类、方法、属性等)
- 和注释一样,注解不影响程序逻辑,但是注解可以被编译运行,相当于嵌入进代码的补充信息
- 在 JavaSE 中,主要用来标记过时的功能和忽略警告
使用 Annotation 时要在其前面加上 @ 符号,并把该 Annotation 当成一个修饰符使用,用于修饰它支持的程序元素
三个基本的 Annotation:
- @Override:限定某个方法,表示该方法是重写父类的方法,该注解只能用于该方法
- @Deprecated:用于表示某个程序元素(类、方法)已经过时
- @SuppressWarning:抑制编译器警告
@Override
- 一般放在子类重写的父类方法的上一行,只能修饰方法
- 即使不加,也不影响子类重写父类的方法
- 但是,如果加了,子类就一定要重写父类的方法(不能只是声明,但是方法体内为空,编译器会检查),否则就会报编译错误
@interface
它不是 interface 接口类,而是代表注解类。
@Override 就是一个注解类,如 @Override 的定义:
// 修饰注解的注释,元注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Deprecated
用于表示某个程序元素(类、方法)已经过时
过时仍然能用,表示不再推荐使用,
- 可以用作新旧版本的兼容和过渡
- 可以修饰 类、包、构造器、参数、方法等
@SuppressWarning
忽略程序中的警告⚠
若不想看到警告,可以使用该注解抑制警告信息
- 使用
@SuppressWarning({""})
,在 {“”} 中写入特定的需要抑制的警告,常用参数:
参数名 | 功能 |
---|---|
unchecked | 忽略没有检查的警告 |
unused | 忽略没有使用某个程序元素的警告 |
rawtypes | 忽略没有指定泛型的警告 |
- 作用范围与放置位置相关,比如放在方法体上,那么只会忽略该方法内的警告信息
源码:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) // 可用类型
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
/**
* The set of warnings that are to be suppressed by the compiler in the
* annotated element. Duplicate names are permitted. The second and
* successive occurrences of a name are ignored. The presence of
* unrecognized warning names is <i>not</i> an error: Compilers must
* ignore any warning names they do not recognize. They are, however,
* free to emit a warning if an annotation contains an unrecognized
* warning name.
*
* <p> The string {@code "unchecked"} is used to suppress
* unchecked warnings. Compiler vendors should document the
* additional warning names they support in conjunction with this
* annotation type. They are encouraged to cooperate to ensure
* that the same names work across multiple compilers.
* @return the set of warnings to be suppressed
*/
String[] value(); // 存放忽略的类型数组
}
元注解
就是修饰注解的注解,本身作用不大,主要用于理解底层源码
种类:
- Retention: 指定注解的作用范围
- Target: 指定注解的适用对象
- Documented: 指定该注解是否会在 Javadoc 中体现
- Inherited : 子类会继承父类的注解