
一个类不能直接继承多个类,java是单继承语言。
比如说这样:class A extends B,C 不能这样写,因为java不支持多继承。
但是可以像下面这样实现继承多个类:class A extends B,class C extends A,这样C就同时继承了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
权限public > 包(package,默认,也就是什么权限修饰符都不加) > proteced > private
子类继承了父类的所有成员(这样说实际是不对的),但只能访问父类的非private成员。你可以认为子类持有一个名为supper的父类实例。
当父类和子类方法发生覆盖式,子类可以显式地用supper调用父类的同名方法。
//父类
public class Futher {
public static String _CN = FutherclassgetName();
public Futher(){
Systemoutprintln(_CN + " - public Futher()" );
}
public Futher(int i){
thisprivateInt = i;
Systemoutprintln(_CN + " - public Futher(int " + i + ")");
}
private void privateMethod(){}
protected void protectedMethod(){}
public void publicMethod(){}
void packageMethod(){}
private int privateInt = 0;
protected int getPrivatInt(){
Systemoutprintln(_CN + " - privateInt:" + privateInt);
return privateInt;
}
}
//子类
public class Son extends Futher{
public static String _CN = SonclassgetName();
public Son(){
Systemoutprintln(_CN + " - public Son()");
}
public Son(int i){
super(i);
Systemoutprintln(_CN + " - public Son(int " + i + ")");
}
public static void main(String[] args){
Son son = new Son();
sonpackageMethod();
sonpublicMethod();
sonprotectedMethod();
int futherPrivateInt = songetPrivatInt();
Son son2 = new Son(futherPrivateInt + 1);
}
}
经验证分别 输出11和110 并不是你说的都是11
都是980是因为,两次的计算其实都是调用B的f方法,尽管向上引用为A,java在真正执行的时候会动态的获取真正的对象,所以两次都是980
只属于为什么是9,因为静态方法是通过类名调用的,也就是说方法属于类而不是对象,所以
A a=new B() 的时候 ag(3) 其实是调用了Ag(3),
如果你使用Bg(3) 那么就会输出12
以上就是关于java如何继承两个类全部的内容,包括:java如何继承两个类、Java 子类继承父类,子类重写父类方法,这种情况下父类可以获取到子类的数据吗、java中子类继承父类时获得父类成员继承规则是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)