基本作用
在java中所有的类都有一个公共的父类,一个类只要没有明显地继承一个类,则肯定是Object类的子类。
class Person extends Object{
}
class Person{
}
复制代码
一个设计良好的类最好覆盖Object类中的equals()、hashCode()、toString()3个方法。
Object类提供的equals()方法默认是比较地址的。
Object类中的equals()方法实际上也是可以使用的,但是其默认使用的是按地址进行比较,并不能对内容进行比较。
复制代码
package com.dzj.object;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 覆写Object类中的equals()方法
public boolean equals(Object obj) {
if (this == obj) {// 如果两个对象的地址相等,则肯定是同一个对象
return true;
}
// 判断传进来的对象是否是Person的例子
if (!(obj instanceof Person)) {
return false;
}
// 将传进来的对象向下转型
Person per = (Person) obj;
if (per.name.equals(this.name) && per.age == this.age) {// 逐个属性比较,看是否相等
return true;
} else {
return false;
}
}
public String toString() {
return "姓名: " + this.name + "; 年龄:" + this.age;
}
}
复制代码
在编写测试方法时,为了测试程序的合理性,传入一个字符串类型的对象,从结果可以清楚地看出,因为字符串不是Person类型的对象,所以直接返回了false。
感谢博主分享 Java hashCode() 和 equals()的若干问题解答
接收任意引用类型的对象
既然Object类是所有对象的父类,则所有的对象都可以向Object进行转换,在这其中也包括了数组和接口类型,即一切的引用数据类型都可以使用Object进行接收。
使用Object接收接口实例
package com.dzj.object;
public interface A {
public String getInfo();
}
复制代码
package com.dzj.object;
public class B implements A{
@Override
public String getInfo() {
return "Hello World";
}
}
复制代码
public class ObjectDemo {
public static void main(String[] args) {
A a = new B();//为接口实例化
Object obj = a;//对象向上转型
A x = (A) obj;//对象向下转型
System.out.println(x.getInfo());
}
}
//Hello World
复制代码
通过以上代码可以发现,虽然接口不能继承一个类,但是依然是Object类的子类,因为接口本身是引用数据类型,所以可以进行向上转型操作。
同理,也可以使用Object接收一个数组,因为数组本身也属于引用数据类型
使用Object接收数组
package com.dzj.object;
public class ObjectDemo2 {
public static void main(String[] args) {
int temp[] = {1,3,5,7,9};
//使用Object接收数组。
Object obj = temp;//传递数组引用
print(obj);
}
//接收一个对象
public static void print(Object o){
if (o instanceof int[]){//判断对象的类型
int x[]= (int[])o;//向下转型
for(int i=0;i<x.length;i++){//循环输出
System.out.println(x[i] + "\t");
}
}
}
}
//1 3 5 7 9
复制代码
以上程序使用Object接收一个整型数组,因为数组本身属于引用数据类型,所以可以使用Object接收数组内容,在使用print()方法输出时先通过instanceof判断类型是否是一个整型数据,然后进行输出操作。
包装类
包装类的介绍
在java的设计中,提倡一切皆对象。从数据类型的划分中可以知道java中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够成为对象呢?此时为了解决此问题就需要将8种基本类型包装成一个类的形式,那么这也就是包装类的作用。
Character属于Object的直接子类。
Boolean属于Object的直接子类。
Number类是一个抽象类,主要将数字包装类中的内容变为基本数据类型,
public byte byteValue();
public abstract double doubleValue();
public abstract float floatValue();
public abstract int intValue();
public abstract long longValue();
public abstract short shortValue();
复制代码
装箱和拆箱
概念
将一个基本数据类型变为包装类==装箱操作;相反即为拆箱。
装箱和拆箱操作:
package com.dzj.object;
public class WrapperDemo {
public static void main(String[] args) {
int x = 30;//声明一个基本数据类型
Integer i = new Integer(x);//装箱:将基本数据类型变为包装类
int intValue = i.intValue();//将一个包装类变为基本数据类型
//浮点数装箱及拆箱
float f = 30.3f;
Float a = new Float(f);
float floatValue = a.floatValue();
}
}
复制代码
以上手工装箱和拆箱操作,这是jdk1.5之前的做法,在jdk1.5之后提供了自动的装箱及拆箱操作。
Integer b = 30;//自动装箱成Integer
Float c = 30.3f;//自动装箱成Float
int d = b;//自动拆箱为int
float y = c;//自动拆箱为float
复制代码
包装类应用
包装类在实际中用得最多的是字符串变为基本数据类型的操作。
Integer类(字符串转int型)
public static int parseInt(String s) throws NumberFormatException
复制代码
Float类(字符串转float型)
public static float parseFloat(String s) throws NumberFormatException
复制代码
使用以上方法,一定要注意字符串必须由数字组成。
字符串==基本数据类型
String str1 = "30";//由数字组成的字符串
String str2 = "30.3";//由数字组成的字符串
int x1 = Integer.parseInt(str1);//将字符串变为int类型
float f1 = Float.parseFloat(str2);//将字符串变为float类型
复制代码
字符串==boolean类
public static boolean parseBoolean(String s) {
return ((s != null) && s.equalsIgnoreCase("true"));
}
复制代码
Object[]o =(Object[])r;
String diseaseName=String.valueOf(o[1]);
String symptom=String.valueOf(o[2]);
boolean miss= Boolean.parseBoolean(String.valueOf(o[3]));
复制代码
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
复制代码