day14 Java 常用类 Object类 Scanner类


在我最最难过的时候
给我温暖的眼神




一、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)(重点)

默认情况下,比较两个对象的地址值是否相同
需要时,会进行重写,用于比较两对象的成员变量或最终指向的地址等

猜你喜欢

转载自blog.csdn.net/qq_41464008/article/details/120657479