摘自java编程思想,个人感觉只不过是维护了一个E的子类对象而已,这也算多重继承? class D
{
} abstract class E
{
} class Z extends D
{
E makeE()
{
return new E()
{
};
}
} public class MutiImplementation
{
static void takesD(D d){}
static void takesE(E e){}
public static void main(String[] args)
{
Z z = new Z();
takesD(z);
takesE(z.makeE());
}
}
{
} abstract class E
{
} class Z extends D
{
E makeE()
{
return new E()
{
};
}
} public class MutiImplementation
{
static void takesD(D d){}
static void takesE(E e){}
public static void main(String[] args)
{
Z z = new Z();
takesD(z);
takesE(z.makeE());
}
}
继承当然是为了复用啊,这样我们不是优雅的实现了?
class D{E e;}那你这说法,这个里面的D就继承了E?
再就是我还有个疑问,既然是继承了 也就是说子类是父类的关系,
你可以认为java编程思想那例子中Z就是E
那么 takesE(z.makeE()); 这个调用我应该是takesE(z);也可以的咯
能不能详细点你只说了匿名内部类是继承了E 那就说明了Z继承了E么
Z就是E 当然不是 。 Z不是E 因为他没继承E啊。只是说用匿名内部类模拟实现多继承 。
接着你的话题说哈
第一个问题,“e的内部方法可以访问D的 私有变量么?”不明白你这句话想要说明什么
也许你想说明的是
class Z extends D
{
private int a;
E makeE()
{
return new E()
{
public void b(){
a=1;
}
};
}
}
如果是那继续看下面,不是那麻烦把你的想法再表达下
第二个问题,我明白你的意思了,你就是说这只是做一个模拟,我当然知道Java不能多继承类,虽然我java不能算多好,还是学过些的,我想问的是这能算一个成功的模拟么
就拿这个匿名内部类来说,如果是这样的话,我匿名内部类里面增加子类自己的方法,Z能访问吗(不用反射),如果按继承来说,子类增加自己的方法,访问什么的都OK吧
就像上面那个public void b(),定义在Z里面的话也没办法访问匿名子类的私有成员吧
如果不用匿名内部类,就用一个与方法同层次的内部类继承了E,那么在内部类中我想定义个私有的成员覆盖父类的成员怎么办 abstract class E
{
protected int a;
} class Z extends D
{
class F extends E{
private int a;
}
E makeE()
{
return new F();
}
}Z能访问到F里面的a么
一个简单的例子
class E{
public print(){System.out.println("print in E");}
}
class Z extends E{
private int a;
public print(){println();}
private println(){System.out.println()}
}
我们平时写的继承 E z=new Z();
这个多态你是不可以通过对象组合来实现的
这个多态用内部类实现
class Z extends D
{
private int a;
E makeE()
{
return new E()
{
public void println(){
System.out.println(a);
}
};
}
}这是第一个问题。 说明 用匿名内部类 和 使用组合的差别第二个问题
就拿这个匿名内部类来说,如果是这样的话,我匿名内部类里面增加子类自己的方法,Z能访问吗(不用反射),如果按继承来说,子类增加自己的方法,访问什么的都OK吧
就像上面那个public void b(),定义在Z里面的话也没办法访问匿名子类的私有成员吧
如果不用匿名内部类,就用一个与方法同层次的内部类继承了E,那么在内部类中我想定义个私有的成员覆盖父类的成员怎么办首先你需要实现的 Z继承于E ,为什么要在匿名内部里增加方法, 在匿名内部类里你只需要把需要重写的方法写出来,其它的都继承于E就可以, 因为你要实现的事Z继承E , 你把需要拓展的方法写到Z里面不就行了?
你把继承层次搞清楚。 Z可以随便增加自己的方法 还可以通过内部类重写 E的方法 。 你说的你要定义私有成员覆盖父类成员 那你直接在Z中定义不就可以了??看下面例子 abstract class E{
private int i=2;
abstract void increments();
abstract void print();
}
public class Z {
private int i=0;
class F extends E{
public void increments(){ i++;}
public void print(){System.out.println("i="+i);};
}
public E makeE(){
return new F();
}
public static void main(String [] args){
Z z=new Z();
E e=z.makeE();
e.increments();
e.print();
}
}
结果
i=1还需要解释什么? 还有什么继承机制没实现呢? 要明确记住 是 Z继承E
abstract class E
{
protected int a;
}class Z extends D
{
class F extends E
{
}
public void c(){
//在Z中增加的子类扩展方法,如何访问父类的a
} E makeE()
{
return new F();
}
}
protected int j=2;
abstract void increments();
abstract void print();
}
public class Z {
private int i=0;
private F f;
public Z(){f=new F();}
public int getJandAddI(){
return f.getJandAddI();
}
class F extends E{
public int getJandAddI(){return j+i;};
public void increments(){ i++;}
public void print(){System.out.println("i="+i);};
}
public E makeE(){
return f;
}
public static void main(String [] args){
Z z=new Z();
E e=z.makeE();
System.out.println(z.getJandAddI());
}
}
把需要用到父类字段的方法 在子类中写好,再在外部类中 提供接口
static void takesE(E e){}
public static void main(String[] args)
{
Z z = new Z();
takesD(z);
takesE(z.makeE());
}
z是D的子类,方法takesD(D d){}的参数是D,传一个子类没问题啊
takesE(E e){}的参数是E,传递的是E的匿名实现类,也没问题呀,
哪有多继承
public static void main(String [] args){
Z z=new Z();
E e=z.makeE();
System.out.println(z.getJandAddI());
}
借你这段代码说,e强转成Z会出错,强转成F又如何调用Z新增的扩展方法
和这样实现感觉还是存在很多疑惑,即使实现出来这样的继承也是个残品吧?(没再细想,感觉有一些特性无法实现)
Z只单独继承于D,这个只是通过聚合关系,让Z能调用E的方法。
java编程思想说只能用内部类来实现,我想看看到底有何特别之处
是不是多重继承得使用 instanceof 运算符。对象 z instanceof E 为 true 么?很明显不是,这里的 makeE 只是一个产生 E 对象的工厂方法。虽然这个 E 对象能够使用 Z 类中的数据,但是 Z 类本身与 E 类是没有任何父子关系的。Z 与 makeE 中 E 的关系是工厂与产品的关系,而不是父与子的关系。
如果 instanceof 成立了, 那当然那是多继承了, 所以说是模拟多继承,instanceof当然不成立
注意我们的论调是 这个是否模拟了多继承 , 它根本不是多继承,如果我们以复用的角度来看,我认为 ,
这个实现确实模拟了多继承。