Object类
1.定义
Object类是所有类的父类,所有类默认继承Object类。即所有类的对象都可以使用Object进行接收。
Object类可以接收所有引用类型,包括接口和数组。
Object类是参数的最高统一类型。
2. 获取对象信息
在使用对象直接输出的时候,默认输出的是一个地址编码。如果现在使用的是String类,该类对象直接输出的是内容,主要原因就是toString()方法的问题。
toString():取得对象信息
System.out.println ( )系统输出输出对象时,默认会调用该对象的 toString()
若自定义类需要进行内容的输出,需要覆写 toString()
范例:覆写toString()方法
class Person{
private String name ;
private int age ;
public Person(String name, int age) {
this.age = age ;
this.name = name ;
}
@Override
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age ;
}
}
class Student{}
public class Test {
public static void main(String[] args) {
fun(new Person("yuisama",25) );
fun("Hello");
}
public static void fun(Object obj) {
System.out.println(obj.toString()); // 默认输出对象调用的就是toString()方法
}
}
toString()的核心目的在于取得对象信息。
String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见了String并且执行了 + ,那么都要求将其变为字符串后连接,而所有对象要想变为字符串就默认使用 toString() 方法。
3.对象比较
String类对象的比较使用的是equals()方法,实际上String类的equals()方法就是覆写的Object类中的equals()方法。
equals():比较两个对象内容
Object类提供的equals默认比较两个对象的地址是否相同。
------equals方法的覆写------
public boolean equals(Object obj){
//判断地址是否相等
if (obj == this) {
return true;
}
//判断传进来的对象不是Person对象
if (!(obj instanceof Person)){
return false;
}
//此时需要比较两个Person对象的内容
//需要向下转型转回Person对象后比较两者属性的内容
Person per = (Person) obj;
return this.age == per.age
&&this.name.equals(per.name);
}
4.接收引用数据类型
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可以接收接口是Java中的强制要求,因为接口本身不能继承任何类。
范例:使用Object接收接口对象
interface IMessage {
public void getMessage() ;
}
class MessageImpl implements IMessage {
@Override
public String toString() {
return "I am a student" ;
}
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类是参数的最高统一类型。
包装类:将基本类型封装到类中
1.定义
自己定义一个包装类
class IntDemo {
private int num ;
public IntDemo(int num) {
this.num = num ;
}
public int intValue() {
return this.num ;
}
}
此时IntDemo实际上就是int数据类型的包装类,利用IntValue就可以实现基本数据类型变为对象的需求。
public static void main(String[] args) {
// 子类对象向上转型
Object obj = new IntDemo(55) ;
IntDemo temp = (IntDemo) obj ; // 向下转型
System.out.println(temp.intValue()); // 取出里面的基本数据类型操作
}
结论:将基本数据类型包装为一个类对象的本质就是使用Object进行接收处理。
Java为了方便开发,专门提供了包装类的使用,
而对于包装类的使用,提供了两种类型。如下:
数值型(Number的子类):Byte、Short、Integer(int)、Long、Float、Double
对象型(Object的子类):Boolean、Character(char)
2.装箱与拆箱
装箱:将基本数据类型变为包装类对象,通过每个包装类的构造方法来实现装箱处理。
拆箱:将包装类中包装的基本数据类型取出,利用包装类提供的xxValue()方法
Integer提供的 intValue();
范例:以int和Integer举例
Integer num = new Integer(55) ; // 装箱
int data = num.intValue() ; // 拆箱
System.out.println(data);
自动拆装箱:
使用包装类与使用基本类型在用法上基本一致
// 自动装箱
Integer x = 55 ;
// 可以直接利用包装类对象操作
System.out.println(++x * 5 );
用基本类型还是包装类?
1.【强制】所有POJO类(类中只有属性与getter/setter,构造方法)使用包装类。
2.局部变量推荐使用基本类型
----包装类进行数值比较使用equals方法----
说明:
对于Integer var = ? 直接赋值在 [-128~127] 区间内的赋值,Integer 对象在缓存池产生,会复用已有对象。在这个区间外的所有数据均在堆上产生,并且不会复用已有对象。
3.String 与基本类型的相互转化
String ->基本类型
使用各个包装类提供的parseXX()方法。
比如:Integer . parseInt (str);
当字符串中包含了非数字,在运行时会抛出 NumberFormatException 错误
基本类型->String
- 任何数据类型使用了"+"连接空白字符串就变为了字符串类型。
- 通过String的构造方法
- 使用String类中提供的valueOf()方法,此方法不产生垃圾。