众所周知,Java中是没有多继承的,只有多实现.但是,有时候我们确实需要继承多个类,这是个比较现实的问题,但是,标准的语法限制了我们,虽然可以通过多重继承来达到这样的效果,但是,看上去依旧那么不优雅,所以这边我想到一个办法,即通过内部类的方式进行多继承.
我们就以一个比较浅显的例子来说明问题,人类的造人.我们都知道,子女的很大部分都是由父母继承而来,所以需要多继承,通常情况下,我们通常会这么写:
先是父母类接口:
public interface MotherIF { public int getKind(); }
public interface FatherIF{ public int getStrong(); }
然后,我们来写父母类的具体实现:
public class Mother implements MotherIF{ @Override public int getKind() { return 8; } }
public class Father implements FatherIF{ @Override public int getStrong(){ return 8; } }
然后我们可以知道,父亲的强壮指数是8,母亲的善良指数是8,所以门当户对啊,于是他们的小孩也应该更加优秀.所以儿子应该继承了父亲的强壮和母亲的温柔.于是,我们需要儿子继承父亲和母亲,传统的方法是使用多层继承,即有一个类,先继承了母亲.再继承父亲,最后得到儿子,但是这样做,十分丑陋,而且对上层函数的重写也看上去不是那么清晰.于是这边我们采用的是使用内部类的方法.
public class Son extends Father implements MotherIF{ @Override public int getKind() { return new myMother().getKind(); } @Override public int getStrong(){ return super.getStrong() + 1; //比父亲更加强壮 } private class myMother extends Mother{ public int getKind() { return super.getKind() - 1; //没有母亲那么善良 } } }
这一段代码中,我们创建了一个myMother类,来继承母亲类,获取了母亲类的行为方法这是内部类的一个重要的特征.内部类可以通过继承一个与外部类无关的类来保证内部类的独立性,真是因为这一点,多层继承才可以完成.除了这边介绍的成员内部类之外,这里还介绍另外一种方式,匿名内部类.我们来看女儿的代码:
public class Daughter extends Mother implements FatherIF{ @Override public int getStrong() { return new Father(){ @Override public int getStrong(){ return super.getStrong() - 2; } }.getStrong(); } public int getKind(){ return super.getKind() + 1; } }
这边我们可以看到,女儿继承了母亲的善良,也继承了,父亲的强壮.这边的腹泻方法,是创建了一个匿名内部类,来完成继承父亲行为的功能.
再比如,我们常说的四不像,我们可以在四不像中定义鹿马牛驴这四个内部类,然后如法炮制即可.