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

本篇博客介绍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博客༺ཌ༈君☠纤༈ད༻同步发布

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