首页 > 其他分享 >浅谈Object类和包装类

浅谈Object类和包装类

时间:2022-11-11 19:46:13浏览次数:40  
标签:String 包装 Object Person int toString public 浅谈

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方法实现的是对对象的引用的比较,即比较的是对象的地址,地址相同对象一定相同,但有些情况下地址不同对象也有可能相同。在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;//自动装箱
		 int c=b;//自动拆箱
		 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

标签:String,包装,Object,Person,int,toString,public,浅谈
From: https://www.cnblogs.com/swtaa/p/16879414.html

相关文章

  • Proxy 与 Object.defineProperty对比?
    1. Proxy可以直接监听对象而非属性;但是,object.defineProperty只能劫持对象的属性,从而需要对每个对象,每个属性进行遍历,如果,属性值是对象,还需要深度遍历。Proxy 可以劫......
  • JS基础之基本数据类型和包装数据类型
     leta=NewString();console.log(a);  //String{''}这个时候a就是包装类型==============================leta='';console.log(a);  //''这个时候就是基......
  • C# 浅谈 接口(Interface)的作用
    继承"基类"跟继承"接口"都能实现某些相同的功能,但有些接口能够完成的功能是只用基类无法实现的1.接口用于描述一组类的公共方法/公共属性.它不实现任何的方法或属性,只是......
  • python报错 'int' object has no attribute 'randint'
    先看我的代码importrandom##随机生成[1,10)步长为2random=random.randrange(1,10,2)print(random)r=random.randint(0,10)print(r)print(random.randint(......
  • 学习笔记-Objection环境,自动化分析和插件
    Frida简介objection与frida版本匹配安装objection连接非标准端口objection内存漫游,hook,traceobjection插件体系:Wallbreakerobjection+DEXDump脱壳0x01objec......
  • 工具篇 | 浅谈测试那些恩怨情仇。。。
    文章目录​​前言​​​​那些测试工具​​​​一、人肉测试​​​​二、Monkey-压力测试​​​​三、PerfDog性能狗​​​​四、WeTest平台自动化兼容测试​​​​1.......
  • 浅谈PHP设计模式的模板方法模式
    简介:模板方法模式,是行为型的设计模式。定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。通......
  • 浅谈PHP设计模式的原型模式
    简介:原型模式,属于创建型模式的一种。主要针对对象进行克隆,把被克隆的对象称之为原型,原型模式称之为克隆模式也许更为贴切。用原型实例指定创建对象的种类,并且通过拷贝这......
  • 浅谈网站改版从那几方面着手之北京博奥智源
    网站改版首页:结合国办相关文件要求,从各个栏目挑选重点内容展示在首页上,并优化各个板块的排版。对首页各个模块的摆放位置和布局重新进行规划,突出展示重点内容,同时......
  • FastAPI报错:AttributeError 'Depends' object has no attribute 'query'
    FastAPI报错:AttributeError:'Depends'objecthasnoattribute'query'简单来说,这个问题是由于在不属于路径操作的函数下,使用db:Session=Depends(get_db)导致的。例如......