在我最最难过的时候
给我温暖的眼神
一、Object 类
Class Object是类Object结构的根
每个class都有Object作为超类
所有对象(包括数组)都实现了这个类的方法
1.1 public int hashCode()
返回对象的哈希码值
默认会使用对象的地址值,计算得到哈希值
class stuent {
String name;
int age;
}
student s = new student();
System.out.println(s.hashcode()); // 1163157884
1.2 public final Class getClass()
返回当前对象从属的 class 类
System.out.println(s.getClass()); // class javase.day14.student
二、 class 类
2.1 public String getName()
返回当前类(类,接口,数组类,原始类型或void)变量的类名
Class a = s.getClass();
System.out.println(a.getName()); //javase.day14.student
2.2 public String toString()
默认情况下,返回该对象的地址值,等同于:
this.getClass().getName()+"@"+Integer.toHexString(this.hashCode)
或
System.out.println(this);
一般会进行重写覆盖,用于输出成员变量
// 重写前
System.out.println(s.toString()); // javase.day14.student@4554617c
// 重写后
class stuent {
String name;
int age;
@Override
public String toString(){
return "student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
System.out.println(s.toString()); // student{name='null', age=0}
2.3 public boolean equals(Object obj)
默认情况下,比较两个对象的地址值是否相同
需要时,会进行重写,用于比较两对象的成员变量等
// 重写前
student s2 = new student();
student s3 = new student();
student s4 = s3;
System.out.println(s2.equals(s3)); // false
System.out.println(s3.equals(s4)); // true
// 重写前
class tudent{
Sting name;
int age;
...
@Override
public boolean equals(Object obj) {
//先判断是否指向同一地址
if (this == obj){
return true;
}
//此处Object是父类
//想要访问比较父类中成员,就要向下转型
student s = (student)obj;
return this.name.equals(s.getName()) && this.age == s.getAge();
}
}
student s5 = new student("fgh",12);
student s6 = new student("fgh",12);
System.out.println(s5.equals(s6)); // true
2.3.1 == 和 equals
==:
基本数据类型:比较的是值是否相同
引用数据类型:比较的是地址值是否相同
equals:
因为equals是属于Object类中的方法,只有对象可以去调用,而基本数据类型不属于对象
引用类型:默认情况下比较的是地址值,需要根据情况去重写,而重写的时候不需要我们自己去重写
部分类中将自动生成,如 String 等
2.4 protected void finalize()
throws Throwable
当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。
简单来说,它就是用于垃圾回收的
什么时候回收不确定
2.5 protected Object clone()
创建并返回此对象的副本
返回的是这个实例的一个克隆,被Object类接收
clone会创建一个新的对象出来
Interface Cloneable { }
1、使用clone方法必须实现这个接口,该接口没有任何抽象方法,成为标记接口
2、需要重写 protected Object clone() 方法
3、main 方法出需要 throws CloneNotSupportedException
class stuent1 implement Interface Cloneable{
...
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws CloneNotSupportedException{
student1 s1 = new student("fgh",12);
Object s1Clone = s1.clone();
// 向下转型
student1 s1c = (student1)s1Clone;
System.out.println(s1C.tosTring());
}
clone() 方法相当于在堆内存中重新创建了一个对象,赋值原本对象的内容,并不是简单的地址传递
三、Scanner 类
用于控制键盘录入
使用前需要导包
import java.util.Scanner;
3.1 public int nextInt()
public String next()
public String nextLine()
用于接收不同数据类型
Scanner sc = new Scanner(System.in);
int c = sc.nextInt();
String a = sc.next();
String b = sc.next();
System.out.println(c);
System.out.println(a + "+" + b);
1、next() 只有检测到有字符输入时执行回车才有效,否则回车在控制台只起到换行的作用,不实际录入数据
2、next() 若录入字符后再输入空格再录入一段字符后回车,直接将该字符串解析为以空格字符做间隔的两次录入数据,并且不录入空格,直接在控制台打印两个字符串
Scanner sc = new Scanner(System.in);
int f = sc.nextInt();
String g = sc.nextLine();
String h = sc.nextLine();
System.out.println(f);
System.out.println(g + "+" + h);
1、nextLine() 若输入回车直接在控制台打印空数据,因此没输入一次就需要判断一次类型是否合法
2、nextLine() 能检测并打印空格符
3.2 public boolean hasNextInt()
用于判断接下来输入的数据是否符合数据类型
if(sc.hasNextInt()){
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + "+" + b);
}
这里个 hasNextInt 的作用主要用于防止程序启动时用户误触导致非合法 Int 的输入使得 nextInt 报错
其次 a 的 nextInt 会直接赋值是因为前面的 hasNextInt 已经阻塞获取到了一个 Int
此时缓冲区存在符合 nextInt 需要的 int 所以直接执行了赋值
而执行 b 时缓冲区并不存在符合 nextInt 的 int 值,所以需要用户输入获取
四、总结
public int hashCode() (重点)
返回对象的哈希码值
默认会使用对象的地址值,计算得到哈希值
public String toString()(重点)
默认情况下,返回该对象的地址值
一般会进行重写覆盖,用于输出成员变量
public boolean equals(Object obj)(重点)
默认情况下,比较两个对象的地址值是否相同
需要时,会进行重写,用于比较两对象的成员变量或最终指向的地址等