提示:本文章为个人学习记录,仅供参考学习,禁止转载,支持交流与讨论。
文章目录
第1关: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类的常用方法有: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岁
2.关于equals()
方法
比较的是对象的引用是否指向同一块内存地址,一般情况下,比较两个对象时是比较它的值是否一致,那如何解决呢?思路也比较简单,重写equals()
方法。
在不重写的情况下,我们先看下程序执行情况,创建两个相同类型的对象,并判断对象是否相等。
ackage educoder;
public class test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "jack";
Dog dog1 = new Dog();
dog1.name = "jack";
System.out.println(dog);
System.out.println(dog1);
if (dog.equals(dog1)) {
System.out.println("两个对象是相同的");
} else {
System.out.println("两个对象是不相同的");
}
}
}
class Animal {
}
class Dog extends Animal {
int age = 20;
String name = "rose";
public String toString() {
return "Dog [age=" + age + ", name=" + name + "]";
}
}
输出结果:
Dog [age=20, name=jack]
Dog [age=20, name=jack]
两个对象是不相同的
分析下 : 两个对象分别new
了一次,开辟了两个不同内存空间,内存地址不同。object提供的equals()
是用来比较的是对象的引用是否指向同一块内存地址。很显然,内存地址不一样,所以是不相等的,跟属性值是否一样完全没有任何关系。
equals()
和==
的区别:
在Java中,任何类型的数据都可以用“==”
进行比较是不是相等,一般用于基本数据类型的比较,比较器存储的值是否相等。但是如果用于引用类型的比较,则是比较所指向对象的地址是否相等,在这点上,跟object类提供的equals()
方法的作用是一致的。
对于equals()方法
首先,不能用于基本数据类型的变量之间的比较相等;
如果没有对equals
方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date
等类都对equals
方法进行了重写,比较的是所指向的对象的内容。
Java对象克隆
对象克隆是一种创建对象的精确副本的方法。 Object类的clone()
方法用于克隆对象。java.lang.Cloneable
接口必须由我们要创建其对象克隆的类实现。如果我们不实现Cloneable
接口,clone()方法将生成CloneNotSupportedException
。
clone()
方法在Object类中定义。clone()
方法的语法如下:
少处理任务。
clone()方法示例(对象克隆)
package educoder;
public class Student implements Cloneable {
int rollno;
String name;
Student(int rollno, String name) {
this.rollno = rollno;
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String args[]) {
try {
Student s1 = new Student(101, "amit"