Java object类

来源:互联网 发布:程序员工作心得体会 编辑:程序博客网 时间:2024/06/04 21:56

前面有学到,class是Java的基本单元,如何创建一个class。一起看下创建class的关键页面,如下
这里写图片描述

用前面学到的继承知识,我们可以知道,在不修改继承的父类时,默认继承Object类。接下来我们学些下Object类。

一、Object类
1 .他是所有类的父类
2.如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object类
3.Object类中所有的方法适应于所有子类
4. object类我们常用的有两个方法: toString()方法和 equals()方法

二、关于toString()方法
1. 在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串)
2.可以通过重写toString()方法表示出对象的属性(相当于OC中的description方法)
我们看下例子: Dog继承Animal

public class Dog extends Animal {    int age = 20;    String name = "rose";   }

在main函数里面创建Dog类型对象,并输出该对象

    public static void main(String[] args) {        Dog dog  =  new Dog();        System.out.println(dog); }

输出结果: com.lemon.Dog@15db9742

从结果我们可以看到,输出的格式是 : 类名 + 内存地址
那我们想要得到对象的属性age 和name ,应该怎么做呢?很简单,改写父类的方法,相当于子类重写父类的方法,那么调用是优先调用子类的toString()方法。那重写格式规范呢? 我们可以利用快捷键去生成这个方法。
这里写图片描述

得到如下,我们可以选择性勾选需要描述的对象属性
这里写图片描述

在Dog类里面就生成toString() 方法如下

public class Dog extends Animal {    int age = 20;    String name = "rose";    @Override    public String toString() {        return "Dog [age=" + age + ", name=" + name + "]";    }}

此时,继续执行main方法,结果如下:

Dog [age=20, name=rose] // 对象的类型 ,属性值.相当于相当于OC中的description方法)

二、关于equals()方法
比较的是对象的引用是否指向同一块内存地址,一般情况下,比较两个对象时是比较他的值是否一致,那如何解决呢?思路也比较简单,重写equals()方法。

在不重写的情况下,我们先看下程序执行情况,创建两个相同类型的对象,并判断对象是否相等

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("两个对象是不相同的");            }    }

输出结果:

com.lemon.Dog@15db9742   // 以 @为分割符,前面是对象的类型,后面是对象的哈希值com.lemon.Dog@6d06d69c两个对象是不相同的

分析下 : 两个对象分别new了一次,开辟了两个不同内存空间,内存地址不同。object提供的equals() 是用来 比较的是对象的引用是否指向同一块内存地址。很显然,内存地址不一样,所以是不相等的,跟属性值是否否一样完全没有任何关系。

一般情况下,我们是需要判断对象的属性值相等的,那么如何重写 equals() 方法呢?系统也为我们提供了快捷键。操作如下:
这里写图片描述

得到如下页面
这里写图片描述

后,Dog出现如下方法,方法的解释也放在代码中一并进行解释如下:

public class Dog extends Animal {    int age = 20;    String name = "rose";     /* getClass() 得到的是一个类对象  相当于OC中的iskindOfClass方法 或者 object_getClassName()方法*/    @Override    public boolean equals(Object obj) {        if (this == obj)  //两个对象的引用是否相同,如果相同,说明像个对象就是同一个            return true;        if (obj == null)  // 如果比较对象为空,不需要比较,肯定不相等            return false;        if (getClass() != obj.getClass())  // 如果两个对象的类型是否相同,如果不同,肯定不相同            return false;        Dog other = (Dog) obj;  // 转化成相同类型后,判断属性值是否相同        if (name == null) {            if (other.name != null)                return false;        } else if (!name.equals(other.name))            return false;        return true;    }}

此时,继续执行main方法,得到如下,很显然,我们得到我们想要的结果

com.lemon.Dog@15db9742com.lemon.Dog@6d06d69c两个对象是相同的

三、equals() 和 == 的区别

1、在Java中,任何类型的数据都可以用 “==”进行比较是不是相等,一般用于基本数据类型的比较,比较器存储的值是否相等但是如果用于引用类型的比较,则是比较所指向对象的地址是否相等,在这点上,跟object类提供的equals()方法的作用是一致的

2、对于 equals()方法
1) 首先,不能用于基本数据类型的变量之间的比较相等
2) 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址
3) 诸如String、Date等类都对equals方法进行了重写,比较的是所指向的对象的内容

原创粉丝点击