Object类
在一个类没有直接使用extends关键字继承其他类时,这个类默认继承Object,Object是整个Java类中最顶级的类。
to String()
Object类中有这样一个方法to String()方法。
作用:用于输出对象时,将对象转为字符串形式。
在控制台输出一个对象,那对象存储在内存中,怎么输出?
其实在输出时,看似输出的是对象,其实输出的是一个字符串。因为在输出对象的时,默认调用类中的to String(),若类中没有to String()方法,那么就会调用父类中的to String()。但是子类的实现与父类的实现不同,所以在子类中重写父类的to String(),自己指定输出格式,以后输出时调用自己的to String()方法。
Object类中的to String()方法,它输出的是对象的类名以及对象在内存中的地址:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//hashCode()拿到对象在内存中的哈希值(10进制整数)
//Integer.toHexString(哈希值)转为16进制整数
基本类型包装类
基本类型---->8种基本类型:byte、short、int、long、float、double、boolean、char
基本类型是通过这8种关键字,来进行声明定义的,结构简单,不符合面向对象的思维操作,例如:
int a = 10;//值就是10
为什么要有包装类呢?
因为基本数据类型,它是使用关键字定义的,而不是面向对象的。所以在Java语言中,为每一个基本数据类型都提供了一个类进行包装表示,这样就是以面向对象的方式来进行操作。
因为有8种数据类型,所以Java为我们提供了8个包装类。
包装类的用途,主要包含两种:
-
作为和基本数据类型对应的类型存在
-
包含每种基本数据类型的相关属性如最大值,最小值等,以及相关的操作方法。
包装类常用的属性方法
以Integer为例,其余7个都是类似的:
- public static final int MAX_VALUE 最大的int型数
- public static final int MIN_VALUE 最小的int型数
构造方法 :通过构造方法,把字符串数字,基本类型值,包装到一个包装类对象中,使用面向对象进行操作。
- Integer(int a);
- Integer(String a);
比较方法:
- static int compareTo(Integer a); //比较对象中的内容,输出0(相等)、1(大于)、2(小于)
- boolean equals(Object);
- int max(int a,int b); //输出a,b二者中最大的
- int min(int a,int b); //输出a,b二者中最小的
转换方法:
- static toBinaryString(int i); //输出二进制
- static String toHexString(int i); //输出十六进制
- static String toOctalString(int i); //输出八进制
- int intValue(); //返回的是包装类型中的原始基本值
- static int parseInt(String s); //把字符串数字转为基本类型Int
- String toString(); //将整数类型的值转换为字符串类型,并返回转换后的字符串
- static Integer valueOf(int i) ;//将基本类型转为包装类型
- static Integer valueOf(String s);//将字符串类型转为包装类型
基本类型与基本类型包装类之间的转换
自动装箱:就是把基本类型转为包装类型;
int a = 10;
Integer ba = a;//把基本类型直接赋给引用类型,进行包装,产生了一个Integer类的对象,称为自动装箱
自动拆箱:就是把包装类型转为基本类型
Integer c = new Integer(10);
int d=c;//拆箱时,默认会调用c.intValue();取出其中的int值,这个过程是隐式的
关于自动装箱的面试题
Integer a = 127;
Integer b = 127;//a = b true
Integer c = 128;
Integer d = 128;//c = d false
原因:首先执行上诉语句时,默认会调用
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
通过上述源码可以看出在Integer类中为了节省时间,对-128---+127之间的256个对象进行了缓存(在数组中),所以当传入的值
-
在-128---+127之间时,则直接从数组中获取,如果取得的值是相同的,那么取得的对象也就是相同的。
-
不在-128---+127之间时,则每次都会创建一个新的对象