黑马程序员技术交流社区

标题: 面向对象 [打印本页]

作者: 刘毅ly    时间: 2016-9-26 00:25
标题: 面向对象
继承是否是单继承,用什么方式可以替换多继承??


作者: chenhao597    时间: 2016-9-26 00:25
看来这5分是我的囊中之物了
首先Java只支持单继承,支持多层继承.但是如果我们要实现多继承怎么办呢?Java提供了内部类可以曲折的解决此问题.
我们来看一个案例,定义一个父亲、母亲接口,描述父亲强壮、母亲温柔的理想情形,代码如下:
[Java] 纯文本查看 复制代码
public interface Father {
    public int strong();
}

interface Mother {
    public int kind();
}

其中strong和kind的返回值表示强壮和温柔的指数,指数越高强壮和温柔也就越高,这与游戏中设置人物的属性是一样的,我们继续开看父亲、母亲这两个实现:
[Java] 纯文本查看 复制代码
class FatherImpl implements Father {
    // 父亲的强壮指数为8
    @Override
    public int strong() {
        return 8;
    }

}

class MotherImpl implements Mother {
    // 母亲的温柔指数为8
    @Override
    public int kind() {
        return 8;
    }

}

父亲的强壮指数为8,母亲的温柔指数也为8,门当户对,那他们生的儿子和女儿一定更优秀了,我们看看儿子类,代码如下:
[Java] 纯文本查看 复制代码
class Son extends FatherImpl implements Mother {

    @Override
    public int strong() {
        // 儿子比父亲强壮
        return super.strong() + 1;
    }

    @Override
    public int kind() {
        return new MotherSpecial().kind();
    }

    private class MotherSpecial extends MotherImpl {
        @Override
        public int kind() {
            // 儿子的温柔指数降低了
            return super.kind() - 1;
        }
    }
}

儿子继承自父亲,变得比父亲更强壮了(覆写父类strong方法),同时儿子也具有母亲的优点,只是 温柔指数降低了。注意看,这里构造了MotherSpecial类继承母亲类,也就是获得了母亲类的行为和方法,这也是内部类的一个重要特性:内部类可以 继承一个与外部类无关的类,保证了内部类的独立性,正是基于这一点,多重继承才会成为可能。MotherSpecial的这种内部类叫做成员内部类(也叫 作实例内部类,Instance Inner Class),我们再来看看女儿类,代码如下:
[Java] 纯文本查看 复制代码
class Daughter extends MotherImpl implements Father {

    @Override
    public int strong() {
        return new FatherImpl() {
            @Override
            public int strong() {
                //女儿的强壮指数降低了
                return super.strong() - 2;
            }
        }.strong();
    }

}

女儿继承了目前的温柔指数,同时又覆写了父亲的强壮指数,不多解释。注意看覆写的strong方法,这里是创建了一个匿名内部类(Anonymous Inner Class)来覆写父类的方法,以完成继承父亲行为的功能。  多重继承指的是一个类可以同时从多与一个的父亲那里继承行为与特征,按照这个定义,我们的儿子类、女儿类都实现了从父亲和母亲那里继承所有的功能,应该属于多重继承,这完全归功于内部类,大家在需要用到多重继承的时候,可以思考一下内部类。
   在现实生活中,也确实存在多重继承的问题,上面的例子说后人继承了父亲也继承了母亲的行为和特征,再比如我国的特产动物"四不像"(学名麋鹿),其外 形" 似鹿非鹿,似马非马,似牛非牛,似驴非驴 ",这你想要用单继承实现就比较麻烦了,如果用多继承则可以很好地解决此问题:定义鹿、马、牛、驴 四个类,然后建立麋鹿类的多个内部类,继承他们即可。   




作者: 刘毅ly    时间: 2016-9-26 00:28
应该是通过子父类的多层继承来实现多继承吧
作者: chenhao597    时间: 2016-9-26 01:07
这个是一本书上的建议 具体请看http://www.cnblogs.com/selene/p/5865810.html
作者: markiyangliu    时间: 2016-9-26 23:25
用接口吧?   还有可以就是多层继承!
作者: chenmo    时间: 2016-9-27 00:54
是单继承,但支持多层继承,可以用实现接口的方式来尽量替代多继承.
作者: Zzh94520    时间: 2016-9-27 15:13
用接口啊
作者: bluehat    时间: 2016-9-27 20:36
运用接口啊,java的接口就是弥补java单继承的不足的,一个类可以实现多个接口的。
作者: qweaschen    时间: 2016-9-28 16:31
在c和oc中继承都是单继承,在别的语言中有的是多继承。这是根据语言的编译器中规定来决定的
作者: 悄然林静    时间: 2016-9-28 21:13
iOS中类的继承只能是单继承,也就是只能有一个父类;没有多继承,但可以通过协议来实现类似的“多继承”效果,即你声明遵守我的协议,那么就可以使用我的属性和方法
作者: 足球骑士szw    时间: 2016-9-28 23:46
刚学,接口是可以多继承的
作者: hugin    时间: 2016-9-29 13:10
Java只支持单继承,用多实现可以替换多继承
作者: 流川枫    时间: 2016-9-29 21:55
类与类是单继承,可以多继承;
接口与接口是多继承;
类与接口是实现,可以多实现,
作者: wangkai426    时间: 2016-9-30 22:32
类只能单继承,接口可以多实现
作者: langyabang1110    时间: 2016-9-30 23:06
单继承 接口实现多继承

作者: barny    时间: 2016-10-1 17:13
你可以用多层继承,或者用接口方式解决.
作者: wangyu625    时间: 2016-10-3 19:34
继承是只能继承一个,单继承,只能有一个父亲,但是可以实现多个接口,可以用接口
作者: NewsmallWhite    时间: 2016-10-4 19:29
继承分为两种情况来分:
   1 接口之间的继承,接口之间的继承可以是多继承也可以是单继承
   2 类与类之间的继承,只能是单继承,但是可以多层次继承
想要替换多继承,可以使用实现接口的方法
作者: micader    时间: 2016-10-6 23:28
类继承只有单继承(extends) , 接口可以多实现(implements)
作者: songchangchang    时间: 2016-10-10 10:11
类在Java中是单继承,可以多层继承,接口可以多继承.但是在别的语言中类是可以多继承的,想实现多继承,可以通过多层继承,定义父类,让父类再去继承父类,谢谢
作者: 李鑫246    时间: 2016-10-10 23:41
java中,类是单继承,接口可以多继承

作者: 13902480061    时间: 2016-10-11 21:11
多重继承非多继承,可以用接口。

作者: 轻语轻狂    时间: 2016-10-12 00:06
首先,继承应该分为类继承和接口继承;类继承时,由于类中的方法都有函数体,当被继承的两个方法中存在两个方法同名时,子类调用时,不知道该去执行哪个方法的功能,所以出于安全,类不能够多继承;接口继承时,接口中即使存在同名的方法,但是由于接口中的方法都没有函数体(也就是没有具体功能),即使在被继承时,功能也是单一的,不存在安全因素,所以接口可以多继承。
作者: shine123    时间: 2016-10-15 17:07
可以实现多个接口及多层继承
作者: fulq1234    时间: 2016-10-17 11:13
java继承只支持单继承,接口缺可以支持多实现。
单继承想实现多继承的功能可以多嵌套几个继承。
作者: wjhsyy    时间: 2016-10-17 22:24
不能多继承,但是可以多层继承,java为了解决不能多继承的问题,采用了接口实现,接口的多实现,就解决了不能多继承的问题
作者: wjhsyy    时间: 2016-10-17 22:25
不能多继承,但是可以多层继承,java为了解决不能多继承的问题,采用了接口实现,接口的多实现,就解决了不能多继承的问题
作者: wjhsyy    时间: 2016-10-17 22:26
不能多继承,但是可以多层继承,java为了解决不能多继承的问题,采用了接口实现,接口的多实现,就解决了不能多继承的问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2