API中的常用类(一)

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的值没有录入!
   如何解决?
         重写创建键盘录入对象!

猜你喜欢

转载自blog.csdn.net/xing_ran_ran/article/details/80086749