multi-inherite

来源:互联网 发布:oracle sql convert 编辑:程序博客网 时间:2024/06/06 07:05

  multi-inherite -----多继承

  虽然说OO都不推荐这样的一种设计风格,但是他们始终都给出了他们各自的实现方式.C++是直接支持来自于类的多继承,而JAVA则是通过interface间接地支持了一下,当然了,可以说避免不少的混乱.

  我这里要讲的东西呢是关于多继承中的冲突问题

一、属性冲突问题

  问题场景:如果interface有一个变量是i,super class同时也有一个变量是i.同时都是public或者对子类可见.那么子类在访问这个变量的时候会出现什么问题呢?

package ThinkingInJava;

public class AttributeTestExtendClass extends AttributeTestClass implements AttributeTestInterface
{
public static void main(String[] args)
{
    AttributeTestExtendClass test
=new AttributeTestExtendClass();
    
//System.out.println(test.i);  //在这里,我们可以在IDE中看到一个错误,下面来分析这个错误
}

}

class AttributeTestClass
{
    
public int i=0;
}

interface AttributeTestInterface
{
    
int i=0;
}

  有人的第一反应是interface里面居然能写变量...!!!陆陆,你瞎闹呢吧,真不好意思,我们老师讲的时候也和你一样是这么说的,但是真实的情况是,interface中间确实是有,但是他是默认为static final的一个变量.这样在同一个类AttributeTestExtendClass(好吧..名字这么长让大家见笑了)中就有2个i属性,冲突了.但是奇怪的是,我们只有在调用他的时候才能得到这个冲突的信息,不知道是怎么想的...或者换句话说是,两者并存是可以包容的,但是你调用的时候,2个i,JVM不知道要调用哪一个,是语句存在了二异性.

有1,当然有2了.继续看下去吧

二、方法的冲突问题

  问题场景:问题的场景还是相似的.

  如果一个super class和一个interface拥有连signature都一样的方法,而子类没有覆盖这个方法,怎么办.

  如果是覆盖了的话,应该不会有冲突吧,毕竟都给2者都被覆盖掉了.如果没有被覆盖呢,怎么办呢...interface又没有方法体,那我们就按照super class怎么说就怎么做好了嘛...也许你会说....说的好,你真聪明,JAVA也确实是这么做的.当然有他的合理性.但是我想说的是如果是C++呢?这样的问题是否就这么简单的说清楚了呢?要知道人C++可以继承2个super class,这两个可都可以有方法体

  这样的问题还是留给自己想想吧,末了,再说一次很废话的话,能不用就不要用多继承,不是啥好鸟

原创粉丝点击