Vector v=new Vector(); Enumeration e=v.elements();你是否可以这样想?public interface I{}public class C{ public I Is(){ return new I(){}; } }C c = new C(); I i = c.Is();
最近有点习惯给方法加上public
不好意思,我第一个问题的代码写错了,a变量做了重复声明,修改如下: 我是说一个抽象类或接口声明的数组,其元素可否为其不同子类的对象(像 C++ 一样)?interface A { A_m(); }interface B { B_m(); }class AB1 implements A,B { AB1(){}; ... //接口中方法的实现 }class AB2 implements A,B { AB2(){}; ... //接口中方法的实现 }... A a=new AB1(); B b=new AB1(); A aa[2]; aa[0]=new AB1(); aa[1]=new AB2(); a.A_m(); a.B_m(); b.A_m(); b.B_m(); ... //上述语句有错误吗?如果把接口改成抽象类呢?接口和抽象类是不是具有同样的用法呢?
当然有错。a不能调用B_m方法,同样b也不能调A_m方法,除非强制类型转换。
to sean_gao(大胃):关于第二个问题:关键是e引用的那个对象是哪个类构造的,不可能是接口吧,那就只能是实现该接口的类了,即Vector, 若系统内部构造了一个对象,是否也有这样的一个类存在? 还有: A a=new AB1();不属于类型转换的一种吧? 那a不能调用B_m()方法,但对象a中一定包含了B_m()的入口吧,这样说来,是不是说就是把a中实现的非A接口的方法的入口给屏蔽(隐藏)掉了(如果可以强制类型转换而引用的话,应该是这样的吧),还是就没有了那些入口(内存中释放了那些入口地址的空间,这样就不能够强制类型转换了)? 我上述的理解对吗? 谢谢!
to javafaq2004(农村干部瞎忙活) :public interface I{}public class C{ public I Is(){ return new I(){}; } }C c = new C(); I i = c.Is();接口不能构造对象的,它连构造方法都没有! 如果I是类的话,我就不会提出这个问题了!
关于第二个问题:关键是e引用的那个对象是哪个类构造的,不可能是接口吧,那就只能是实现该接口的类了,即Vector, 若系统内部构造了一个对象,是否也有这样的一个类存在? ------------------------------------------------------------------------------- Enumeration e=v.elements(); v 返回的是一个实现了Enumeration接口的内部类! 还有: A a=new AB1();不属于类型转换的一种吧? 那a不能调用B_m()方法,但对象a中一定包含了B_m()的入口吧,这样说来,是不是说就是把a中实现的非A接口的方法的入口给屏蔽(隐藏)掉了(如果可以强制类型转换而引用的话,应该是这样的吧),还是就没有了那些入口(内存中释放了那些入口地址的空间,这样就不能够强制类型转换了)? 我上述的理解对吗? 谢谢! --------------------------------------------------------------------------------- 你首先要搞清楚a是一个A指针,new AB1()得到一个AB1()实例,a指向这个实例。所以内存中有整个完整的AB1()实例,但是因为a是A的指针,所以只能调用A中规定的方法。也可以理解为A接口屏蔽掉了AB1()中的其他方法。接口的其中之一作用就是屏蔽那些不想让用户调用的方法。
Enumeration e=v.elements();你是否可以这样想?public interface I{}public class C{
public I Is(){
return new I(){};
}
}C c = new C();
I i = c.Is();
我是说一个抽象类或接口声明的数组,其元素可否为其不同子类的对象(像 C++ 一样)?interface A
{ A_m(); }interface B
{ B_m(); }class AB1 implements A,B
{
AB1(){};
... //接口中方法的实现
}class AB2 implements A,B
{
AB2(){};
... //接口中方法的实现
}...
A a=new AB1();
B b=new AB1();
A aa[2];
aa[0]=new AB1();
aa[1]=new AB2();
a.A_m(); a.B_m();
b.A_m(); b.B_m();
...
//上述语句有错误吗?如果把接口改成抽象类呢?接口和抽象类是不是具有同样的用法呢?
还有:
A a=new AB1();不属于类型转换的一种吧?
那a不能调用B_m()方法,但对象a中一定包含了B_m()的入口吧,这样说来,是不是说就是把a中实现的非A接口的方法的入口给屏蔽(隐藏)掉了(如果可以强制类型转换而引用的话,应该是这样的吧),还是就没有了那些入口(内存中释放了那些入口地址的空间,这样就不能够强制类型转换了)?
我上述的理解对吗?
谢谢!
public I Is(){
return new I(){};
}
}C c = new C();
I i = c.Is();接口不能构造对象的,它连构造方法都没有!
如果I是类的话,我就不会提出这个问题了!
-------------------------------------------------------------------------------
Enumeration e=v.elements();
v 返回的是一个实现了Enumeration接口的内部类!
还有:
A a=new AB1();不属于类型转换的一种吧?
那a不能调用B_m()方法,但对象a中一定包含了B_m()的入口吧,这样说来,是不是说就是把a中实现的非A接口的方法的入口给屏蔽(隐藏)掉了(如果可以强制类型转换而引用的话,应该是这样的吧),还是就没有了那些入口(内存中释放了那些入口地址的空间,这样就不能够强制类型转换了)?
我上述的理解对吗?
谢谢!
---------------------------------------------------------------------------------
你首先要搞清楚a是一个A指针,new AB1()得到一个AB1()实例,a指向这个实例。所以内存中有整个完整的AB1()实例,但是因为a是A的指针,所以只能调用A中规定的方法。也可以理解为A接口屏蔽掉了AB1()中的其他方法。接口的其中之一作用就是屏蔽那些不想让用户调用的方法。
****************************************************
a是一个引用,而不是指针,虽然没有多大的区别.其他的不错.
赞成大胃的话.
aa[0]=new AB1();
aa[1]=new AB2();即一个抽象类或接口声明的数组,其元素可否为其不同子类的对象(像 C++ 一样)?
to JavaVsNet(JavaVsNet):“接口的其中之一作用就是屏蔽那些不想让用户调用的方法。”
抽象类是不是也有同样的功能呢?在这个问题上是否和接口的用法相同?
A aa[2];
aa[0]=new AB1();
aa[1]=new AB2();
这个没有错,因为不管AB1还是2都是A第二个问题实际和第一个一样,返回的实际上是某一个实现了该接口的一个子类的实例,这样做主要为了扩展,这样即使以后这个方法需要返回其它的类型也不用修改和重新编译代码