标签:getname alt oid sys 它的 ring person 检查 bool
问:什么是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的方法。
标签:getname alt oid sys 它的 ring person 检查 bool
原文地址:https://blog.51cto.com/14954398/2555526