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

前言

在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()方法
}

时间: 2024-08-03 00:27:11

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

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

继承的最大好处就是为了实现代码的复用.那么,子类到底从父类得到的什么呢? 实例成员 父类的private成员不会被子类继承,子类不能访问.但是子类对象的确包含父类的私有成员. 父类的 包访问成员 继承为子类的包访问成员.就好像他们直接定义在子类中一样. 父类的 protected 成员继承为子类的protected 成员.就好像他们直接定义在子类中一样. 父类的 public 成员继承为子类的public 成员,就好像他们直接定义在子类中一样. 实例方法 继承到的实例方法在子类中可以直接被使用,

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

以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 Java基础篇 8张图带你轻松温习 Java 知识 Java父类强制转换子类原则 一张图搞清楚 Java 异常机制 通用唯一标识码UUID的介绍及使用 字符串拼接 + 和 concat 的区别 Java趣味分享:try/finally 关于Java序列化你应该知道

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

(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开发和维护,所有Java中的类是只能单继承,通过接口来实现多继承:对于接口的话,是可以多继承的,例如:A接口可以同时继承接口B和接口C,但是有一点要注意,就是实现接口A的类必须要实现接口A.B.C中所有的抽象方法:接口之所以可以多继承,就是因为接口结构比较简单. 继承是通过extends关键字来实现,

浅谈Java中类的继承

继承作为面向对象的三大基本特征之一,也是Java中必不可少的组成部分.因此,Java中类的继承和其他面向对象语言的继承都是大同小异的. 继承的优点: 通过继承可以简化类的定义. Java只支持单继承,不允许多重继承. 可以有多承继承,即一个类可以继承某个类的子类,如类B继承了类A,类C又继承了类B,那么C也间接的继承了A. 子类继承所有父类的成员变量和成员方法,但不继承父类的构造方法.在子类的构造方法中,可使用语句super(参数列表)调用父类的构造方法. 如果子类的构造方法中没有显性的调用父类

再谈Java中类的继承

上篇博客谈到了Java中类的继承,但是那些远远不能满足我们在实际操作中的需要,那么怎么才能让子类的功能更强大,并且具有父类的属性呢? 一: 父类 1 public class A { 2 3 final String name="A"; 4 5 void A1(){}; 6 } 子类 1 public class AA extends A{ 2 3 String name="AA"; 4 5 void AA1(){}; 6 7 public static void

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

关于Java中继承多接口同名方法的问题

在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: 1 interface A{ 2 void fun(); 3 } 4 interface B{ 5 void fun(); 6 } 7 interface C extends A,B{ 8 9 } 10 public class Test implements C{ 11 @Override 12 public void fun() { 13 System.out.println("hehe&quo

java通过继承来扩展接口

接口主要是为了向上转型,从而使基类(接口方法)更具灵活性!不想废话,看例子: /** * */ package interfaces; interface Monster{ void menace(); } interface DangerousMonster extends Monster{ void destory(); } interface Lethal{ void kill(); } class DragonZilla implements DangerousMonster{ publ

Java基础10 接口的继承与抽象类

链接地址:http://www.cnblogs.com/vamei/archive/2013/03/31/2982240.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体.interface为类提供了接口规范. 在继承中,我们为了提高程序的可复用性,引入的继承机制.当时的继承是基于类的.interface接口同样可以继承