首页 新闻 会员 周边

Java继承中的加载顺序问题!大神快来

0
悬赏园豆:20 [已解决问题] 解决于 2017-02-20 22:29

[code=java]    public class test1 {  

         static class a {
            int x = 999;
            int y = 999;
            {
                System.out.println("a--父类非静态方法");
            }
            static {
                System.out.println("a--父类静态方法");
            }
            public a() {
                System.out.println("a--执行a类无参构造方法");
                print();
            }
            public a(int x) {
                System.out.println("a--执行父类有参构造方法");
            }
            public void print() {
                System.out.println("a--我是父类的打印方法");
            }
        }

        static class b extends a {
            int x = 1;
            int y;
            {
                System.out.println("b--子类非静态方法");
            }
            static {
                System.out.println("b--子类静态方法");
            }
            public b() {
                System.out.println("b--执行b类无参构造方法");
                //y = -1;
            }
            public b(int x) {
                System.out.println("b--执行子类有参构造方法");
            }
            public void print() {
                System.out.println("b--在子类中调用父类的super方法");
                super.print();
                System.out.println("b--我是子类的打印方法");
            }
        }


        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int x = 0;
            new b(x);
            //a.print();
        }

    }
[/code]

[img=http://img.bbs.csdn.net/upload/201702/20/1487586057_405102.jpg][/img]

为什么创建一个有参数的子类对象时,一定要调用到父类的无参数构造方法?
当我把父类的无参数构造方法去掉时,编译器会报错,除了添加父类无参数构造方法解决,好像还可以用super这个解决,怎么解决?

弃用博客的主页 弃用博客 | 初学一级 | 园豆:102
提问于:2017-02-20 18:26
< >
分享
最佳答案
0

为了保证正确初始化,Java 会自动在子类的构造方法插入对基类构造方法的调用,如果父类没有无参的构造方法,那么就必须显示的使用 super 关键字调用父类的构造方法,并配以适当的参数列表,如 super(xxx)。

print是public的,子类重写了,这是多态的表现。如果你把父类中的改为private会有不同的输出。

收获园豆:20
创心coder | 小虾三级 |园豆:736 | 2017-02-20 20:14
    public class test1 {

         static class a {
            int x = 999;
            int y = 999;
            {
                System.out.println("a--父类非静态方法");
            }
            static {
                System.out.println("a--父类静态方法");
            }
            // public a() {
            //     System.out.println("a--执行a类无参构造方法");
            //     print();
            // }
            public a(int x) {
                System.out.println("a--执行父类有参构造方法");
            }
            public void print() {
                System.out.println("a--我是父类的打印方法");
            }
        }

        static class b extends a {
            int x = 1;
            int y;
            {
                System.out.println("b--子类非静态方法");
            }
            static {
                System.out.println("b--子类静态方法");
            }
            public b() {
                System.out.println("b--执行b类无参构造方法");
                //y = -1;
            }
            public b(int x) {
                super(1);
                //不写是默认生成的super(),无参数的
                System.out.println("b--执行子类有参构造方法");
            }
            public void print() {
                System.out.println("b--在子类中调用父类的super方法");
                super.print();
                System.out.println("b--我是子类的打印方法");
            }
        }


        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int x = 0;
            // a a1 = new a(x);
            // a1.print();
            System.out.println();
            b b1 = new b(x);

            // a.print();
        }

    }

我现在创建的子类有参对象,然后在子类构造super(1)声明的是调用父类的有参构造,我把父类的无参构造注释了之后,为什么还是会报错

弃用博客 | 园豆:102 (初学一级) | 2017-02-20 20:21

@Z·Lawliet: public b() { b类无参构造方法,也得加一个super(int)},子类构造方法默认调用父类无参构造方法

创心coder | 园豆:736 (小虾三级) | 2017-02-20 20:25

@创心coder: 我创建的是有参的对象啊,构造方法不是只在创建对象的时候才会被调用吗,子类b的无参构造方法并没有被调用啊

弃用博客 | 园豆:102 (初学一级) | 2017-02-20 20:46

@Z·Lawliet: 报什么错误?上面那个编译就通不过吧

创心coder | 园豆:736 (小虾三级) | 2017-02-20 20:48

@创心coder: 是 编译没有过

弃用博客 | 园豆:102 (初学一级) | 2017-02-20 20:49

@Z·Lawliet: public b(){super(0);}加一句话。

创心coder | 园豆:736 (小虾三级) | 2017-02-20 21:01

@创心coder: 我知道  但是这个构造方法都没用到啊 我弄得打印调试语句说明这句话都没加载 函数都没有用到 还是报错吗

弃用博客 | 园豆:102 (初学一级) | 2017-02-20 21:14

@Z·Lawliet: 编译器按照Java语言的规范把源码编译成字节码文件,然后JVM加载这个类,初始化等一系列操作调用它的main方法。所以说编译的时候会检查你的语法是否正确,不是说不用就检查了,编译时能发现的错误,不会拖延到运行时才知道。

创心coder | 园豆:736 (小虾三级) | 2017-02-20 21:58

@Z·Lawliet: 最好用一个集成开发环境,比如eclipse,发现错误比较及时

创心coder | 园豆:736 (小虾三级) | 2017-02-20 22:02

@创心coder: 哦哦 谢谢

弃用博客 | 园豆:102 (初学一级) | 2017-02-20 22:28
其他回答(1)
0

你好,这个除了增加父类无参构造方法外,可以增加父类的有参数构造方法然后用super(加参数)调用,因为 在子类初始化的时候 子类的无参构造方法都会隐含着一个super()就是调用了父类的构造器。子类必须调用父类其中一个构造器。初始化父类

菩提丿树灬 | 园豆:206 (菜鸟二级) | 2017-02-20 18:42

在a的无参构造方法中的print()为什么会调用子类的print方法

支持(0) 反对(0) 弃用博客 | 园豆:102 (初学一级) | 2017-02-20 19:12

我这个new的是子类的有参对象啊,不会用到子类的无参构造方法吧

支持(0) 反对(0) 弃用博客 | 园豆:102 (初学一级) | 2017-02-20 19:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册