本篇博客介绍Java面向对象中Object类和包装类的用法。
目录:
? Object类是所有Java类的根父类,即除Object类外所有类默认继承Object类
? 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
public class Person{
...
}
==
public class Person extends Object{
...
}
public void method(Object obj){可以接收任何类作为参数}
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public Object() | 构造 | 构造器 |
2 | public boolean equals(Object obj) | 普通 | 对象比较 |
3 | public int hashCode() | 普通 | 获取Hash码 |
4 | public String toString() | 普通 | 对象打印时使用 |
...
? ‘=’:赋值运算符,给属性显式赋值
? ‘==’:比较运算符
? ? 基本类型比较值:只要两个变量的值相等(基本数据类型不一定相等),即为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是属于java.lang.Object类中的方法,没有重写equals方法时用法相当于使用==比较引用类型,而equals也可以重写为比对象内容的方法如String,Date、File和包装类,但不要误认为equals就是比较值的方法
? 通常情况下,重写equals方法,会比较类中的相应属性是否都相等
? 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);
? 针对八种基本数据类型定义相应的引用类型—包装类(封装类)
? 有了类的特点,就可以调用类中的方法,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);
?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