Object
概述:
Object类是Java中所有类直接或者间接的父类,里面的方法所有的子类都默认继承,所有的对象都可以默认调用从Object类中继承的方法!
在Object中定义的方法在实际的开发中或多或少都会使用到,应该是每一个类都默认携带的功能。
Object类的重点方法:
-
public String toString():可以将调用者对象转化成一个字符串。
public String toString(){ return getClass().getName()+"@"+Integer.toHexString(hashCode()); }
继承自父类toString方法默认只会返回调用者对象的全类名@地址值,而将对象转换为字符串的目的是将对象内容拼接为一个字符串方便查看。
主动重写toString方法,将对象的成员变量拼接为字符串返回,就可以将对象转换为字符串,查看对象的具体内容!
可以基于IDEA的生成菜单生成toString方法。
如果在重写了toString方法之后,在打印的时候可以直接传递对象进行打印。底层的逻辑默认调用对象的toString方法,将方法的返回值打印在控制台。
如果之后打印对象,打印的是全类名@地址值,对象所在的类没有重写toString,如果打印对象出现的是对象的具体内容,对象所在的类重写了toString。
结论:实体类主动重写toString方法的目的就是为了在使用对象的时候可以直接打印对象看到对象的具体内容。
-
public boolean equals(Object o) : 返回调用者与参数是否相同。
在Java中的对比方式学习了==,==对比基本数据类型是没问题的,但是对比引用数据类型只能比较地址值。
public boolean equals(Object obj){ return (this==obj); }
Object类的equals方法提供的目的是为了提供一个对象对比的功能,编写的时候并不明确之后是哪个对象调用此方法与哪个对象进行,只能暂时先写一个==,就会造成对象对比比较的地址值的问题。
如果开发者自己的类想要与同类对象进行内容的对比,那么就需要重写此方法!IDEA可以直接生成!
结论:实体类主动重写equals方法,可以在调用equals方法的时候与同类对象进行内容的对比,而不是地址值的对比!
-
protected Object clone() : 返回一个调用者的克隆对象(原有内容一样 并且是新的对象).
**浅克隆:**基本数据类型复制值,而引用型数据类型复制的是地址值。对于引用型数据类型来说,克隆的值发生改变,原来的数据内容也发生改变。
**深克隆:**对于引用型数据类型来说,深克隆克隆出来了一个新的相同类型的数据,地址值不一样。
Objects
Objects类的概述与特点:
Objects就是一个工具类,工具类(方法都是静态)(构造都是私有)。
Objects提供的就是一些针对于Object类的方法的工具方法。
Objects类的重点方法:
Objects类的注意事项:
使用equals方法等等的方法,对比的对象所在的类依然要重写equals方法。不是说用这个类的方法比较就不需要重写。
建议:之后再进行对比的时候,判空的时候使用Objects的方法,让代码阅读起来更加的优雅!
包装类
**概述:**包装类就是将一个基本数据类型包装为对象的一种类。
包装类存在的意义:
让Java真正变成了面向对象的语言!包装类在可以表示一个数据的基础上还有作为对象的特性(调方法)。
包装类创建对象的方式:
//第一种,已过时不推荐使用
Integer i = new Integer();
//第二种,推荐使用
Integer i1 = Integer.valueOf(20);
包装类的自动装箱与自动拆箱:
**装箱:**把一个基本数据类型包装为引用数据类型(包装类对象)。
Integer ii = Integer.valueOf(20);
Integer i = new Integer(10);
//自动装箱
Integer i = 10;
**拆箱:**将包装类中封装的数据获取出来(基本数据类型的数据) 使用对象调用 基本类型Value()接收返回值。
int ii = i.intValue();
//自动拆箱
System.out.println(i + ii);
//System.out.println(i.intValue() + ii.intValue());
Java就是基于自动装箱与自动拆箱来解决包装类运算的问题!
包装类使用的注意事项:
(1)包装类不同类型是不可以直接赋值的。
Integer i = 10;
Long l = i; //× 尝试装/拆 Long l = Long.valueOf(i);
(2)Double类型自动装箱的时候,不可以赋int值。
double d = 10; //√
Double d = 10; //× Double d = 10.0;
(3)到底什么时候用包装类,什么时候用基本数据类型?
所有的成员变量用包装类。
public class Student {
private Integer age;
}
如果用int作为成员变量,那么默认值是0。 【0是有意义还是没意义】
如果用Integer作为成员变量,那么默认值是null。 【null是没意义的】
正常的运算用基本类型。
int i = 10; //Integer i = 10;
包装类与字符串的转换方式
包装类里面包含了一些方法用于和字符串进行互相的转换。
例:有一个字符串 “10” 基于"10"操作,只能调用字符串的相关方法,即便是进行运算,也只能+操作【拼接】。
1. 字符串转换为包装类型
明确要转换为哪个包装类(Integer),调用该包装类的静态方法valueOf,传递要转换的字符串对象接收返回值.
Integer i = Integer.valueOf(str);
System.out.println(i + 5);
2. 字符串转换为基本类型
明确要转换为哪个基本类型,再找到基本类型对应的包装类(Integer),调用该包装类的静态方法parse基本类型(),传递要转换的字符串对象接收返回值.
int ii = Integer.parseInt(str);
System.out.println(ii + 10);
byte bb = Byte.parseByte(str);
System.out.println(bb + 10);
double dd = Double.parseDouble(str);
System.out.println(dd + 10);
3.包装类型/基本类型转换为字符串
基于String类调用静态方法valueOf(),传递什么对象都能变成字符串.
String str1 = String.valueOf(i);
String str2 = String.valueOf(ii);