java如何继承两个类

java如何继承两个类,第1张

一个类不能直接继承多个类,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中子类继承父类时获得父类成员继承规则是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9750366.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存