前言

在Java中,子类继承父类,类实现接口是属于常识性的内容了,作为一个Java程序员应该也比较熟悉。不过子类继承父类,类实现接口中还是有一些小细节值得注意一下,本文就从个人工作、学习中入手,总结一些细节性的内容,以更进一步地掌握继承、实现的关系。现在只是写一些目前碰到的内容,以后只要想到了、碰到了任何继承、实现相关问题,都会保持更新此文。

接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口

Java为了弥补类单继承的不足,引入了类多实现接口的机制,不过多实现某个接口也是有一定限制的,比如:

public interface A
{
void C();
}
public interface B
{
int C();
}

那么同时实现这两个接口是不可能的:

这个错误是无法被修复的。试想,类AB实现接口A和接口B,那么接口A里面的抽象方法和接口B里面的抽象方法参数列表都相同仅有返回值不同,类AB应该实现哪个呢?实现接口A的"void C()",那么接口B的"int C()"怎么办?实现接口B的"int C()"那么接口A的"void C()"怎么办?因为"void C()"、"int C()"属于方法参数相同,返回值不同,这两个方法是不可以重载的,所以同时实现两个方法也不可能。因此,在这里Java只能报错了。

A是接口,B实现A,C继承B,则C也是A的子类

有一个接口A,B实现了A接口,C继承自B类,则C也是A的子类,看一下:

public interface A
{ }
public class B implements A
{ }
public class C extends B
{ }
public static void main(String[] args)
{
C c = new C();
System.out.println(c instanceof A);
}

返回结果是true。这是一个不难理解的结论,想到求证这个结论是因为有一次在研究LinkedHashMap的时候:

public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>

既然LinkedHashMap已经继承了HashMap了,HashMap是Map的实现类,那为什么LinkedHashMap还要实现Map呢,岂不是多此一举吗?由此想到了会不会是因为继承了HashMap不代表LinkedHashMap是Map的子类所以LinkedHashMap要专门再实现一下Map,做了上面的实验,发现是我多虑了,可能Sun的开发人员就想这么写吧,呵呵。

父子类中有同名属性

这不是错误,只是会造成歧义而已,而且也可能会造成返回我们不想要的结果,主要原因可能是开发者对父类代码不熟悉所导致的(尤其是在父类定义的属性一大堆的场景下)。举个例子:

public class Father
{
private int i; public Father()
{ } public Father(int i)
{
this.i = i;
} public int getFatherI()
{
return i;
}
}
public class Son extends Father
{
private int i; public Son(int i)
{
super(100);
this.i = i;
} public int getSonI()
{
return i;
}
}
public static void main(String[] args)
{
Son son = new Son(50);
System.out.println("Son getFatherI():" + son.getFatherI());
System.out.println("Son getSonI():" + son.getSonI());
}

运行结果为:

Son getFatherI():100
Son getSonI():50

提出这个问题是因为我们担心父子类的同名属性会不会存在覆盖的情况,从运行结果来看,完全不用担心这个问题。

一个实现类继承自一个抽象类并且实现了多个接口,那么必须实现所有未被实现的抽象方法

举个例子:

public interface InterfaceA
{
void A1();
void A2();
}
public interface InterfaceB
{
void B1();
void B2();
}
public abstract class AbstractC implements InterfaceA, InterfaceB
{
public void A1(){} // 我实现了InterfaceA的A1()方法
public void B2(){} // 我实现了InterfaceB的B2()方法 abstract void C(); // 我自己定义了一个抽象方法
}

那么要定义一个ClassD继承自AbstractC,则必须:

public class ClassD extends AbstractC
{
public void A2(){} // 我必须实现InterfaceA中未被实现的A2()方法 public void B1(){} // 我必须实现InterfaceB中未被实现的B1()方法 void C(){} // 我必须实现AbstractC中未被实现的C()方法
}

Java中类继承、接口实现的一些细节(长期更新)的更多相关文章

  1. Java中类继承、接口实现的一些要注意的细节问题

    1.接口A和接口B有相同的方法,只是返回值不同,则实现类不能同时实现这两个接口中的方法. 接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口. Java为了弥补类单继承 ...

  2. java中类继承,到底继承了什么?

    继承的最大好处就是为了实现代码的复用.那么,子类到底从父类得到的什么呢? 实例成员 父类的private成员不会被子类继承,子类不能访问.但是子类对象的确包含父类的私有成员. 父类的 包访问成员 继承 ...

  3. Java中类和接口

    很形象的接口的使用——针对初学者 里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下. 我们拿人和程序员举个例子.人是一个大类,程序员是继承自人的子类.看 ...

  4. Java成神之路技术整理(长期更新)

    以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 ...

  5. Java程序员必备的Intellij插件(长期更新,截止到2018-05-03)

    善用Intellij插件可大幅提升我们的效率 以下是我用过不错的Intellij插件 1. .ignore 生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写 截图:   ...

  6. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

  7. Java中类的继承深入剖析

    在Java开发中,我们常常用到继承这一概念,可以说继承是Java这类面向对象编程语言的基石.正是有了继承这个概念,使得我们可以创建分等级层次的类.今天小编就和大家一起来深入聊聊Java语言的继承. 在 ...

  8. Java之继承、抽象类、接口篇

    一.继承(extends) 什么是继承? 继承是对现实生活中的"分类"概念的一种模拟. 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承" ...

  9. java 面对对象(抽象 继承 接口 多态)

    什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...

随机推荐

  1. rest-assured : Restful API 测试利器 - 真正的黑盒单元测试(跟Spring-Boot更配哦,更新至spring-boot1.4.1)

    { "Author":"tomcat and jerry", "URL" :"http://www.cnblogs.com/tom ...

  2. Linq To Nhibernate 性能优化(入门级)

    最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net.废话不多说了,下面讲讲 ...

  3. 纯jsp用户登录系统

    用纯jsp技术实现用户登录系统,需要用到三个.jsp文件.在文本目录下新建三个.jsp文件,分别命名为login.jsp,logincl.jsp和wel.jsp. 1.login.jsp文件用来放界面 ...

  4. third class

    09remain timer 1.button的背景改变:放在背景图片里面,改变背景图片的位置,这样更简洁 08 simple clock 1.上下padding一样,居中2.setInterval( ...

  5. ios6 滤镜相关知识内容网址

    http://blog.csdn.net/justinjing0612/article/details/8145607#

  6. 深入理解HTTP协议

  7. PHP对图片按照一定比例缩放并生成图片文件

    list($width, $height)=getimagesize($filename);//缩放比例$per=round(400/$width,3); $n_w=$width*$per;$n_h= ...

  8. lua 快速排序

    function partion(arr, left, right) local tmp = arr[left] while left < right do while left < ri ...

  9. bzoj1179(Atm)

    ---恢复内容开始--- 1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Description Input 第一行包含两个整 ...

  10. 安装vs2010,vs2015后,删除2015,导致vs2016打不开

    报错:Cannot evaluate the property expression "$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(M ...