有关super的问题?求大佬解答

SuperMonkey3306 2020-04-21 08:19:46
super()调用的是父类的构造方法,实现有子必先有父的概念。但是构造方法的作用就是创建对象和实例变量初始化,那为什么说在创建子类对象时,只有子类的一个对象呢?求解,感谢大佬们!!!!
...全文
140 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
addHao 2020-05-16
  • 打赏
  • 举报
回复
说老实话,刚开始我也是认为调用构造器就是创造对象。而子类既然调用了父类的构造器,子类就拥有了父类的对象。但是这里面就牵扯到另一个问题!在java中怎么创造对象?答案是我们都知道的,创造对象需要用new关键字来创造一个类的实例化对象,而且在创造对象的过程中会调用类的构造器,在这里很多人就掉入了一个陷阱——调用构造器就是创造对象。但事实真的是这样吗?产生这种误解还有另一种理解,就是书中把this关键在看作对象,而this的功能与this很像,所以进一步推出super是对象,而子类中创造一一个父类的对象。在这里我就直接给出答案:子类在创造对象时确实调用了父类的构造器,但是构造器的作用只是在堆中创造空间给属性和方法初始化,而这个空间就在子类new的空间里,所以子类包含着父类的属性和方法。 在这里this可以赋值给一个变量,而super不行。
捏造的信仰 2020-05-14
  • 打赏
  • 举报
回复
只会有一个对象被创建出来,但这个对象既包含了子类的属性和方法,又包含了父类的属性和方法。换个角度打比方就是,A 类对象有 10 个属性,其中 5 个在 A 类,5 个在它的父类 B 类。
android_cai_niao 2020-05-11
  • 打赏
  • 举报
回复
气死我了,上才艺!!

    static class Parent {
        public void print() {
            System.out.println("父类");
        }
    }

    static class Child extends Parent {
        @Override
        public void print() {
            System.out.println("子类");
        }
    }
如上示例代码,你可以认为Child拥有两个print()方法,一个是从父类中继承过来的,一个是覆盖的,用代码模仿如下:

    static class Child extends Parent {
		// 从父类继承过来的
        public void print() { 
            System.out.println("父类");
        }
        
		// 子类覆盖的
        @Override
        public void print() {
            System.out.println("子类");
        }
    }
当我们new Child()时,只会生成一个Child对象,并不会有Parent对象,当我们调用Child对象的pint方法时,走的是覆盖的print(),当你调用super.print()时,则走的是从父类继承过来的print(),也就是说可以认为Child中有两个print方法,一个是从父类继承过来的,一个是覆盖的,示例代码如下:

    static class Child extends Parent {
        @Override
        public void print() {
            super.print();
            System.out.println("子类");
        }
    }


    public static void main(String[] args) {
        new Child().print();
        // 输出:父类   子类
    }
如果我的答案帮助到了你,请结贴给点积分,谢谢^_^
sotondolphin 2020-04-22
  • 打赏
  • 举报
回复
调用父类的构造器只是帮助子类完成继承过来的变量的初始化,并没有创造父类的实例。只有用的 new 关键字的时候才会生成一个类的实例。 在同一个类里用this() 调用重载的构造器的原理和调用父类super()的原理非常类似。
kse_music 2020-04-22
  • 打赏
  • 举报
回复
在创建子类对象时,会把父类里的成员变量和方法也加载进内存(因为要加载进内存,所以要看下这些数据是怎么初始化的,所以调用了父类的构造,仅此而已,并不是去创建了父类对象),然后用this和super这两个引用来区分是父类的还是子类的,但是这个内存区域是子类的内存区域,绝不是父类的 this指向了不仅父类可继承的成员变量和可继承的方法外,它还指向了子类的成员变量和方法 而super仅仅只是指向了子类对象中从父类继承的成员变量和方法

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧