第1关:Object类
300
任务要求
参考答案
任务描述
相关知识什么是Object类
Object类的方法
Java对象克隆
编程要求
测试说明
任务描述
本关任务:掌握Object类及Object类的一些常用方法。
相关知识
为了完成本关任务,你需要掌握:
1.什么是Object类;
2.Object类的方法;
3.Java对象克隆。
什么是Object类
Java中有一个比较特殊的类,就是 Object 类,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承 Object 类。因此,Object 类是 Java 类层中的最高层类,是所有类的超类。换句话说,Java 中任何一个类都是它的子类。由于所有的类都是由 Object 类衍生出来的,所以 Object 类中的方法适用于所有类。
public class Person //当没有指定父类时,会默认 Object 类为其父类
{
...
}
上面的程序等价于:
public class Person extends Object
{
...
}
如果想引用你不知道的类型的对象,使用Object类是没有错的。请注意,父类引用变量可以引用子类对象,称为向上转换。下面举一个例子,有一个getObject()方法返回一个对象,但它可以是任何类型,如:Employee,Student等这样的类,我们可以使用Object类引用来引用该对象。 例如:
Object obj=getObject();//we don't know what object will be returned from this method
Object类为所有对象提供了一些常见的行为,如对象可以进行比较,对象可以克隆,对象可以通知等。
Object类的方法
Object类提供了许多方法。 它们如下:
Object类的常用方法有: toString()和equals()方法。
1.关于toString()方法
在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串);
可以通过重写toString()方法表示出对象的属性。
此方法是在打印对象时被调用的,下面有两个范例,一个是没复写toString()方法,另一个是复写了 toString()方法,读者可比较两者的区别。
package educoder;
public class TestToStringDemo1 {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p);
}
}
class Person extends Object {
String name = "张三";
int age = 18;
}
输出结果: educoder.Person@7852e922
从上面的程序中可以发现,在打印对象p的时候实际上打印出的是一些无序的字符串,这样的字符串很少有人能看懂什么意思,之后可以再观察下面的范例,下面的范例复写了Object类中的 toString()方法。
package educoder;
public class TestToStringDemo2 {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p);
}
}
class Person extends Object {
String name = "张三";
int age = 18;
// 复写Object类中的toString()方法
public String toString() {
return "我是:" + this.name + ",今年:" + this.age + "岁";
}
}
输出结果: 我是:张三,今年:18岁
与 TestToStringDemo1.java 程序相比,程序TestToStringDemo2.java 在 Person 类中明确复写了 toString()方法,这样在打印对象p的时候,实际上是去调用了 toString()方法,只是并没有明显的指明调用 toString()方法而已,此时第 6 行相当于:
System.out.println(p.toString());
2.关于equals()方法
比较的是对象的引用是否指向同一块内存地址,一般情况下,比较两个对象时是比较它的值是否一致,那如何解决呢?思路
答案
package case1;
import java.util.Scanner;
public class ObjectTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
// 在测试类中创建Demo类对象d1,传入输入值num1, d1调用toString方法并打印输出该值
// 创建Demo类对象d2,同样传入输入值num1,打印判断d1和d2是否相等(实际是比较地址)
/********* Begin *********/
Demo d1 = new Demo(num1);
System.out.println(d1.toString());
Demo d2 = new Demo(num1);
if(d1.equals(d2)){
System.out.println("true");
}else{
System.out.println("false");
}
/********* End *********/
// 创建Person类对象p,传入输入值num2,打印判断d1和p是否相等(实际是比较地址)
/********* Begin *********/
Person p = new Person(num2);
if(d1.equals(p)){
System.out.println("true");
}else {
System.out.println("false");
}
/********* End *********/
}
}
class Demo {
private int num;
public Demo(int num) {
this.num = num;
}
public boolean equals(Object obj) // Object obj = new Demo()
{
if (!(obj instanceof Demo)) // 判断obj是否和Demo是同类
return false;
Demo d = (Demo) obj; // 将父类的引用(Object)向下转换为子类(Demo)
return this.num == d.num;
}
public String toString() {
return "Demo:" + num; // 返回对象的值(每一个对象都有自己的特定的字符串)
}
}
class Person {
private int num;
public Person(int num) {
this.num = num;
}
}