java每日一练(19_03_24)

名人名言

昨日翻译

Cunning proceeds from want of capacity.

狡诈出自能力的缺乏。

今日名言

It is never too late to mend.

2019.03.23问题及解析

public class ExtendTest {
    public static void main(String[] args) {
        System.out.println(new Son().getNumber());
    }


    static class Father{
        private int number;
        private Father(int num){
            setNumber(num);
        }
        public void setNumber(int num){
            this.number = num;
        }
        int getNumber(){
            try{
                number++;
                return number;
            }catch (Exception e){
                System.out.println(e.toString());
            }finally {
                this.setNumber(number);
                System.out.println(number);
            }
            return number;
        }
    }


    static class Son extends Father{
        Son(){
            super(10);
            setNumber(getNumber() - 3);
        }


        public void setNumber(int number){
            super.setNumber(2 * number);
        }
    }
}

请问上述程序会输出什么?为什么?

答案与解析

代码流程

首先我们看到了main函数,直接进行了打印,new了一个Son对象,并且调用了它的getNumber()方法。

既然实例化对象那么首先我们就一定会调用它的构造方法,我们一起转到Son的无参构造方法,首先第一个语句调用父类的有参构造方法并且传递了参数值10。

那么再来看父类的有参构造方法,调用了setNumber(num)方法,因为子类重写了父类的setNumber(num)方法,因此不会直接调用父类的这个方法,而是会调用子类的这个方法,子类的setNumber(num)方法中调用了父类的setNumber方法,并且将传进来的参数10乘2之后作为参数传递给父类的setNumber。

那么我回来到了父类的setNumber方法,给我们的成员变量number进行赋值,传进来的参数是20,所以目前成员变量number的值时20

到这里我们子类构造方法的第一句语句才执行完毕,下面看第二句语句,调用getNumber方法之后-3之后再调用setNumber方法。先看到子类中并没有getNumber方法,因此会去调用父类的getNumber方法。

getNumbet方法首先对成员变量number自增1,之后返回,也就是getNumber方法返回了之前的20+1=21也就是21出去,但是try catch语句中还有finally语句需要执行。

finally语句中首先通过this.setNumber调用setNumber方法,同样调用的是子类的setNumber方法,因此将21*2得到42,赋值给number,之后打印出number,因此输出了第一行数字42换行

之前将21返回回来之后,21-3=18,再次调用setNumber方法,先18*2=36,再次赋值给number,此时number的值为36。

终于执行完了Son的构造方法,我们接下来调用getNumber方法,同样子类中没有这个方法,需要到父类中进行调用,调用方式与之前一致,只不过此时的初始值变成了36

所以反回了37,同时打印74换行。

返回37之后,执行我们main函数中的打印语句,将37打印出来。

输出结果

综上所述,最终的输出结果为:

42

74

37

2019.03.24问题

是不是昨天题目出的比较难呀?都看不到小伙伴们留言了,希望大家对题目难易很想要学习练习的题目也可以发在留言中与我交流。我尽量满足大多数人的需要,今天题目就先下降些难度再来缓冲一下吧。

public class IntegerTest {
    public static void main(String[] args) {
        Integer num1 = new Integer(1);
        Integer num2 = num1;
        changeNumber(num2);
        System.out.println(num1.intValue());
        System.out.println(num1 == num2);
    }


    private static void changeNumber(Integer integer){
        integer = new Integer(2);
    }
}


请问上述程序的输出结果是什么?

往期回顾

java每日一练(19_03_23)     (程序的输出结果)

java每日一练(19_03_22)   (数据库)

java每日一练(19_03_21) (JDBC驱动包)

java每日一练(19_03_20)    (连接数据库)

java每日一练(19_03_19)      (代码能否执行)

java每日一练(19_03_18)  (showType(i)方法)

java每日一练(19_03_17)   (mysql安装)

java每日一练(19_03_16)   (springboot框架)

java每日一练(19_03_15)  (多线程问题)

java每日一练(19_03_14)  (程序的执行结果)

java每日一练(19_03_13)  (pom.xml文件)

java每日一练(19_03_12)  (输出结果)

java每日一练(19_03_11)  (程序的输出结果)

加入我们吧~

眼过千遍,不如手过一遍,一定一定要把自己的想法写出来(想法不论对错,写你所想就是进步),这样才会有所收获,你的每一个留言和分享小刀都会认真回复,彼此学习共同进步~

小刀和小伙伴在学习群里等你来一起监督学习哦,坚持!加油!进群请加小刀微信: best396975802

感谢所有在后台留言的小伙伴们,每一分的付出都会收到回报,你们都是最棒的哦!

END


微信群请点击公众号菜单进微信群

文字|天堂

排版|花音

你点的每个在看,我都认真当成了喜欢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值