Java Object类和包装类的示例分析
这篇文章给大家分享的是有关JavaObject类和包装类的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
查看源代码方法在IDEA中双击 shift 键,可以搜索相关类名,查看源代码
点击Structure ,左侧用橙色床框住的部分是类的结构,结构包含所有的方法、属性、内部类的声明。结构中带绿色小锁的图标表示 public 权限,钥匙图标就是继承权限(protected),红色锁的图标就是 private 权限。右边是源码。
Object类定义及应用Object类是所有类的默认父类,不需要使用 extends 显示继承,因此 Object 类的所有方法(private 除外),所有类的对象都能使用。因此所有对象都可以通过Object来接收
示例:
Objectobj1="test";Objectobj2=newStudent("小陈",18);Objectobj3=123;
在Java中对Object类做了扩充,使它不仅是所有类的父类,只要是引用数据类型,都可以向上转型为Object类,包括数组和接口也就是说, Object 类是引用数据类型的最高参数统一化
接下来我们来了解Object类中两个常用的方法
1. toString()将任意对象转为字符串输出,打印对象内容。System.out.println()接收任意对象并输出,就是默认调用的 toString方法
运行下面代码:
classStudent{privateStringname;privateintage;publicStudent(Stringname,intage){this.name=name;this.age=age;}}publicclassObjectTest{publicstaticvoidmain(String[]args){Students1=newStudent("张三",17);System.out.println(s1);}}
运行结果:
可以看到不是我们预期的结果,为什么呢?我们来看看 toString() 的源码
此时想要输出具体内容,就需要覆写 toString()方法:
publicStringtoString(){return"Student{"+"name='"+name+'\''+",age="+age+'}';}
2. equals( )//输出:Student{name='张三', age=17}
比较两个对象是否相等,通常比较属性,承接上例,我们创建一个新对象和s1比较:
Students1=newStudent("张三",17);Students2=newStudent("张三",17);System.out.println(s1.equals(s2));
//输出:false
s1和s2的名字和年龄都是相同的,为什么输出结果为false呢?让我们来看看equals方法的源码
有 new 就有新对象,所以s1和s2显然不是同一地址。此时Student类默认使用的是Object类提供的equals方法,对于Object类而言,它不知道子类有哪些属性,所以比较的是对象的地址。
如果我们想要比较属性值就要覆写equals方法:
publicbooleanequals(Objectobj){//当前对象和传入的obj比较//1.判断obj是否为空if(obj==null){returnfalse;}//2.判断obj是否就是自己,就是地址相同if(obj==this){returntrue;}//3.判断obj是否是该类的对象,比如传入一个字符串,它不是Student类型,无法比if(!(objinstanceofObject)){returnfalse;}//4.此时obj一定是Student类的对象,而且两个对象不是同一个地址//向下转型还原为Student,比较对象属性Studentstu=(Student)obj;returnthis.name.equals(stu.name)&&this.age==stu.age;}}
equals方法的覆写非常重要!!!一定要掌握,代码中应用到的 instanceof 和 向下转型的知识链接如下,感兴趣的可以去看看哦
详解Java面向对象编程之多态
包装类定义及应用包装类就是将8种数据类型封装为类:
对象包装类(Object雷的直接子类)
Boolean、Character数值型包装类(Number类的直接子类)
Byte、Short、Integer、Long、Float、Double以Integer 类为例应用:
publicstaticvoidmain(String[]args){//将int->类Integerdata=newInteger(10);//value就是将包装类的内容取出来inta=data.intValue();System.out.println(a);}
装箱和拆箱//输出:10
装箱:将基本类型变为包装类对象
拆箱:将包装类对象中的数值还原为基本类型
在上述示例中:
在我们实际操作时,反复的拆装箱是很麻烦的,在Java中为我们提供了自动装箱、拆箱
代码示例:
publicstaticvoidmain(String[]args){Integera=20;intb=a+2;System.out.println(b);}
//输出:22
可以看到,a是Integer类的对象,但它可以直接和整型数据做运算,实际上, Integer a = 20;就是自动装箱,int b = a+2;就是自动拆箱过程。所以在用法上,包装类和基本类型没有区别。但是一定要记住,基本数据类型的默认值是0,包装类的默认值为null
那么我们什么时候使用包装类,什么时候使用基本数据类型呢?阿里编码规约做如下规定:
在类中定义成员变量,必须使用包装类声明
在方法中,大量进行算术运算使用基本类型
自己实现包装类publicclassIntDemo{//保存具体的整型值privateintdata;publicIntDemo(intdata){this.data=data;}publicintintValue(){returnthis.data;}publicstaticvoidmain(String[]args){//将int->类IntDemodemo=newIntDemo(10);intdata=demo.intValue();System.out.println(data+1);}}
通过包装类让Object类接收基本数据类型//输出结果:11
我们已经知道Object类可以接收所有引用类型,可遇到基本数据类型就行不通了,包装类就完美解决了这一问题。
使用Object类接收,将上例的主方法做如下修改:
publicstaticvoidmain(String[]args){//将int->类IntDemodemo=newIntDemo(10);Objectobj=demo;IntDemodemo1=(IntDemo)obj;intdata=demo1.intValue();System.out.println(data+1);}
包装类的对象比较//输出:11
统一使用 equals 方法
Integera=10;Integerb=10;System.out.println(a.equals(b));
包装类和String的相互转换//输出:true
① 包装类 --> String:使用String.valueOf()
② String --> 包装类 :使用包装类的parse***()
代码实现:
publicstaticvoidmain(String[]args){//Integer->StringIntegerx=newInteger(200);Stringy=String.valueOf(x);System.out.println(y);//String->IntegerStringstr="123";Integera=Integer.parseInt(str);System.out.println(a);}
//输出结果:
200
123
注意String转换时若字符串不是纯数字组成,运行时就是出现类型转换异常。
感谢各位的阅读!关于“JavaObject类和包装类的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。