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)需要创建键盘录入对象
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();
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类型的数据, 有问题,
2)键盘录入两个String类型的数据,分别输出:没有问题
3)先录入一个String类型的数据,在录入int类型的数据,没有问题
4)先录入一个int类型的数据,在录入String类型的数据, 有问题,
第二个数据是字符串类型,又由于录入下一个数据要"空格"本身是一个字符串b是空格,b的值没有录入!
如何解决?
如何解决?
重写创建键盘录入对象!