黑马程序员技术交流社区

标题: 承载执行流程问题 [打印本页]

作者: 额滴神啊    时间: 2016-7-7 23:06
标题: 承载执行流程问题
今天课上老师讲了一个例子,对执行流程还不是很清楚,特来请各位大神解惑!题目如下:
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 有参构造");
        }
}
请问这个程序是怎么执行的,依次会输出什么!




作者: 额滴神啊    时间: 2016-7-7 23:09
有没有大神来分析一波,这个问题有点迷茫呀!
作者: xukaihong    时间: 2016-7-7 23:10
这都不懂,自己百度
作者: 额滴神啊    时间: 2016-7-7 23:13
xukaihong 发表于 2016-7-7 23:10
这都不懂,自己百度

大兄弟 这个百度有点困难啊!
作者: 18072555282    时间: 2016-7-7 23:18
我只记得有这个         
public Son() {
     super();
    // 本类构造代码块
    构造方法语句;
}
也不知道对不对.
作者: 额滴神啊    时间: 2016-7-7 23:21
18072555282 发表于 2016-7-7 23:18
我只记得有这个         
public Son() {
     super();

这个  这个   不能解决实际问题啊
作者: 18072555282    时间: 2016-7-7 23:32
额滴神啊 发表于 2016-7-7 23:21
这个  这个   不能解决实际问题啊

它说的是子类中的构造方法先要访问父类的构造方法,所以父类的构造代码块会先执行然后再执行父类构造方法,回头再执行子类的构造代码块然后执行子类的构造方法语句
作者: 额滴神啊    时间: 2016-7-7 23:57
18072555282 发表于 2016-7-7 23:32
它说的是子类中的构造方法先要访问父类的构造方法,所以父类的构造代码块会先执行然后再执行父类构造方法, ...

那我自己在看看
作者: ylca    时间: 2016-7-8 02:56
本帖最后由 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(带参) ->自己看要调用什么          //这个的看你是否要调用父类咯






作者: 额滴神啊    时间: 2016-7-8 23:24
ylca 发表于 2016-7-8 02:56
看你创建对象的时候是有参还是无参   无参则调用无参构造  如果有参 则调用有参构造 而这个代码中
Son方 ...

多谢大神的分析 Son s1 = new Son();   也就是说访问里面的this语句 ,然后找本来的有参构造,再返回父类的有参构造,输出 Father 有参构造 再接着输出 son 有参构造 这个顺序吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2