浅谈Object类和包装类

Object类简介
Object类接收任意类型的对象
toString方法
equals方法
包装类简介
包装类的应用

Object类简介

  • Object类是java的一个内置类,属于java.lang包, 此包下的所有类在使用时无需手动导入,程序在编译期间将自动导入
  • Object类是所有类的父类,一个类如果没有明确继承自某个类将自动继承自Object类
    以下2种类的定义效果相同
class Person{}
class Person extends Object{}

既然Object类是所有类的父类,那么说所有的类都可以向Object类发生向上转型,即可以右Object类接收任意类型的对象,这其中也包括数组(数组是引用数据类型)

  • Object接收任意对象
//验证object接收任意类型的对象
class Person{
	public String name;
	public int age;
	public Person(){};//无参构造
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getInfo(){
		return"姓名:"+this.name+"年龄:"+this.age;
	}
	
}
public class ObjectTest{
	public static void main(String[]args){
		Object obj=new Person("李四",28);//向上转型
		if(obj instanceof Person){
			
		 Person pr=(Person)obj;//向下转型
		System.out.println(pr.getInfo());
		}
			
			
	}
}
output:
姓名:李四年龄:28
  • Object接收数组
public class Animal  {
    private int length;

    public static void main(String[] args) {
        int a[]={3,4,5,6,7};
        Object obj=a;//向上转型
        if(obj instanceof int []){
            int b[]=(int [])obj;//向下转型
            for(int w:a)
                System.out.print(w+",");
        }
    }
}
output:
3,4,5,6,7,

在Object类中定义了很多方法,所有类自动继承自object类,也就是说所有的类天生就具有object类中定义的方法,其中最常用的为toString方法和equals方法

toString方法
toString方法作用为打印对象的信息

**该方法源码**
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

getClass().getName()是返回对象的全类名(包含包名),Integer.toHexString(hashCode()) 是以16进制无符号整数形式返回此哈希码的字符串表示
注意:打印某个对象时,默认是调用 toString 方法,比如 System.out.println(person),等价于 System.out.println(person.toString())

该方法用于返回对象的信息,但object类中默认的toString返回的对象信息不易理解或者不够直观,所有在实际使用时,一般覆写该方法,以达到返回对象的信息完整直观

//覆写object类的toString方法
class Person{
	public String name;
	public int age;
	public String sex;
	public Person(String name,int age,String sex){
		this.name=name;
		this.age=age;
		this.sex=sex;
	}
	//覆写Object类的toString方法
	public String toString(){
		return super.toString()+" 姓名 "+this.name+" 年龄:"+this.age+" 性别:"+this.sex;
	}
	
}

public class ToStringTest{
	public static void main(String[]args){
		Person pr=new Person("张三",23,"男");
		System.out.println(pr);
	}
}

output:
Person@15db9742 姓名 张三 年龄:23 性别:男

这样让对象的信息更加完整直观

  • 该方法和字符串打印的联系
    在我们的实际使用中:
    String str="hello";
    Sysetem.out.println(str);
    打印str对象的时候将自动调用toString,但打印出来的是对象本身,而不是一个地址信息,这里可以猜测到在String类中也是将toString方法覆写了

equals方法
object类中equals方法的实现

public boolean equals(Object obj)
{
    return (this == obj);
}

在object类中的equals方法实现的是对对象的引用的比较,即比较的是对象的地址,地址相同对象一定相同,但有些情况下地址不同对象也有可能相同。在String类中的equals方法实现的是对象的比较,可以知道其肯定也是覆写了object类的equals方法。而我们要想运用好equals方法对对象的精确比较,则需要对equals方法进行覆写

//对object类中的equals方法进行覆写实现对象的比较
class Person{
	public String name;
	public int age;
	public String sex;
	public Person(String name,int age,String sex){
		this.name=name;
		this.age=age;
		this.sex=sex;
	}
	//覆写equals
	public boolean equals(Object obj){
		if(this==obj)//传入自身
			return true;
		if(!(obj instanceof Person) )//传入的对象不为Person类的实例
			return false;
		Person pr=(Person)obj;//进行具体属性的比较,需向下转型
		if(pr.name.equals(this.name)&&pr.age==this.age&&pr.sex.equals(this.sex))
			return true;
		else return false;//有的属性不等则为false
	}
}
public class EqualsTest{
	public static void main(String[]args){
		Person pr1=new Person("张三",23,"男");
		Person pr2=new Person("张三",23,"男");
		if(pr1.equals(pr2))
			System.out.println("这两个人是同一个人!");
		else System.out.println("这两个人不是同一个人!");
	}
}

output:
这两个人是同一个人!

包装类
在java中提倡万物皆对象,但这就有矛盾了,java的基本数据类型不是对象,为了解决这一点,提出了包装类。
所谓包装类就是将基本数据类型包装成一个类,让其具备类的特性


只有int 和char和之前的写法不一样,其他都一样

Character和Boolean为Object的直接子类,另外6中类为Number类的直接子类

将一个基本数据类型转化为包装类,称为装箱操作,而将一个包装类转化为基本数据类型称拆箱操作

  • 包装类基础--开箱 拆箱操作
 
 public class NumberTest{
	 public static void main(String[]args){
		 int a=4;
		 Integer b=new Integer(a);//装箱 用的Integer的构造方法
		 int c=b.intValue();//拆箱 用的Integer覆写自其父类Number的方法
		 
		 float m=4.3f;
		 Float n=new Float(m);//装箱
		 float w=n.floatValue();//拆箱
	 }
 }

为了简化上述操作 在jdk1.5提供了自动装箱和拆箱

 
 public class NumberTest{
	 public static void main(String[]args){
		 int a=4;
		 Integer b=a;//自动装箱 自动调用Integer类的valueOf()方法
		 int c=b;//自动拆箱 用的Integer覆写自其父类Number的intValue()方法
		 Float m=3.5f;//自动装箱
		 float n=m;//自动拆箱
	 }
 }

包装类的应用以及基本数据类型和字符串的相互转化
包装类的常用方法*

包装类主要是两种方法,一种是本类型和其它类型之间进行转换,另一种是字符串和本类型以及基本类型之间的转换

如上图中的方法前五种是本类型和其他类型之间的转换(在装箱和开箱时已经演示),后三种是字符串和本类型以及基本类型之间的转换

  • 基本数据类型转化为字符串

    函数头举例Integer类:public static String toString(int i) 返回一个指定整形的String 对象

String类的valueOf()返回一个基本数据类型的字符串表示
public static String valueOf(char c)
返回 char 参数的字符串表示形式

举例

 //基本数据类型转化为字符串的三种方法
 
 public class NumberTest{
	 public static void main(String[]args){
		 double a=3.4;
		 String str1=Double.toString(a);//Double类的toString()方法
		 String str2=String.valueOf(a);//String类的valueOf()方法
		 String str3=a+"";//基本数据类型+空字符串
		 System.out.println(str1);
		 System.out.println(str2);
		 System.out.println(str3);
		 
	 }
 }
 output:
 3.4
3.4
3.4
  • 字符串转化成基本数据类型

    valueOf方法头举例(Integer类) public static Integer valueOf(String str) 返回指定的Sring值的对象
    parse*方法头举例(Integer类) public static int parseInteger(String str) 将字符串参数作为有符号的十进制整数进行解析。
    举例说明
  • 数字转化异常
 
 public class NumberTest{
	 public static void main(String[]args){
		String str="hello world";
		int a=Integer.valueOf(str);//包装类的valueOf()方法,注意:该部进行了自动拆箱
		int b=Integer.parseInt(str);
	 }
 }
 output:
 NumberFormatException.java:65) 数字转化异常

对于字符串里面的内容不是最后转化的基本数据类型的数值,将会出现数字转化异常 NumberForamtExecption

正常情况下

 //基本数据类型转化为字符串的三种方法
 
 public class NumberTest{
	 public static void main(String[]args){
		String str="234323222";
		int a=Integer.valueOf(str);//包装类的valueOf()方法,注意:该部进行了自动拆箱
		int b=Integer.parseInt(str);//包装类的parse基本数据类型函数
		System.out.println(a);
		System.out.println(a);
	 }
 }
 output:
234323222
234323222
posted @ 2022-11-11 19:34  一往而深,  阅读(43)  评论(0编辑  收藏  举报