一.Object类
类object是类层次结构的根类。每个类都使用Object作为超类(父类)。所有对象(包括数组)都实现这个类的方法。
1.public int hashCode()
返回该对象的哈希值,hashCode()--->通过哈希算法(哈希表:hashtable)--->地址值(不是实际意义上的地址值!)
2.public final Class getClass()
返回Object运行时的类(涉及Java反射机制,后续补充!)
3.Class类中的方法:public String getName()
以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称
package day_10_10_28.object01;
public class ObjectDemo {
public static void main(String[] args) {
//创建学生对象
Student s1 = new Student();
System.out.println(s1); //day_10_10_28.object01.Student@15db9742
/**
*public int hashCode()返回该对象的哈希码值
**/
System.out.println(s1.hashCode()); //1097112149返回的是该对象的哈希值,每次执行值不同
System.out.println("------------");
System.out.println("hello".hashCode()); //99162322哈希值不变,每次执行结果相同
System.out.println("------------");
/**
*public final Class getClass()返回此 Object 的运行时类
**/
Student s2 = new Student();
Class c1 = s2.getClass();
System.out.println("c1 = "+c1); //c1 = class day_10_10_28.object01.Student
System.out.println("------------");
/**
*public String getName():获取当前正在运行的这类的全路径名称!
**/
String name = c1.getName();
System.out.println("name = "+name); //name = day_10_10_28.object01.Student,全路径名称
}
}
4.public String toString():
返回该对象的字符串表示(建议所有子类都重写此方法),返回值为:getClass().getName() + '@' + Integer.toHexString(hashCode())
5.toHexString(int i)
Integer类中有一个方法:public static String toHexString(int i):将一个int类型的数据转换成一个十六进制的字符串表现形式
package day_10_10_28.object02;
/**
* 如果直接输出对象名称,想要显示当前对象的成员变量的值,那么必须重写Object类中的toString()方法
*
* */
public class ObjectDemo {
public static void main(String[] args) {
//创建一个学生对象
Student s1 = new Student("韩庚",28);
//直接输出对象名称
System.out.println("s1:"+s1); //s1:day_10_10_28.object02.Student@15db9742
/**
* 通过查看toString()源码:
* public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
*/
System.out.println("s1:"+s1.getClass().getName()+"@"+Integer.toHexString(s1.hashCode()));
System.out.println("s1:"+s1.toString());
//想要输出对象的成员变量的值,必须重写toString方法,可以自己重写,也可以自动生成
System.out.println("s1:"+s1);
Student s2 = new Student("韩庚",28);
System.out.println(s1==s2); //false,比较的是两个地址值
}
}
package day_10_10_28.object02;
public class Student extends Object {
//成员变量
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
/*//自己重写toString()
public String toString(){
return name+"..."+age;
}*/
//自动生成
}
6.equals()
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。由于object类中的equals()方法底层通过“==”来实现,重写equals()方法,比价两个对象的值(对象的内容)
package day_10_10_28.object03; public class ObjectDemo { public static void main(String[] args) { //创建学生对象 Student s1 = new Student("韩庚",28); Student s2 = new Student("韩庚",28); System.out.println(s1==s2); //false,"=="默认比较的是两个地址值 System.out.println("---------"); Student s3 = s1; System.out.println(s1==s3); //true,两个地址值相等 System.out.println("---------"); /** * equals()方法的源码 * public boolean equals(Object obj) { return (this == obj); } 由于Object类中的equals()方法底层是通过"=="来实现的,所以默认比较的是地址值,如果想比较内容是否相同,需要重写equals()方法 * */ System.out.println(s1.equals(s2)); //false,equals()重写后比较的是两个对象的值是否相等 } } package day_10_10_28.object03; public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //toString() @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } //重写equals方法,比较的是两个值是否相等 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
面试题:"=="和equal()方法的区别
==:比较的是两个对象的地址值是否相同,
equals()方法默认比较的是两个对象的地址值是否相同,如果重写了Object类中的equals()方法,那么默认比较就是两个对象的内容是否相同7.clone()
protected Object clone() throws CloneNotSupportedException:创建并返回此对象
注意:要使用clone()方法,当前对象必须实现Cloneable接口,并重写Object类中的clone()方法。
方法详解:点击打开链接
/**
* 注意事项:
* Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。
* 要去使用clone()方法,当前对象所在的类一定要实现cloneable接口,
*/
public class ObjectDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Student s1 = new Student("韩庚",28);
System.out.println("name:"+s1.getName()+"---"+"age:"+s1.getAge());
//复制s1这个对象
Object obj = s1.clone();
//向下转型
Student s2 = (Student) obj;
System.out.println("name:"+s2.getName()+"---"+"age:"+s2.getAge());
//通过地址引用的赋值
Student s3 = s1; //把s1地址值赋值s3对象,s3指向s1的堆内存中的地址值
System.out.println("name:"+s3.getName()+"---"+"age:"+s3.getAge());
}
}
package day_10_10_28.object04;
//要去使用clone()方法,当前对象所在的类一定要实现Cloneable接口,
public class Student implements Cloneable {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写Object类中clone()
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
二.Scanner类
1.Scanner:用来创建一个文本扫描器(键盘录入),需要导包java.util.Scanner;2.java高级特性:IO流(后续补充)BufferReder:字符缓冲流来键盘录入
3.System类中的静态字段:
public static final InputStream in: 标准输入流
InputStream :字节流InputStream is = System.in ; 实质:抽象类多态
public static final OutputStream out: 标准输出流
4.开发步骤
1)创建键盘录入对象 :Scanner sc = new Scanenr(System.in);
2)录入数据: int a = sc.nextInt() ;
3)输出: System.out.println("a:"+a);
5.常用方法:
判断的功能:
hasNextXXX(); 在录入数据之前,加上判断功能,判断是否有下一个可以录入的XXX类型的数据
nextXXX();//通过录入获取这个int类型的数据
eg:public boolean hasNextInt();nextInt();
eg:public boolean hasNextInt();nextInt();
注意:会出现的异常:java.util.InputMismatchException:输入和想到的数据不匹配
package day_10_10_28.Scanner;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请您输入数据:");
//是否有下一个可以录入的int类型的数据
if(sc.hasNextInt()){
//录入数据
int a = sc.nextInt();
System.out.println("a:"+a);
}else{
//错误提示
System.out.println("录入的数据类型和想要的不匹配!");
}
}
//java.util.InputMismatchException:输入和想到的数据不匹配
}
注意事项: 先录入int类型的数据,在录入String类型数据,第二次录入的数据没有接收到,直接输出结果了,由于"回车"才能接收数据,回车换行符导致的!
解决方案:
1)在第二次录入String类型数据之前,需要重新创建键盘录入对象录入String类型
2)将sc.nextLine()改为sc.next()