https://www.bilibili.com/video/BV1Kb411W75N?p=303
Object类
equals函数,
官方建议重写equal方法。
Date类:注意计算原点。
Java 的传递机制是值传递,地址也是地址值,所以基本类型无法通过值传递,交换原有,引用却可以。
string 类型因为常量池的存在,所以 == 和 重写的equals 方法一样
toString()注意源码,object的源码,输出的是类名加地址:
单元测试方法:
static在内存中只留存一份。这样,一个类的所有实例,都可以共享同一个变量。静态变量又叫类变量,随类 在方法区初始化一起初始化,且只一次。可以用类.静态变量调用。
注意静态和类是绑定的,和对象无关,所以在类方法中,super,this 等都不可用。且类初始化早于对象初始化,所以用这个逻辑去理解现象。
重载和重写,很重要。
构造器是用来造类对象的,所以不应该理解为对象能调用的方法。
JavaBean:
UML图:
封装和隐藏:private,关键字,是封装的体现,因为可以设置修改变量的条件,变量对外不可见。
this关键字,意指当前对象,而不是当前类。
this调用构造器:
super关键字:子类属性不会覆盖父类属性
子类构造器默认调用super()
从红线部分,可以看出,构造器和类绑定,并不和对象相关,所以用了构造器,未必就创造了对象。
包装类:
基本数据类型和object类没有关系,基本类型没有成员变量和方法。为了让基本数据类型,也具有类的特征,所以有了包装类。
基本数据类型转包装类,注意boolean-》Boolean。
包装类转基础类型,做加减乘除:
jdk5开始实现了自动装箱与拆箱。
基本数据类型,包装类和string的转换:
String 转int 和 Integer等:
面试题;因为三元运算符要保证所有东西类型范围一致,所以把Integer扩成Double了。看来println对Integer是值敏感的。而不是地址。
Integer底层实现了缓存区数组,将常用数放进数组。会让多个对象指向同一个地址,提高效率。这个数组【-128,127】.超出缓存区规定大小,则new一个新对象。
单例模式:系统中,只有一个当前类的对象。
注意成员和方法都是静态的,因此才能单例,直接通过类...调用,下图为饿汉式。
懒汉式创建:
应用场景:
代码块:
静态代码块,不需要new就会执行,只要有申明就执行,非静态代码块,要new对象才执行。多个同类代码块的执行顺序按定义时的先后顺序。但,静态代码块优先于非静态。
初始化时,由父及子,静态先行。
按代码块的位置,比较和显示初始化的顺序
final:不可以通过对象.属性来修改。注意static final 修饰全局常量。
abstract关键字:
abstract不能修饰的东西,仅考虑和是否能重写矛盾。
模版方法设计模式:联系填空题。或者英语论文模版
应用举例,计算某个函数运行时间。使用抽象方法,暴露出去,让子类实现。
接口定义了一组规范,因为必须实现所有抽象方法才能实例化,这个抽象方法可理解为规范,:
接口的应用,代理模式:
工厂模式:
接口中的静态方法和默认方法:默认方法的意义是,在这一组行为规范上,增加新的公有的行为规范,如果没有默认方法,所有实现类,都得添加这个相同的行为。
内部类:
实例化成员内部类,注意静态和非静态成员的区别,非静态得先实例化外面的类,再调用里面的初始化构造器。
局部内部类的实际使用。一般用来返回一个类或者接口类型
局部内部类一个注意点:好理解,因为一个类中使用的变量,其修改权限不应该随意交给外部方法,这样会增加错误。所以它调用的外部方法中的变量,必须是个final
异常:
异常处理过程:编译异常用try catch处理。运行时异常不处理。因为处理不了。
、hello---1不会执行,因为这个异常在上一条语句出现,并且被被处理掉了,直接进了catch
return 3:
throws 方式:把问题往上抛。一直到main方法,这个锅没人甩了,只能自己try catch 掉
手动抛出异常:注意是throw,而不是throws。 通过throw,手动创建一个异常。手动抛出会报错。
自定义异常类: