第7章java的常用类
Object类
- 它是所有类的超类、基类,是所有类的直接或间接父类,位于继承树的最顶层
- 任何类,都不需要写extends Object,因为都是默认继承
- 该类的所有定义的方法,是所有对象都具备的方法
- Object类型可以存储任何对象
- 作为参数,可以接收任何对象
- 作为返回值,可返回任何对象
1.getClass()方法
- public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型。
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
接下来我来对该方法进行一系列测试:
测试1:Person类型实例化一它的派生类Studnet,所返回的是什么类型
测试2:不同类型相同实例化
3.hashCode()方法
- public int hashCode(){}
- 返回该对象的哈希码值。该值起到引用变量名查找堆里面的代码块的作用
- 哈希码根据对象的地址、字符串、数字使用hash算法计算出来的一个int数值
- 一把情况下相同对象返回相同哈希码,
4.toString()方法
- public String toString(){}
- 返回改对象的包+类名+@+十六进制哈希码
- 我们常常重写该方法,返回改对象的各个属性值。
5.equals()方法
- public boolean equals(Object obj){}
- 用来判断两个对象的引用地址是否相同
6.finalize()方法
- 当对象被判定为垃圾对象是,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象。
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间
- 自动回收机制:JVM的内存耗尽,一次性回收所有的垃圾对象
- 手动回收机制:使用System.gc(); 通知JVM执行垃圾回收
7.包装类型(装箱和拆箱)
缓存池:它也叫常量池,它是事先存储一些常用的数据、用以提高性能、 节省空间的一种技术。大部分的包装类型都实现了缓存池,当我们在自动封装的时候,如果基本类型的值处在缓存的范围内则不会重新创建对象,而是使用缓存池中已事先创建好的对象
-
已经缓存的有:
boolean 缓存了 true 和false
Byte 、Short、Integer 、Long 缓存了 -128到127
Character缓存了unicode编码 \u0000 到 \u007F- 值得注意的是:Integer的缓存值可以通过AutoBoxCacheMax进项调整闪现
-
我们在回顾一下java基本类型的取值范围:
整数类型:byte,1字节,8位,最大存储数据量是255,存放的数据范围 是-128~127之间。
整数类型:short,2字节,16位,最大数据存储量是65536,数据范围是-32768~32767之间。
整数类型:int,4字节,32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
整数类型:long,8字节,64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
浮点类型:float,4字节,32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
浮点类型:double,8字节,64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
字符型:char,2字节,16位,存储Unicode码,用单引号赋值。
布尔型:boolean,只有true和false两个取值
当变量a和b为10时,缓存池里面有-127~128的Integer值,所有这两个值进行比较返回true.
当变量a和b为128时,缓存池里面有-127~128的Integer值,所有这两个值进行比较返回false.
我们查看源码也看出:
看了源码后我们发现如果没有满足缓存池的条件 他将自动给我实例化一个对象,所以我们想要获取缓存池的值时千万不要直接使用new
注意:因为缓存池的原因,所以当两个包装类型进行比较的时候要用equals()方法进行比较,而不要使用==进行比较**
利用代码进行装箱和拆箱;
public class Test {
public static void main(String[] args) {
Integer a=8;//等价于 Integer a=Integer.valueOf(8);
int b=a; //等价于 int b=a.intValue()
}
}
String类
1.String字符串池
- 字符串是常量,创建之后不可以改变。
- 字符串字面值存储在字符串池中,可以共享
- 创建一个字符串有两种方式:
- String s=“hello”; //产生一个对象,字符串池中存储
- String s=new String(“hello”); //产生两个对象,堆、字符串池各一个然后s引用了堆里面的代码块,然后在指向字符串池里面的hello
public class Test {
public static void main(String[] args) {
String str1="hello";
}
}
public class Test {
public static voi