Object中的几个简单方法
Object可以说成是每个类的父类,每个类可以说是默认继承Object,但是不包括接口。Object是储存在java.lang包中的,接下来所说的方法可以在API上可以了解查询
Public int hashCode()返回的是该对象的哈希码值,它显示的是一串数字,我们可以把它理解成地址值,但它不是实际意义上的地址值。
例如:
package com.TextDome;
public class hashCodeDome {
public static void main(String[] args) {
hashCodeDome h=new hashCodeDome();
System.out.println(h.hashCode());
//运行结果:118352462
每个类对象的返回的哈希码值是不同的
getClass和getName的理解:
public final Class getClass()返回的是当时Object运行的类,即哪个类在运行
getName是class类里面的一个方法:
public String getName()以 String 的形式返回此Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
package com.TextDome;
public class hashCodeDome {
public static void main(String[] args) {
hashCodeDome h=new hashCodeDome();
System.out.println(h.hashCode());
System.out.println("--------------------");
Class c=h.getClass();
System.out.println(c);
String s1=c.getName();
System.out.println(s1);
运行结果:
/**
* 118352462
* --------------------
* class com.TextDome.hashCodeDome
* com.TextDome.hashCodeDome
*/
由运行结果可以看出getClass和getName的运行区别。
equals方法
equals方法属于object类中的方法,默认比较的是地址值是否相同
==比较的是地址值是否相同
例如:
public class equalsDome {
public static void main(String[] args) {
Teacher t=new Teacher("迪丽热巴",27);
Teacher t1=new Teacher("迪丽热巴",27);
System.out.println(t);
System.out.println(t1);
System.out.println(t==t1);
System.out.println(t.equals(t1));
}
运行结果:
/**
* com.TextDome.Teacher@70dea4e
* com.TextDome.Teacher@5c647e05
* false
* false
*/
由上例可以看出t和t1的地址值不相同,所以==是false
我们也可以看出t与t1的equals也是false,因为此时Teacher类里的equals并没有被重写,比较的也是二者的地址值,当我们让系统自动进行重写后,然后判断俩个对象的有参内容是否相同,从而进行判断
重写的快捷键是:shift+alt+s,然后选取Generate hashCode() and equals()...选项
class Teacher{
String name;
int age;
public Teacher() {
super();
}
public Teacher(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;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Teacher other = (Teacher) 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;
}
}
将 Teacher类重写之后就会想上图一般,然后当你再去运行t.equals(t1)时,你会发现,运行结果为true。
Clone方法
Clone()就是创建并返回此对象的一个副本
要想类对象执行clone方法,必须让自定义类实现Cloneable接口,否则就会报错CloneNotSupportedException,注意,所有的数组都被视为实现接口 Cloneable
例如:
package com.TextDome;
class Animal implements Cloneable{
String name;
int age;
public Animal() {
super();
}
public Animal(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;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
public class CloneDome {
public static void main(String[] args) {
Animal a=new Animal("猫咪",5);
System.out.println(a.getName()+"---"+a.getAge());
Object obj=a.clone();//这里将会报错
System.out.println(a.getName()+"==="+a.getAge());
}
}
根据上例,当我们的自定义类实现了Cloneable接口后,然后重写了clone方法后,我们的对象a才可以去调用clone方法,但是我们的clone返回是一个Object,发现上述依旧会报错,所以我们有两种解决方法:
1)public class CloneDome {
public static void main(String[] args) throws CloneNotSupportedException {
Animal a=new Animal("猫咪",5);
System.out.println(a.getName()+"---"+a.getAge());
Object obj=a.clone();
System.out.println(a.getName()+"==="+a.getAge());
}
}
如上例所示,在主函数中加入红色代码即可解决
2)public class CloneDome {
public static void main(String[] args) {
Animal a=new Animal("猫咪",5);
System.out.println(a.getName()+"---"+a.getAge());
try {
Object obj=a.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(a.getName()+"==="+a.getAge());
}
}
上述方法也可以解决。
除了Clone方法外,我们也可以通过类对象的赋值来解决
public class CloneDome {
public static void main(String[] args) {
Animal a=new Animal("猫咪",5);
System.out.println(a.getName()+"---"+a.getAge());
Animal a1=a;
System.out.println(a1.getName()+"==="+a1.getAge());
}
}
将对象a赋值给a1,也可以解决此问题。
Scanner
Scanner类是java.Util.Scanner包下的
Scanner类最常用的是键盘录入对象:
1)创建键盘录入对象:Scanner sc=new Scanner(System.in);
2)导入util包:import java.util.Scanner; //导包的快键键:Ctrl+alt+o
3)接收数据:数据类型 对象名=sc.Next数据类型();//数据类型包含好多int、float、double、String...
构造方法:
Public Scanner(Inputstream source)
System类下有一个静态的字段:
Public static final Inputstream in;标准的字节输入流
Inputstream in=System.in;
键盘录入对象在前面已经用过好多次了,这里就不进行举例了。
Scanner类常用的一些方法:
1)当你在键盘录入的时候,输入的数据类型和接收的数据类型不一致时,系统就会报错,这是hasNext()方法就派上用场了,它返回的是boolean类型,起的是一个判断作用。
package com.TextDome1;
import java.util.Scanner;
public class hasNextDome {
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("您输入的数据有误...");
}
}
}
运行结果:
/**
* 请您输入一个数据:
*37
*num:37
* 请您输入一个数据:
* hello
* 您输入的数据有误...
*/
以上是两种运行出现的结果,再也不会因为数据类型的不同而报错
除了hasNextInt()外,hasNext()还有其他的类型,在API中都有介绍,具体用法与上例一致
在键盘录入的时候,有一个小易错点。当你先录入一个字符串的值,然后再录入一个数据类型的值时,运行时没有差错,例如:
package com.TextDome1;
import java.util.Scanner;
public class StringLineDome {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请您输入一个字符串类型的值");
String str1=sc.nextLine();
System.out.println("请您输入一个整型类型的值");
int str2=sc.nextInt();
System.out.println("str1:"+str1+",str2:"+str2);
}
}
运行结果:
/**
* 请您输入一个字符串类型的值
* hello
* 请您输入一个整型类型的值
* 23
* str1:hello,str2:23
*/
但是当你先输入一个整型类型的值,然后再输入一个String类型的值时,就会发现出了异常:
/**
* 请您输入一个int类型的值
* 23
* 请您输入一个String类型的值
* str1:23,str2:
*/
为什么会出现这样的问题呢?
那是因为当你输入一个整型的值,回车去输入String类型的值时,系统默认将回车当做一个字符串去执行,然后就出现了这样的运行结果
解决方案:
你在int和String接受对象前面各放一个键盘录入对象:
Scanner sc=new Scanner(System.in);
System.out.println("请您输入一个int类型的值");
int str1=sc.nextInt();
Scanner sc1=new Scanner(System.in);
System.out.println("请您输入一个string类型的值");
String str2=sc1.nextLine();
System.out.println("str1:"+str1+",str2:"+str2);
这样就能解决上述问题了