所谓多态,是把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,但子类实例的本身类型没有改变;如:
A x = new B();
这里虽然是声明了一个 A 类型变量,但 x 的值仍然是指向一个B类型,也就是说xsave()是直接调用 B 类对象的save方法,并没有通过其他方式,它本身就是B类型对象,你可以打印信息 println(xgetClass()) ,它输出的是 B 类而不是 A 类。
在父类中能获取子类的属性吗?一般情况下是不行的,因为孩子尚未出世哪里来的属性。但有时需要在父类处理该类(包含子类)的所有属性,该怎么做呢,有种方法能解决——在父类中将子类的实例引用进来。假设BaseClass是基类,有个getAll方法用以获取该类的所有属性。SubClass继承子BaseClass,SSClass继承自SubClass,SSClass的实例调用getAll方法时获取SSClass及其父类的所有属性。具体做法如下:
import javalangreflectField;
public class BaseClass {
private String a;
private int b;
// public BaseClass() {
// bc = setBC();
// }
private final BaseClass bc = setBC();
private BaseClass setBC() {
return this;
}
public void getAll() {
Class clazz = thisbcgetClass();
do {
Field[] fields = clazzgetDeclaredFields();
for (Field f : fields) {
Systemoutprintln(fgetName());
}
clazz = clazzgetSuperclass();
} while (clazz != Objectclass);
}
}
这里BaseClass bc就是子类的引用,构造子类SubClass或SSClass实例时,调用setBC方法将子类的引用获得。setBC中return this这里的this是子类的实例,不是父类的。setBC也可以在父类构造函数中调用,效果是一样的,如上面代码的注释块。
子类就不用关心任何事了,不管它是否有自己的构造方法:
public class SubClass extends BaseClass {
@ShareObject
private boolean c;
}
public class SSClass extends SubClass {
private String ss;
public SSClass(int i) {
ss = "";
}
}
测试:
@Test public void get() {
SSClass sc = new SSClass(1);
scgetAll();
}
输出内容:
ss
c
a
b
bc
以上就是关于java怎么根据接口找到所有的实现类全部的内容,包括:java怎么根据接口找到所有的实现类、Java 子类继承父类,子类重写父类方法,这种情况下父类可以获取到子类的数据吗、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)