为了账号安全,请及时绑定邮箱和手机立即绑定

Java继承是超级内容复制?

Java继承是超级内容复制?

噜噜哒 2021-12-22 16:05:49
我真的很想了解继承是如何工作的,假设我们有类 A 和 B,B 扩展了 A,A 包含一些在公共和方法上设置的属性(引用类型和原始类型)这些属性和方法是否复制到 B 类中?我确实读过方法没有被复制,而是通过引用访问。当我们创建 B 的实例时继承的引用类型属性如何?他们必须在内存中占用一些空间,该引用存储在哪里?在 A 类或 B 类?那么原始类型是否会被复制到 B 类中,并且它们是否与 B 的其他属性位于同一位置?或者当你创建一个 B 类的对象时,你实际上创建了一个 A 和 B 的对象并且它们保持某种关系?一些解释会有所帮助。
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

假设有一个 Animal 类:


public class Animal {

    private String _name;


    public Animal(String name) { _name = name;}


    public String getName() {return _name;}

}

现在有一个 Dog 类:


public class Dog extends Animal {

    public Dog() {

        super("Dog");

    }

}

现在,如果你这样做:


 Animal dog = new Dog();

 System.out.println(dog.getName());

这就是您如何使变量名从Dog类到Animal.


查看完整回答
反对 回复 2021-12-22
?
撒科打诨

TA贡献1934条经验 获得超2个赞

Java继承是超级内容复制?


我真的很想了解继承是如何工作的,


假设我们有类 A 和 B,B 扩展了 A,A 包含一些在公共和方法上设置的属性(引用类型和原始类型)


这些属性和方法是否复制到 B 类中?



公共属性和方法由子类继承B。考虑类A及其子类B:


public class A {


    public int aNumber = 99;

    public StringBuilder aString = new StringBuilder("sb");

    private String privateVar = "private stuff";


    public A() {

    }


    public A(int i, StringBuilder s) {

        aNumber = i;

        aString = s;

    }


    public int getMyNumber() {

        return aNumber*2;

    }

    public StringBuilder getMyString() {

        return aString.append("!!");

    }

    @Override

    public String toString() {

        return aNumber + " : " + aString;

    }

}


public class B extends A {


    public B() {

    }


    public B(int i, StringBuilder s) {

        super(i, s);

    }

}


下面的类有一些代码来测试上面两个类的行为,在继承方面:


public class TestingInheritance {

    public static void main(String [] args) {


        A a = new A(3, new StringBuilder("test1"));

        System.out.println("A: " + a);


        B b = new B();

        System.out.println("b: " + b);

        System.out.println("b.aNumber: " + b.aNumber);

        System.out.println("b.getMyNumber: " + b.getMyNumber());

        System.out.println("");


        B b2 = new B(2, new StringBuilder("xx"));

        System.out.println("b2: " + b2);

        System.out.println("b2.aString: " + b2.aString);

        System.out.println("b2.getMyString: " + b2.getMyString());


        //System.out.println("Private: " + b.privateVar);

    }

}


输出:


A: 3 : test1

b: 99 : sb

b.aNumber: 99

b.getMyNumber: 198


b2: 2 : xx

b2.aString: xx

b2.getMyString: xx!!


讨论:


有两个类A和B。该类B扩展A. A是超类,B是它的子类。这两个类各有两个构造函数——一个是默认的无参数构造函数和一个带参数的构造函数。


该类A具有原始类型和引用类型的公共属性:int aNumber和java.lang.StringBuilder aString。有公共的方法getMyNumber,getMyString以及java.lang.Object类的重写toString。注意还有一个私有变量privateVar。


代码详情来自TestingInheritance:



(我认为:


B b = new B();

这构造了 的一个实例B。这继承了其超类的属性和方法A。


System.out.println("b: " + b); // b: 99 : sb

新创建的对象b具有从其超类继承的属性值A;因此它从其重写的toString方法打印属性默认值。请注意在类中A为属性定义的默认值是99和一个StringBuilder带有字符串值“sb”的对象。


下面A使用默认属性值打印来自继承的属性和方法结果。


System.out.println("b.aNumber: " + b.aNumber); // 99

System.out.println("b.getMyNumber: " + b.getMyNumber()); // 198


(ii) 考虑:


B b2 = new B(2, new StringBuilder("xx"));

这将B使用提供的参数构造一个实例:2和new StringBuilder("xx")。请注意类B的构造函数中的语句super(i, s);这是必需的。而且,如果未指定,则会出现编译时错误。


System.out.println("b2: " + b2); // 2 : xx

这将打印在所提供的参数值B类的构造函数,后者又传给A类的构造函数参数:super(i, s)。当B创建类的实例(使用构造函数)时,A类的构造函数运行,首先- 查看super(...)语句(它是构造函数代码中的第一个语句)。


下面打印继承的属性值和方法返回值。


System.out.println("b2.aString: " + b2.aString); // xx

System.out.println("b2.getMyString: " + b2.getMyString()); // xx!!


(iii) 最后,以下语句如果没有注释程序TestingInheritance将无法编译。会出现错误:TestingInheritance.java:18: error: privateVar has private access in A。


System.out.println("Private: " + b.privateVar);

但是,可以B通过 class 中定义的公共方法访问私有属性A。


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号