一、API概述以及Object类的概述
A:API(Application Programming Interface)
应用程序编程接口
B:Java API
就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
C:Object类概述
类层次结构的根类
所有类都直接或者间接的继承自该类(顶层父类)
D:构造方法
public Object()
二、Object类的hashCode()方法
public class HashCodeTest {
public static void main(String[] args) {
Object o1 = new Object();
System.out.println(o1.hashCode());//获取对象的哈希码值
Object o2 = new Object();
System.out.println(o2.hashCode());//不同对象的哈希码值不同
}
}
1:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
2:不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
3:不是对象的实际地址值,可以理解为逻辑地址值。
三、Object类的getClass()方法
public class GetClassTest {
public static void main(String[] args) {
Object o1 = new Object();
Class aClass1 = o1.getClass();//获取字节码文件的对象
Object o2 = new Object();
Class aClass2 = o2.getClass();
System.out.println(o1==o2);//false
System.out.println(aClass1==aClass2);//true
}
}
1:返回此 Object 的运行时类。
2:可以通过Class类中的一个方法,获取对象的真实类的全名称。
四、Object类的toString()方法
public class ToStringTest {
public static void main(String[] args) {
Object o = new Object();
System.out.println(o.toString());//获取对象地址值
}
}
由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。(打印成员变量)
public class StudentTest {
public static void main(String[] args) {
Student student = new Student("张三",25);
System.out.println(student.toString());
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
五、Object类的equals()方法
public class EqualTest {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));//判断两个对象的地址值是否相同
}
}
由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等
public class StudentTest {
public static void main(String[] args) {
Student student1 = new Student("张三",23);
Student student2 = new Student("李四",25);
Student student3 = new Student("张三",23);
System.out.println(student1.equals(student2));
System.out.println(student1.equals(student3));
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
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;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Student)){
return false;
}
Student student=(Student)obj;
return this.age==student.age&&this.name.equals(student.name);
}
}
六、Object类的clone() 方法
clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public 。克隆方法分为浅克隆和深克隆,Object中使用clone()方法采用的是浅克隆的方式。
对象浅克隆要注意的细节:
1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。深克隆会把另一个对象也拷贝一份
4. 对象的浅克隆也不会调用到构造方法的。
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Dogfood food = new Dogfood("双汇");
Dog dog = new Dog("旺财", 2, food);
Dog dog2 = (Dog)dog.clone();
dog2.food.name="王中王";
System.out.println();
System.out.println(dog.food.name);//王中王
System.out.println(dog2.food.name);//王中王
}
}
class Dogfood{
String name;
public Dogfood(String name) {
this.name = name;
}
}
class Dog implements Cloneable{
String name;
int age;
Dogfood food;
public Dog(String name, int age, Dogfood food) {
this.name = name;
this.age = age;
this.food = food;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
内存图解
七、Scanner类概述及其构造方法
Scanner类概述
JDK5以后用于获取用户的键盘输入
构造方法
public Scanner(InputStream source)
八、Scanner类的成员方法
1、hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx/
2、nextXxx() 获取下一个输入项。Xxx的含义和上个方法中的Xxx相同
常用方法
public int nextInt()
public String nextLine()
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
if(scanner.hasNextInt()){ //判断是否输入的是int类型
int x = scanner.nextInt(); //获取下一个输入项
System.out.println(x);
}else{
System.out.println("数据有误");
}
}
注意:在使用键盘录入两个变量时,如果先录入一个int类型,后录入一个String类型时会产生一个小问题,原因是int类型输完后敲回车键,导致回车键对应的正则表达式被String接受,键盘录入失败。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a=scanner.nextInt();
String s1=scanner.nextLine();
System.out.println("a:"+a+" s1:"+s1);//a:1 s1:
}
解决方法:
1、先获取一个数值后,再创建一个新的键盘录入对象获取字符串
public static void main(String[] args) {
Scanner scanner1 = new Scanner(System.in);
int a=scanner1.nextInt();
Scanner scanner2 = new Scanner(System.in);
String s1=scanner2.nextLine();
System.out.println("a:"+a+" s1:"+s1);//a:1 s1:
}
2、把所有的数据都按字符串获取,然后要什么再转换成什么类型