Object类的简单方法及Scanner类的简单认识

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

每个类对象的返回的哈希码值是不同的

getClassgetName的理解:

public final Class getClass()返回的是当时Object运行的类,即哪个类在运行

getNameclass类里面的一个方法:

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
 */

由运行结果可以看出getClassgetName的运行区别。

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
 */

由上例可以看出tt1的地址值不相同,所以==false

我们也可以看出tt1equals也是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类型,起的是一个判断作用。

hasNextInt()是其中的一种,还有其他的类型,包括(hasNextBoolean()、hasNextByte()、hasNextDouble()、hasNextLine()...)
具体用法如下:

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类型的值时,系统默认将回车当做一个字符串去执行,然后就出现了这样的运行结果

解决方案:

你在intString接受对象前面各放一个键盘录入对象:

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);

这样就能解决上述问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值