A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 额滴神啊 中级黑马   /  2016-7-7 23:06  /  645 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天课上老师讲了一个例子,对执行流程还不是很清楚,特来请各位大神解惑!题目如下:
class Extends {
        public static void main(String[] args) {
                Son s1 = new Son();
                System.out.println(s1.getName() + "..." + s1.getAge());
                System.out.println("--------------------");
                Son s2 = new Son("张三",23);
                System.out.println(s2.getName() + "..." + s2.getAge());
        }
}
class Father {
        private String name;                       
        private int age;                               

        public Father() {                               
                System.out.println("Father 空参构造");
        }

        public Father(String name,int age) {       
                this.name = name;
                this.age = age;
                System.out.println("Father 有参构造");
        }

        public void setName(String name) {       
                this.name = name;
        }

        public String getName() {               
                return name;
        }

        public void setAge(int age) {               
                this.age = age;
        }

        public int getAge() {                               
                return age;
        }
}

class Son extends Father {
        public Son() {                                               
                this("王五",25);                               
       
                System.out.println("Son 空参构造");
        }

        public Son(String name,int age) {       
                super(name,age);
                System.out.println("Son 有参构造");
        }
}
请问这个程序是怎么执行的,依次会输出什么!



9 个回复

倒序浏览
有没有大神来分析一波,这个问题有点迷茫呀!
回复 使用道具 举报
这都不懂,自己百度
回复 使用道具 举报
xukaihong 发表于 2016-7-7 23:10
这都不懂,自己百度

大兄弟 这个百度有点困难啊!
回复 使用道具 举报
我只记得有这个         
public Son() {
     super();
    // 本类构造代码块
    构造方法语句;
}
也不知道对不对.
回复 使用道具 举报
18072555282 发表于 2016-7-7 23:18
我只记得有这个         
public Son() {
     super();

这个  这个   不能解决实际问题啊
回复 使用道具 举报
额滴神啊 发表于 2016-7-7 23:21
这个  这个   不能解决实际问题啊

它说的是子类中的构造方法先要访问父类的构造方法,所以父类的构造代码块会先执行然后再执行父类构造方法,回头再执行子类的构造代码块然后执行子类的构造方法语句
回复 使用道具 举报
18072555282 发表于 2016-7-7 23:32
它说的是子类中的构造方法先要访问父类的构造方法,所以父类的构造代码块会先执行然后再执行父类构造方法, ...

那我自己在看看
回复 使用道具 举报
ylca 中级黑马 2016-7-8 02:56:36
9#
本帖最后由 ylca 于 2016-7-8 03:01 编辑

看你创建对象的时候是有参还是无参   无参则调用无参构造  如果有参 则调用有参构造 而这个代码中
Son方法 继承了Father 所有创建对象的时候 会先实例化 父类的无参构造 而你在无参this("王五","25") 这个会调用当前对象的带参构造 而当前带参构造你又调用了父类的带参构造  
Son s1 = new Son();   //创建对象    调用该对象无参构造  该对象无参调用了该对象带参构造  带参构造又调用了父类的带参构造     
System.out.println(s1.getName() + "..." + s1.getAge());
System.out.println("--------------------");
Son s2 = new Son("张三",23);//创建对象  调用该对象带参构造 然后调用父类带参构造
System.out.println(s2.getName() + "..." + s2.getAge());


代码里的顺序
Son() ->Son(带参) -> Father(带参)   //Son s1 = new Son();  
Son(带参) -> Father(带参)                //Son s2 = new Son("张三",23);
一般的顺序应该是
Son() ->Father()                              //不写this的情况下 系统默认调用父类对象的无参构造
Son(带参) ->自己看要调用什么          //这个的看你是否要调用父类咯





回复 使用道具 举报
ylca 发表于 2016-7-8 02:56
看你创建对象的时候是有参还是无参   无参则调用无参构造  如果有参 则调用有参构造 而这个代码中
Son方 ...

多谢大神的分析 Son s1 = new Son();   也就是说访问里面的this语句 ,然后找本来的有参构造,再返回父类的有参构造,输出 Father 有参构造 再接着输出 son 有参构造 这个顺序吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马