final
- 修饰类
当用final修饰一个类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
- 修饰方法
- 修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
String
- 是final修饰的类,不可以被继承
- char数组用final修饰,不会只想一个新的char数组。
- 没有提供方法修改char数组中的内容
- StringBuilder 是线程不安全的
- StringBuffer是线程安全的
类加载
创建类对象时,从上往下执行非静态初始化语句、初始化块、最后是构造函数
类加载:从上往下执行静态初始化语句、初始化块、最后是构造函数
类加载优先于创建类对象
main在类里时先类加载,在执行main方法;main在类外时,按语句顺序执行。
面向对象编程
-
封装
解耦:降低对象交互
提高安全性,隐藏内部实现
减少重复代码
-
继承
重用父类代码,可以直接调用,可以添加自己的逻辑
-
多态
父类引用指向子类对象;降低代码量
理解方法调用
接口和抽象类
抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
equals和==
==比较的是地址
equals内部是用==来实现的,object类中仍然是比较地址,String中重写了equals方法,如果地址相同返回true,否则,遍历比较值。
重写equals要重写hashCode
Object类中,二者具有相同表现
equals比较时为false地址不一样,则hashCode一定不一样;
hashCode一样时,地址相同,equals为true