一.Object类/Scanner类
1.所有类都直接或间接继承Object类
如:a类继承b类,b类未显示集继承个类,那么b就是默认继承Object类. a类就是间接继承了Object类。
object 是所有类的祖先类,从jdk1.0开始就存在。
2.hashCode()方法:
返回该对象的哈希码值。哈希码值是int类型的对象逻辑地址值。
public class Test {
public static void main(String[] args) {
User user = new User();
User user2 = new User();
System.out.println(user.hashCode()+"---"+user2.hashCode());
}
}
//控制台输出
356573597---1735600054
Process finished with exit code 0
3.getClass()方法:
返回此 Object 的运行时类对象(Class类型 ),Class类型对应的对象是字节码文件(.class文件)对象。因为在执行java程序的时候会把字节码文件加载进内存,jvm就认为这个字节码文件就是个字节码文件对象。
//返回此Object 的运行时类对象
Class clazz =user.getClass();
Class clazz2 = user2.getClass();
boolean a = clazz==clazz2;
System.out.println(a);
//Class类的一个方法getName()
String name =clazz.getName();
System.out.println(name);
//控制台输出
true
com.cn.entity.User
4.toString()方法:
返回对象的文本表现形式,如果没有重写该方法,打印出的结果由三部分组成:
1,该对象的完整名称。
2,@字符。
3,十六进制的逻辑内存地址。
public static void main(String[] args) {
User user = new User();
String s = user.toString();
User user2 = new User();
String s2 = user2.toString();
System.out.println(s);
System.out.println(s2);
}
//控制台输出
com.cn.entity.User@1540e19d
com.cn.entity.User@677327b6
结合上面可得出结论 toString()发法就是user2.getClass().getName() 加上user2.hashCode(); 我们看看源码:
public String toString() {
//Integer.toHexString()方法是将十进制的数字转成十六进制的文本
return getClass().getName() + "@" +
Integer.toHexString(hashCode());
}
我们再运行下代码看看效果:
public static void main(String[] args) {
User user = new User();
String s = user.toString();
User user2 = new User();
String s2 = user2.toString();
System.out.println("1."+s);
System.out.println("2."+s2);
System.out.println("3."+user2.getClass().getName()+"@"
+Integer.toHexString(user2.hashCode()));
}
//控制台输出
1.com.cn.entity.User@1540e19d
2.com.cn.entity.User@677327b6
3.com.cn.entity.User@677327b6
一般情况下我们都会使用开发工具快速重写toString()方法,我们来看看效果:
//实体类中重写toString方法
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//测试下效果
public static void main(String[] args) {
User user = new User("李四",18);
String s = user.toString();
User user2 = new User("张三",17);
String s2 = user2.toString();
System.out.println("1."+s);
System.out.println("2."+s2);
System.out.println("3."+user2.getClass().getName()+"@"
+Integer.toHexString(user2.hashCode()));
}
//控制台输出
1.User{name='李四', age=18}
2.User{name='张三', age=17}
3.com.cn.entity.User@1540e19d
5.equals()方法:
判断左右两边对象是否相等,返回true或false。这个方法可以说是面试官最喜欢问的问题之一,提到equals()就肯定绕不过和它有相似功能的 “==” ,我们也借着比较他们有什么不同来学习equals,来看代码:
public static void main(String[] args) {
User user1 = new User("李四",18);
User user2 = new User("李四",18);
User user3= new User("王五",18);
User user4 =user1;
//同样内容但不同对象 结果为---false
boolean b = user1 == user2;
System.out.println("1---"+b);
//同样内容同一个引用对象 结果为---true
//***************得出结论:==比较两个对象的内存地址
b= user1 == user4;
System.out.println("2---"+b);
//同样内容但不同对象 结果为---false
b=user1.equals(user2);
System.out.println("3---"+b);
//同样内容同一个引用对象 结果为---true
//***************得出结论:equals比较两个对象的内存地址
b=user1.equals(user4);
System.out.println("4---"+b);
}
//控制台输出内容
1---false
2---true
3---false
4---true
从代码可以看出来,"=="和equals都是通过比较内存地址来判断的,而不在乎内容是否一致。既然都一样问什么面试官总是喜欢问这个? 我眉头一皱,觉得此事并不简单。
原来在我们下面要讲的String类里面,将equals()方法进行了重写,也就是说现在有三个东西来比较 : "=="运算符,Object类的equals()方法,String类的equals()方法。既然 “==” 和Object.equals()一模一样,那么面试官问的就是 :== 运算符和Sting.equals()有什么区别,我们来把这三个放一起看下:
public static void main(String[] args) {
User user1 = new User("李四",18);
User user2 = new User("李四",18);
User user3= new User("王五",18);
User user4 =user1;
//同样内容但不同对象 结果为---false
boolean b = user1 == user2;
System.out.println("1---"+b);
//同样内容同一个引用对象 结果为---true 得出结论:==比较两个对象的内存地址
b= user1 == user4;
System.out.println("2---"+b);
//同样内容但不同对象 结果为---false
b=user1.equals(user2);
System.out.println("3---"+b);
//同样内容同一个引用对象 结果为---true 得出结论:equals比较两个对象的内存地址
b=user1.equals(user4);
System.out.println("4---"+b);
String x ="张三";
String y ="张三";
String z =x;
//同样内容但不同对象 结果为---true
b = x.equals(y);
System.out.println("5---"+b);
//同样内容,引用同样对象 结果为---true
b = x.equals(z);
System.out.println("6---"+b);
}
//控制台输出内容
1---false
2---true
3---false
4---true
5---true
6---true
到这里,事情水落石出,String.equals()只关注你内容是否相同。和**==**运算符,Object.equals()都不一样。
6.finalize()方法:
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
7.clone()方法:
复制一个新的对象,我们通过比较==User user2 =user1;==和clone()有何差异来学习,想要使用对象的clone()方法,需要有三个准备工作:
1,实体类中实现Cloneable(标记接口)。
public class User extends Object implements Cloneable
2,重写clone()方法。
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
3,使用时抛出CloneNotSupportedException异常。
public static void main(String[] args)
throws CloneNotSupportedException
准备工作完成后我们写代码比较一下:
public static void main(String[] args) throws CloneNotSupportedException{
User user1 = new User("李四",18);
User user2=user1;
//克隆user1
Object clone = user1.clone();
System.out.println("user1---"+user1);
System.out.println("user2---"+user2);
System.out.println("clone---"+clone);
System.out.println("------改变user1后------");
//改变user1的内容
user1.setName("王五");
user1.setAge(14);
System.out.println("user1---"+user1);
System.out.println("user2---"+user2);
System.out.println("clone---"+clone);
}
控制台输出内容:
user1---User{name='李四', age=18}
user2---User{name='李四', age=18}
clone---User{name='李四', age=18}
------改变user1后------
user1---User{name='王五', age=14}
user2---User{name='王五', age=14}
clone---User{name='李四', age=18}
根据输出内容,我们可以得出这样的结论:
1.User user2 =user1;使用这样复制的对象,新对象会随着引用的对象的值改变而改变。
2.使用clone()方法复制的对象是一个全新的对象,与被复制对象并无关系,值不会随着被复制对象改变而改变。