首页 > 编程语言 > 详细

Java面向 对象--Object类和包装类的使用

时间:2020-03-18 16:02:33      阅读:72      评论:0      收藏:0      [点我收藏+]

本篇博客介绍Java面向对象中Object类和包装类的用法。


目录:

? Object类

? 包装类(Wrapper)


? Object类

? Object类概述

? Object类是所有Java类的根父类,即除Object类外所有类默认继承Object类

? 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类

public class Person{
    ...
}
==
public class Person extends Object{
    ...
}
public void method(Object obj){可以接收任何类作为参数}

? Object类部分常用结构(方法)

No. 方法名称 类型 描述
1 public Object() 构造 构造器
2 public boolean equals(Object obj) 普通 对象比较
3 public int hashCode() 普通 获取Hash码
4 public String toString() 普通 对象打印时使用

...

? =、==与equals方法

? ‘=’:赋值运算符,给属性显式赋值

? ‘==’:比较运算符

? ? 基本类型比较值:只要两个变量的值相等(基本数据类型不一定相等),即为true

? ? 引用类型比较引用(是否指向同一个对象(地址值相同)):只有指向同一个对象时,才返回true

? ? 用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错

? equals() :所有类都继承了Object,也就获得了equals()方法(可以重写)

? ? 只能比较引用类型,未重写时其作用与“==”相同, 比较是否指向同一个对象(地址在是否相同)

? ? Object中equals()方法的源码

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

? ?? 格式:obj1.equals(obj2)

特例:

? 当用equals()方法进行比较时,对类File 、String、Date及包装类(Wrapper Class)来说 ,是比较类型及内容而不考虑引用的是否是同一个对象(在这些类中重写了equals()方法)

重写equals()方法的原则:

? 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”

? 自反性:x.equals(x)必须返回是“true”

? 传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”

? 任何情况下,x.equals(null),永远返回是“false”

? x.equals(和x不同类型的对象)永远返回是“false”

? 实际开发中除特殊需求外手动重写equals方法,一般都是快捷生成(类中右键-->Soure-->Generate hashCode() and equals()...选中属性后就可自动生重写hashCode()和equals()方法,类似快捷生成setter和getter方法)

? ==与equals的区别

? == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

? equals是属于java.lang.Object类中的方法,没有重写equals方法时用法相当于使用==比较引用类型,而equals也可以重写为比对象内容的方法如String,Date、File和包装类,但不要误认为equals就是比较值的方法

? 通常情况下,重写equals方法,会比较类中的相应属性是否都相等

? toString()方法

? toString()方法在Object类中定义,返回类名和它的引用地址

? 在进行String与其它类型数据的连接操作时,自动调用toString()方法

Date time = new Date();
System.out.println("time:" + time);
==
System.out.println("time:" + time.toString());

? 可以根据需要在用户自定义类型中重写toString()方法,如String类中重写了toStirng()方法,返回字符串的值

? 基本类型数据转换为String类型时,调用了对应包装类的toString()方法

? 可以快捷重写toString()方法,Soure-->Generate toString()...,同equals自动重写类似

int a = 10;
System.out.println("a=" + a);

? 包装类(Wrapper)

? 包装类的概述

? 针对八种基本数据类型定义相应的引用类型—包装类(封装类)

? 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象

基本数据类型 方法名称 父类
byte Byte Number
short Short Number
int Integer Number
long Long Number
float Float Number
double Double Number
boolean Boolean
char Character

? 基本数据类型包装成包装类的实例--装箱

? 通过包装类的构造器实现

int i = 10;
Integer num = new Integer(i);

? 还可以通过字符串参数构造包装类对象

Float fNum = new Float("3.14");
Long lNum = new Long("hi");   //NumberFormatException异常 

? 获得包装类对象中包装的基本类型变量--拆箱

? 调用包装类的.xxxValue()方法

Boolean bObj = new Boolean(false);
boolean b = bObj = bObj.booleanValue();

? JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配。

//自动装箱
Integer integer = 1314;
System.out.println(integer.toString());
//自动拆箱
Integer num = new Integer(520);
int i = num;   //520
Double dNum = new Double("5.20");
double d = dNum; //5.20

? 基本数据类型与字符串的转换

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

? 通过包装类的构造器实现

int i = new Integer("520");

? 通过包装类的parseXxx(String s)静态方法

Double d = Double.parseDouble("13.14");
  • 基本数据类型转换为字符串

? 调用字符串重载的valueOf()方法

String dStr = String.valueOf(5.20);

? 通过‘+""’拼接(基本数据类型+字符串结果是字符串)

String intStr = 520 + "";
  • 包装类转换为字符串

? 包装类对象的toString()方法

Integer num = new Integer(1314);
String iStr = num.toString();

? 包装类toString(与包装类对应的形参)的方法

String iStr = Integer.toString(1314);  //包装类是Integer,参数必须是int

字符串转换为包装类转

? 通过包装类构造器(字符串必须是数字或Boolean包装类时可以为true/false)

String str = "1314";
Integer i = new Integer(str);

? 总结:基本数据类型、包装类与String间的转换关系

技术分享图片

? 包装类面试题

?1.写出输出结果,判断结果是否相同

Object obj1 = true ? new Integer(1) : new Double(2.0);
System.out.println(obj1);

Object obj2;
if(true)
    o2 = new Integer(1);
else
    o2 = new Double(2.0);

?:第一个的输出结果为1.0,第二个的输出结果为1

?:三目运算符会将数据自动转型为一样的,int自动转型为double了

?2.写出输出结果

public void method1() {
    Integer i = new Integer(1);
    Integer j = new Integer(1);
    System.out.println(i == j);
    Integer m = 1;
    Integer n = 1;
    System.out.println(m == n);
    Integer x = 128;
    Integer y = 128;
    System.out.println(x == y);
}

?:第一个的输出结果为false,第二个输出结果为true,第三个输出结果为false

?:第一个为false的原因是new造的对象地址不同,Integer内部定义了IntegerCache缓存结构,在这个方法中定义了Integer[]数组,保存了-127到127范围的整数,如果使用自动装箱的方式,给Integer赋值的范围在-127~127,就会直接使用数组中的元素,就不会新new包装类对象,因此指向的都是Integer[]数组中元素的地址,所以第二个输出为true,第三个输出为false

本博客与CSDN博客???君?纤???同步发布

Java面向 对象--Object类和包装类的使用

原文:https://www.cnblogs.com/asio/p/12505872.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!