Java基础知识回顾,还记得吗?( 二 )
静态方法只能使用静态方法和静态属性 , 不能使用成员属性和方法 。 因为静态属性和方法在对象还没有实例化的时候就存在类 。
简单理解就是不允许一个已经在的事物使用一个不存在的事物 。
子类属性与父类属性初始好顺序
- 无论如何 , 静态数据首先加载 , 所以先初始化父类静态变量和静态初始块(静态变量和静态初始块按源代码编写的顺序执行 , 普通初始化块和普通成员变量也是如此) , 再初始化子类静态变量和静态初始化块 。
- 普通初始化块和普通成员变量优先于构造方法 , 所以接下来加载父类的普通初始化块和普通成员变量 , 再调用父类构造方法 。
- 调用子类普通代码块 , 普通变量和构造方法 。
自动装箱是指:将基本数据类型转为对应的包装类对象的过程 。
自动拆箱是指:将包装类型转为对应的基本数据类型 。
自动装箱实际上是调用类包装类对象的valueof方法 , 如:Integer.valueof(1)
自动拆箱实际上是调用类包装类的xxxValue方法 , 如:Integer.intValue()
【Java基础知识回顾,还记得吗?】在自动装箱的时候 , 如果包装类允许缓存并且值在缓存的范围内 , 那么装箱生产的对象会被缓存到常量池中 。
Integer、Byte、Short、Long、Character包装类型具有缓存池 , 而其他三种:Float、Double、Boolean不具有缓存池 。
包装类的缓存池缓存范围基本都为:-128—— 127之间 , 除了Character的缓存范围为0——127 。
String为什么不可变?先说下我的看法:String是Java中最常使用的类没有之一 , 如果String时可变的 , 那么会发生非常多数不清的问题 。 如IP地址、人名、邮箱非常多的敏感数据 。 如果String时可变的 , 就会发生安全问题 , 且字符串常量池也就无从谈起了 。
String时不可变的 , 那么它的本质上也是线程安全的 。 不可变类的缺点就是每个不同值需要创建一个对象 。
String是用final修饰的 , 保证类String类不能被扩展 。 String内部的字段时用final修饰的 , 并且没有对外提供修改字段的方法 。 这也是为什么String不可变的原理 。
final关键字的作用
- 被final修饰的类 , 不能被继承 , 并且这个类所有成员方法都为final , 不能被重写 。
- 被final修饰的属性变量 , 不能被修改 。 如果该变量是基本数据类型 , 那么其值在初始化后不能被修改 。 如果该变量是引用类型 , 那么该引用不能再指向其他对象 。
- 被final修饰的方法不能被子类重写 。
StringBuffer是线程安全的 。 因此单线程情况下考虑使用StringBuilder , 多线程考虑使用StringBuffer 。
他们之间的关系就好比HashMap和HashTable的关系 。
equals知识点
- == 与 equals区别
- == , 如果是基本数据类型 , 比较的是值 , 如果是引用数据类型 , 比较的是对象的内存地址;equals比较的是对象的值 。 因此在java中比较2个对象的值是否相等使用equals , 判断2个对象释放是一个对象 , 使用== 。
- hashCode方法返回:
- equals方法重写要求
- 自反性:x.equals(x) == true 永远成立
- 非空性:x.equals(null) == false 永远成立
- 对称性:如果x.equals(y) == true,那y.equals(x) == true
- 传递性:如果x.equals(y) == tue,并且y.equals(z) == true,那么一定满足x.equals(z) == true
- 一致性:如果x.equals(y) == true,那么只要x和y的值不变 , 那么x.equals(y) == true 永远成立
推荐阅读
- 计算机专业大一下学期,该选择学习Java还是Python
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 再见了 虾米!两分钟回顾虾米音乐发展史
- 学习大数据是否需要学习JavaEE
- 从事Java开发时发现基础差,是否应该选择辞职自学一段时间
- 2021年Java和Python的应用趋势会有什么变化?
- 三星预热Galaxy S21:回顾Galaxy S系列历代变化
- 同质化时代玩法进阶 2020年手机行业技术回顾
- 普通大学计算机专业的本科生,该选择主攻前端还是Java
- Java语言会不会随着容器的兴起而衰落