ad

《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.5 继承和多态

admin 129 2023-10-25

【摘要】 本书摘自《JAVA服务端研发知识图谱》一书中第1章,第5节,由何为、迟文恒 编著。

1.5 继承和多态

继承是指派生类继承基类的属性和某些行为,多态是指派生类在基类的基础上进行重写从 而表现出来的不同性状。本节从基础的 Object 和类似的组合讲起, 一点点了解继承和多态的原 理和用法。

1.5.1 Object

前面编写了好多代码用来创建类对象以及调用相应的方法,但是类不仅仅是这些内容。观察下面代码的输出,了解类和对象的其他特性。

public class Person {

public long id;

《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.5 继承和多态

public String name;

public Person(long id,String name){

this.id =id;

this.name =name;

public static void main(String[] args){

Person person =new Person(1,"xiaoming");

System.out.println(person.toString();

运行结果如下:

comjavadevmap.Person@7852e922

这里使用了 public 的字段,是为了使代码看起来简单一些,实际项目中不这样使用。在这 个例子中,创建了一个 person 对象,然后调用了toString()方法,但是类里并没有这个方法,这 个方法是从哪里来的呢?

这就涉及Java的单根继承结构。在Java中,所有的类都继承自Object类。也就是说除了基 本类型,其他类都是一种 Object。而 toString 方法就是 Object里的方法,通过类的继承而来。这 种单根继承结构也为Java的内存回收提供了很大的便利。

继承听起来很费解,举个例子。例如常用的手机是一种物质,看不见的原子也是一种物 质,那么把这些东西的通用性全部抽离出来,用物质这个统称来代替它们是可以的。对于 Java 语言,这个统称就是 Object, 所有物质包含的属性,例如大小,重量就相当于 Object 里的字段或方 法。而继承就是在这个统称之上再进行细分,从而凸显自己的特性。

再回到代码中, toString 方法其实是把类的内容转化为 String 进行输出,但好像并没有得到 期望输出的内容。是否可以通过某种办法输出期望的数据?代码如下:

@Override

public String toStringO {

retum"id="+this.id+"name="+this.name;

运行结果如下:

id=1 name= xiaoming

可以在 Person 类中重写这个方法,用于替换 Object 的默认 toString 实现,从而达到正确输 出的目的。

Object 还有一个 equals()方法,用于对象的比较。通过下面的代码演示这个方法的使用。首 先不重写此方法,观察输出的结果。

public static void main(String[] args){

Person personl =new Person(1,"xiaoming");

Person person2=new Person(1,"xiaoming");

System.out.println("person 1 =person 2="+(personl=person2));

System.out.println("person 1 equals person 2="+(personl.equals(person2)));

运行结果如下:

person 1 =person 2=false

person 1 equals person 2 = false

虽然代码中给创建的两个对象赋的值是相同的,但是无论用“=”比较还是用 equals 比 较,比较的结果都是不同的。下面重写 equals方法,再执行程序观察输出的结果。

@Override

public boolean equals(Object obj){

if(obj =null){

return false;

Person person=(Person)obj;

if((this.id =person.id)&&(this.name—person.name)){

return true;

}

return false;

运行结果如下:

person 1 =person 2=false

person I equals person 2 =true

通过重写 equals 方法,对对象里的字段值进行比较,字段值相同即两个对象相同,最后两 个对象比较的结果是 true。 那么为什么“=”比较的结果还是 false 呢?其实“=”比较的是对 象的地址,两个对象地址不同所以不同, equals 默认的方法比较的也是对象的地址,需要覆盖 equals的默认实现才能正确进行比较。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《基于Kubernetes的容器云平台实战》_了解最新技术前沿_4.2.2 Harbor的镜像同步机制
下一篇:《JAVA服务端研发知识图谱》_让你更懂Java后台研发_7.1 第7章 Spring Boot
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×