一、Object类
Object类是所有类的父类,所有类默认继承Object类。
1.toString():取得对象信息
class Person{
private String name ;
private int age ;
public Person(String name, int age) {
this.age = age ;
this.name = name ;
}
}
class Student{}
public class Test {
public static void main(String[] args) {
fun(new Person("zhangsan",22) );
fun("你好");
}
public static void fun(Object obj) {
System.out.println(obj.toString()); // 默认输出对象调用的就是toString()方法
}
}
System.out.println()系统输出输出对象时,默认会调用该对象的toString(),若自定义类需要进行内容的输出,需要覆写toString()。
class Person{
private String name ;
private int age ;
public Person(String name, int age) {
this.age = age ;
this.name = name ;
}
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age ;
}
}
class Student{}
public class Test {
public static void main(String[] args) {
fun(new Person("张三",22) );
fun("你好");
}
public static void fun(Object obj) {
System.out.println(obj.toString()); // 默认输出对象调用的就是toString()方法
}
}
2.equals():比较两个对象内容
class Person{
private String name ;
private int age ;
public Person(String name, int age) {
this.age = age ;
this.name = name ;
}
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age ;
}
public boolean equals(Object obj) {
if (obj == null) {
return false ;
}
if(this == obj) {
return true ;
}
// 不是Person类对象
if (!(obj instanceof Person)) {
return false ;
}
Person person = (Person) obj ; // 向下转型,比较属性值
return this.name.equals(person.name) &&
this.age==person.age ;
}
}
class Student{}
public class Test {
public static void main(String[] args) {
Person per1 = new Person("yuisama", 20) ;
Person per2 = new Person("yuisama", 20) ;
System.out.println(per1.equals(per2));
}
}
Object类提供的equals默认比较两个对象的地址是否相同。
return(this==obj);
3.Object类可以接收所有引用类型,包括接口与数组。
Object类接收数组对象:
public static void main(String[] args) {
// Object接收数组对象,向上转型
Object obj = new int[]{1,2,3,4,5,6} ;
// 向下转型,需要强转
int[] data = (int[]) obj ;
for(int i :data){
System.out.println(i+"、");
}
}
Object接收接口对象:
interface IMessage {
public void getMessage() ;
}
class MessageImpl implements IMessage {
public String toString() {
return "I am person" ;
}
public void getMessage() {
System.out.println("你好");
}
}
public class Test {
public static void main(String[] args) {
IMessage msg = new MessageImpl() ; // 子类向父接口转型
Object obj = msg ; // 接口向Obejct转型
System.out.println(obj);
IMessage temp = (IMessage) obj ; // 强制类型转换
temp.getMessage();
}
}
Object类是参数的最高统一类型。
二、包装类:将基本类型封装到类中
数值型(Number的子类):Byte、Short、Integer(int)、Long、Float、Double
对象型(Object的子类):Boolean、Character(char)
装箱与拆箱
装箱:将基本数据类型变为包装类对象,通过每个包装类的构造方法实现装箱处理。
拆箱:将包装类中包装的基本数据类型取出,利用包装类提供的xxValue()方法
Integer提供的intValue()。
Integer num = new Integer(55) ; // 装箱
int data = num.intValue() ; // 拆箱
在JDK1.5之后,提供了自动拆装箱的机制,最为重要的是由于此类机制的存
在,可以直接利用包装类的对象进行各种数学计算。
// 自动装箱
Integer x = 55 ;
// 可以直接利用包装类对象操作
System.out.println(++x * 5 );
使用包装类与使用基本类型在用法上基本一致。
那么是用基本类型还是包装类?
1.[强制]所有POJO类(类中只有属性与getter/setter,构造方法)使用包装类;
2.局部变量推荐使用基本类型。
包装类进行数值比较使用equals方法。
阿里编码规范:所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。