码迷,mamicode.com
首页 > 其他好文 > 详细

Object类

时间:2020-12-02 12:34:05      阅读:5      评论:0      收藏:0      [点我收藏+]

标签:getname   alt   oid   sys   它的   ring   person   检查   bool   

java中的上帝类:Object

问:什么是Object类?

答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。当然,数组也继承了Object类。然而,接口是不继承Object类的,Object类不作为接口的父类。java的任何类都继承了这些函数,并且可以覆盖不被final修饰的函数。例如,没有final修饰的toString()函数可以被覆盖,但是final wait()函数就不行。
问:可以声明要“继承Object类”吗?

答:可以。在代码中明确地写出继承Object类没有语法错误。
例如:

importjava.lang.Object;
publicclassEmployee extendsObject {
privateString name;
publicEmployee(String name) {
this.name = name;
}
publicString getName() {
returnname;
}
publicstaticvoidmain(String[] args) {
Employee emp = newEmployee("John Doe");
System.out.println(emp.getName());
}
}

你可以试着编译代码1(javac Employee.java),然后运行Employee.class(java Employee),可以看到John Doe 成功的输出了。

因为编译器会自动引入java.lang包中的类型,即 import java.lang.Object; 没必要声明出来。Java也没有强制声明“继承Object类”。如果这样的话,就不能继承除Object类之外别的类了,因为java不支持多继承。然而,即使不声明出来,也会默认继承了Object类。
默认继承Object类例如:

publicclassEmployee
{
privateString name;
publicEmployee(String name)
{
this.name = name;
}
publicString getName()
{
returnname;
}
publicstaticvoidmain(String[] args)
{
Employee emp = newEmployee("John Doe");
System.out.println(emp.getName());
}
}

Equality

问:euqals()函数是用来做什么的?

答:equals()函数可以用来检查一个对象与调用这个equals()的这个对象
是否相等。

问:为什么不用“==”运算符来判断两个对象是否相等呢?

答:虽然“==”运算符可以比较两个数据是否相等,但是要来比较对象的话,
恐怕达不到预期的结果。就是说,“==”通过是否引用了同一个对象来判断两
个对象是否相等,这被称为“引用相等”。这个运算符不能通过比较两个对象
的内容来判断它们是不是逻辑上的相等。

问:使用Object类的equals()方法可以用来做什么样的对比?

答:Object类默认的eqauls()函数进行比较的依据是:调用它的对象和传入的
对象的引用是否相等。也就是说,默认的equals()进行的是引用比较。如果两
个引用是相同的,equals()函数返回true;否则,返回false.

问:覆盖equals()函数的时候要遵守那些规则?

答:覆盖equals()函数的时候需要遵守的规则在Oracle官方的文档中都有申明:

1. 自反性:对于任意非空的引用值x,x.equals(x)返回值为真。
2. 对称性:对于任意非空的引用值x和y,x.equals(y)必须和
    y.equals(x)返回相同的结果。
3. 传递性:对于任意的非空引用值x,y和z,如果x.equals(y)返回真,
    y.equals(z)返回真,那么x.equals(z)也必须返回真。
4. 一致性:对于任意非空的引用值x和y,无论调用x.equals(y)多少次,
    都要返回相同的结果。在比较的过程中,对象中的数据不能被修改。
5. 对于任意的非空引用值x,x.equals(null)必须返回假。

问:能提供一个正确覆盖equals()的示例吗?

答:当然可以,例如:
class Employee{

private  String  name;

private  int  age;

Employee(String name, int  age){

       this.name = name;

             this.age = age;
}
@Override
public  boolean  equals(Object o){

      if( ! ( o instanceofEmployee)){

                            return   false;

}

Employee e = (Employee) o;

return  e.getName().equals(name) && e.getAge() == age;

}

String getName(){

return  name;
}
int getAge(){

returnage;

}
}
public class EqualityDemo{

public static void main(String[] args){

Employee e1 = newEmployee("John Doe", 29);
Employee e2 = newEmployee("Jane Doe", 33);
Employee e3 = newEmployee("John Doe", 29);
Employee e4 = newEmployee("John Doe", 27+2);
// 验证自反性。
System.out.printf("Demonstrating reflexivity...%n%n");
System.out.printf("e1.equals(e1): %b%n", e1.equals(e1));
// 验证对称性。
System.out.printf("%nDemonstrating symmetry...%n%n");
System.out.printf("e1.equals(e2): %b%n", e1.equals(e2));
System.out.printf("e2.equals(e1): %b%n", e2.equals(e1));
System.out.printf("e1.equals(e3): %b%n", e1.equals(e3));
System.out.printf("e3.equals(e1): %b%n", e3.equals(e1));
System.out.printf("e2.equals(e3): %b%n", e2.equals(e3));
System.out.printf("e3.equals(e2): %b%n", e3.equals(e2));
// 验证传递性。
System.out.printf("%nDemonstrating transitivity...%n%n");
System.out.printf("e1.equals(e3): %b%n", e1.equals(e3));
System.out.printf("e3.equals(e4): %b%n", e3.equals(e4));
System.out.printf("e1.equals(e4): %b%n", e1.equals(e4));
// 验证一致性。
System.out.printf("%nDemonstrating consistency...%n%n");
for(inti = 0; i < code>5; i++){
System.out.printf("e1.equals(e2): %b%n", e1.equals(e2));
System.out.printf("e1.equals(e3): %b%n", e1.equals(e3));
}
// 验证传入非空集合时,返回值为false。
System.out.printf("%nDemonstrating null check...%n%n");
System.out.printf("e1.equals(null): %b%n", e1.equals(null));
}
}

toString:

方法摘要:

public String toString():返回该对象的字符串表示。

toSting方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。

由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。

覆盖重写:

如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。例如:

public class Person {  
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘;
    }

    // 省略构造器与Getter Setter
}

在idea中,可以点击菜单中的Generate,也可以使用快捷键alt+insert,点击toString的选项。

Tips:在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString的方法。

Object类

标签:getname   alt   oid   sys   它的   ring   person   检查   bool   

原文地址:https://blog.51cto.com/14954398/2555526

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!