1.Object类
Object:是类层次结构的根类.每个类都使用 Object 作为超类(父类)
(1)public int hashCode()返回该对象的哈希码值 . 把它理解成地址值(不是实际意义的地址值)
public static void main(String[] args) {
//创建一个学生对象
Student s1 = new Student() ;
System.out.println(s1.hashCode());//118352462
Student s2 = new Student() ;
System.out.println(s2.hashCode());//1550089733
}
注:创建不同的对象,哈希地址值不同!
(2)public final Class getClass()返回此 Object 的运行时类
返回值是Class,
Class类中有一个方法
public String getName()以 String 的形式返回此Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
public static void main(String[] args) {
//创建一个学生对象
Student s1 = new Student() ;
Class c1 = s1.getClass() ;//Object 的运行时类
System.out.println(c1);//class org.wesots_01.Student :以class形式表示的当前类
String name = c1.getName() ;
System.out.println(name);//以字符串显示当前的类:org.wesots_01.Student :全类名
System.out.println("-------------------------");
//链式编程
String str = s1.getClass().getName() ;
System.out.println(str);
}
(3)public String toString(); 返回该对象的字符串表示
(后面讲)Integer:是int类型的包装类类型
它里面提供了一个方法:public static String toHexString(int i):以十六进制表示对字符串形式
public static void main(String[] args) {
//创建学生类对象
Student s1 = new Student() ;
String str = s1.toString() ;
System.out.println(str);//org.wesots_02.Student@70dea4e
System.out.println("--------------------");
System.out.println(s1.getClass().getName()+'@'+Integer.toHexString(s1.hashCode()));
//org.wesots_02.Student@70dea4e
}
注:1)直接输出对象名称:实际执行了Object中的toString(),输出的全类名@十六进制数据
2)我现在输出对象名称,不想让toString()直接输出的是一个地址值(对象的地址值),怎么办?
就需要重写Object中的toSring(),一般情况:自动生成即可 (alt+shift+s) 建议所有子类都重写此方法。
(4) public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”
==:比较的值相等(地址值) equals:本身属于Object类中的方法,默认比较的是地址值是否相同
public static void main(String[] args) {
//创建两个学生对象
Student s1 = new Student("高圆圆",27);
Student s2 = new Student("高圆圆",27) ;
System.out.println(s1==s2); //比较的是地址值//false
System.out.println("---------------------");
System.out.println(s1.equals(s2)); //false :默认的地址值
/**
* 观察Object中的equals方法
* public boolean equals(Object obj) {
return (this == obj); //在底层实际走了一个==:比较的是地址值
//this:s1
//obj:s2
}
*/
}
注:1)按照正常情况:equals方法底层实际执行的两个对象在==,比较是地址值;假如:学生的年龄和姓名一致,看成同一个人
此时,就需要在自定义的类中,重写Object中的equals()方法,比较是两个对象的成员变量的值是否相同.自动生成即可!(alt+shift+s)
(5)protected Object clone()创建并返回此对象的一个副本
Object类的clone方法执行特定的复制操作。首先,如果此对象的类不能实现接口Cloneable,则会抛出CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable!
public static void main(String[] args) throws CloneNotSupportedException {
//创建学生类对象
Student s1 = new Student("高圆圆",27);
System.out.println(s1.getName()+","+s1.getAge());
//进行复制操作
//1)调用clone方法
Object obj = s1.clone() ;
//2)向下转型
Student s2 = (Student)obj;
System.out.println(s2.getName()+","+s2.getAge());
System.out.println("--------------------------");
//在没有接触过Object的clone方法之前,如何复制对象的
Student s3 = s1 ;
System.out.println(s3.getName()+""+s3.getAge());
}
注:首先要在自定义类中实现Cloneable接口!
2.Scanner类:简单文本扫描器
回想:键盘录入的步骤
1)需要创建键盘录入对象
Scanner sc =new Scanner(System.in);
2)导入包:import java.util.Scanenr; ( ctrl+shift+o )
3)接收数据
XXX 变量名= sc.nextXXX();
(1)构造方法:
public Scanner(InputStream source): 以输入流的形式录入数据的
(2)Scanner类的一些常见的方法:
XXX 变量名 = 键盘录入对象.nextXXX();
如:
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入数据
System.out.println("请输入一个数据:");
int num = sc.nextInt() ;
System.out.println("num:"+num);
}
问题:假如用户不知道要输入一个int类型的数据,他输入一个hello,会出现一个异常:
java.util.InputMismatchException:录入的数据和接收的数据类型不匹配异常, 如何解决?
在Scanner类中它提供一个判断功能:
public boolean hasNextXXX():当前扫描器判断是否有下一个可以录入的XXX类型数据
所以,在录入之前用if判断一下,上述代码更改后如下:
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//录入数据
System.out.println("请输入一个数据:");
if(sc.hasNextInt()) {
int num = sc.nextInt() ;
System.out.println("num:"+num);
}else {
System.out.println("您输入的数据类型不匹配...");
}
}
(3) 1)键盘录入两个int类型的数据,分别输出,没有问题
2)键盘录入两个String类型的数据,分别输出:没有问题
3)先录入一个String类型的数据,在录入int类型的数据,没有问题
4)先录入一个int类型的数据,在录入String类型的数据,有问题,
第二个数据是字符串类型,又由于录入下一个数据要"空格"本身是一个字符串b是空格,b的值没有录入!
如何解决?
重写创建键盘录入对象!