11.2 p425-429(5p)今天做了咨询。我觉得,触碰到我最内心深处的东西了。洗衣服的时候emo了
11.3 p430-435(6p)下组会就九点了。。。尽力了。
11.4 p436-440(5p)…确实是最空闲的周四…我反省
11.5-11.6 啥都没看,科研也没弄,太冷了,北京初雪给我惊到了
11.7 p441-449(9p)待在寝室效率确实好低
11.8p450-465(16p)同上
总结:这周状态很差劲。。。emo对我学习状态影响特大,不过我决定不苛责自己,允许这么一周失控的存在。
文章目录
11章 枚举和注解
枚举介绍
设置个性化文件头
引入—>创建一个类season,但是其实其固定name只有四个?只读而不需更改
—>用枚举,即把具体的对象一个个列出来
- 枚举:enumeration 即一组常量的集合,属于一种特殊类,包含一组有限特定对象
- 实现方式:自定义或enum关键字
自定义枚举
//1.私有化构造器
//2.去掉set方法
//3.内部创建对象,可加public static final
enum枚举
1.使用enum替代class
2.创建对象改为spring(",") 常量名(实参列表)(调用的是有参构造器)
3.如果有多个常量,使用,分隔
4.要将枚举对象写在最前面(甚至在定义的参数前面)
5.当使用无参构造器,可以省略括号或实参列表
用javap证明继承了enum类
发现可以直接open in terminal,跟在命令行是一样的,用javap看继承类
enum Gender{
GOY,GIRL;
}//是对的,枚举类Gender无属性调用无参构造器
enum成员方法
System.out.println(winter.name());//1.输出常量名
System.out.println(winter.ordinal());//2.输出枚举对象的次序或编号
//3.从反编译看出values可返回Season2[],即返回所有常量
System.out.println(Season2.values());
Season2[] values =Season2.values();
for (Season2 season:values) {//增强for循环 像python的lambda
/*相当于for(int i,i<values.length(),i++){
Season2 season = values[i]
}*/
System.out.println(season);//SPRING, WINTER
}
Season2 s=Season2.valueOf("WINTER");
//4.('')是否在season2中,若有则返回,无则报错
System.out.println(s);//WINTER
//5.比较枚举常量(根据编号)返回值=前编号-后编号
System.out.println(Season2.WINTER.compareTo(Season2.SPRING));
注意:enum不能继承其他类(已隐形继承enum类),但可以实现接口
JDK内置基本注解
注解:修饰解释包,方法等数据信息
public @interface xx{
//看见@interface,这是一个注解类
}
@override 重写父类方法 只是编译器会对语法校验:父类是否真的有这个方法
//源码 @target(elementtype.method)即说明只能修饰方法
//target是修饰注解的注解:即元注解
@deprecated 某个类or方法or字段or参数过时了 不再推荐使用,但可以使用,即java版本升级的过渡
@suppresswarnings 抑制编译器警告
即有洁癖的不希望看到warning,@suppresswarnings ({“rawtypes”,“unchecked”})//未指定泛型,没检查的警告,或直接写个all
作用范围与放置位置有关,想全部抑制放在类上
元注解
retention //指定注解作用范围(编译、class、jvm)
target//指定注解修饰范围(类、方法…)
documented//在javadoc生成文档时可以看到该注解(retention必为runtime)
inherited//被修饰的类,则其子类自动有这个注解
作业:
匿名内部类还是得看看
package Homework;
/**
* @version 1.0
* @ author sookie
*/
public class h06 {
public static void main(String[] args) {
Person person = new Person("唐僧", new Horse());//不要浪费对象
person.common();
person.passRiver();
}
}
interface Vehicles{
void work();
}
class Horse implements Vehicles{
@Override
public void work() {
System.out.println("horse work...");
}
}
class Boat implements Vehicles{
@Override
public void work() {
System.out.println("boat work...");
}
}
/*
class VehiclesFactory{
Horse horse=new Horse();
Boat boat = new Boat();
public Horse getHorse(){ return horse};
public Boat getBoat(){return boat};
太冗余,直接return
}*/
class VehiclesFactory{
//不想再创建对象,用static
//再优化:白龙马只有一匹,可以不用new,一直一匹马---->用饿汉式
//改前:
// public static Horse getHorse(){ return new Horse();}
//改后:
private static Horse horse=new Horse();
private VehiclesFactory() {}//构造器也要私有化
public static Horse getHorse(){ return horse;}
public static Boat getBoat(){return new Boat();}
}
class fly{}
class Person{
private String name;
private Vehicles vehicles;//接口可以作为属性?
// 接口like父类,可以接收实现了该接口的类的对象
public Person(String name, Vehicles vehicles) {
this.name = name;
this.vehicles = vehicles;
}
//要求5:具体要求封装成方法
public void passRiver(){
// Boat boat = VehiclesFactory.getBoat();
// boat.work();//重复了,用vercile,且不能浪费构造器的vehicle
if (!(vehicles instanceof Boat)){
//重要!if(vehicles==null),则如果是马也判断不出来
vehicles= VehiclesFactory.getBoat();
}
vehicles.work();
}
public void common(){
if (!(vehicles instanceof Horse)){
vehicles=VehiclesFactory.getHorse();
}
vehicles.work();
}
}
package Homework;
/**
* @version 1.0
* @ author sookie
*/
/*
car类有温度,有air类,air类有flow可通过温度来吹不同的风
实例化多种温度的car
*/
public class h07 {
public static void main(String[] args) {
Car car = new Car(20);
car.getAir().flow();//改后
Car car1 = new Car(60);
car1.getAir().flow();
}
}
class Car{
private double temperature;
/*改前:很奇怪,不知道new car的时候怎么写
private Air air;
public Car(double temperature, Air air) {
this.temperature = temperature;
this.air = air;
}*/
//改后,
// 不要将air私有化一个属性,创建一个可以返回air的方法,
// 构造器只有温度一个参数,在main里也是调用getair
public Air getAir(){
return new Air();
}
public Car(double temperature) {
this.temperature = temperature;
}
class Air{
public void flow(){
if (temperature>40) System.out.println("cold....");
else if (temperature<0) System.out.println("hot....");
else System.out.println("close");
}
}
}
完全不记得switch
12章 异常(Exception)
当出现错误程序,即停住不再执行,报错,如果这个错误影响不大,仍希望程序继续跑起来?----->对异常捕获,用异常处理机制
选中代码块—ctrl+alt+t
异常的概念
异常:程序执行的不正常情况(不包括语法和逻辑错误)
可分两类:
error:如栈溢出oom等,程序崩溃无法解决
exception:运行时|编译时,由编程错误或外在因素导致一般性问题,可处理,如空指针访问
异常体系图(!)
idea中:throwable ,ctrl+b,进入后show diagram,ctrl+alt+b选择相应子类显示
常见异常
常见运行异常(5)
常见编译异常
异常处理概念
两种方式:(二选一)
(1)trycatchfinally(即自己处理)
- 异常发生,直接跳过后面代码进入catch
- 异常未发生,try执行完跳过catch
- 无论异常是否发生,执行finally代码块
- 可多个catch(子类异常在前)
- 可以tryfinally,即不处理异常,程序会崩溃(finally之后的语句都不会被执行),eg不管是否发生异常,必须释放资源挂掉程序等
(2)throws(即丢给调用者处理)(默认都是throws,所以其实会层层上升给jvm,直接报错退出)
- p451多看看 catch和finally都有return,returnfinally1的;只有catch有但是finally对它进行处理,catch会有临时变量,仍返回未操作的值
异常处理分类
- 编译异常也可以直接trycatch或抛出,即可正常运行
- 运行异常默认throws
自定义异常
自定义异常类继承exception或者runtimeException(一般是这个,可以使用默认处理机制)
throw与throws
注意2,3顺序