牛客网刷Java记录第一天

打印 上一主题 下一主题

主题 927|帖子 927|积分 2781

第一题
下列程序输出啥?
  1. public class StringDemo{
  2.   private static final String MESSAGE="taobao";
  3.   public static void main(String [] args) {
  4.     String a ="tao"+"bao";
  5.     String b="tao";
  6.     String c="bao";
  7.     System.out.println(a==MESSAGE);
  8.     System.out.println((b+c)==MESSAGE);
  9.   }
  10. }
复制代码
解析:
做这道题之前,需要明白三个知识点:

  • ==符号比较引用类型时,比较的是双方的地址。
  • String s = "xxx"或者,String s = "xxx" + "yyy",这种创建String类型变量的情况,都是把变量存到常量池中。
  • new 类名()会在堆中创建一个对象,堆中地址当然和常量池的地址不一样。两个一模一样的玩具,一个在客厅,一个在卧室。
我在做这道题的时候,在想这样一个问题:静态常量的字符串也是存在常量池中的吗?通过在idea中debug,验证了我的猜想:静态常量的字符串也是存在常量池中的。
于是,a==MESSAGE就是对的。
那么,b+c==MESSAGE呢?通过追踪源码可知,因为b+c是变量相加,所以在底层会创建一个StringBuilder类型的变量来存储b+c的结果,存好之后,又转换为String类型,这个String类型是由StringBuilder转化过来的,但是地址还是在堆中,所以它的地址也就和MESSAGE不同,那么结果也就是false。
答案:
true false
第二题
下列程序输出啥
  1. class Test {
  2.     public static void main(String[] args) {
  3.         System.out.println(new B().getValue());
  4.     }
  5.     static class A {
  6.         protected int value;
  7.         public A(int v) {
  8.             setValue(v);
  9.         }
  10.         public void setValue(int value) {
  11.             this.value = value;
  12.         }
  13.         public int getValue() {
  14.             try {
  15.                 value++;
  16.                 return value;
  17.             } finally {
  18.                 this.setValue(value);
  19.                 System.out.println(value);
  20.             }
  21.         }
  22.     }
  23.     static class B extends A {
  24.         public B() {
  25.             super(5);
  26.             setValue(getValue() - 3);
  27.         }
  28.         public void setValue(int value) {
  29.             super.setValue(2 * value);
  30.         }
  31.     }
  32. }
复制代码
解析:
这题考察try-catch和多态的动态绑定机制,还涉及了一点静态内部类。
必备知识:

  • 学会idea的debug功能
  • try-catch中如果有return语句


    • finally没有返回值,先把return的值保存起来。执行完finally后,执行return,返回的是保存起来的值,而不是finally中改变的值!



    • finally有返回值,会覆盖掉try-catch中的return语句。

  • 执行一个对象的方法时,是看这个对象的运行类型,啥是运行类型?就是new一个对象时,new后面那个类型。如果这个运行类型的类中没有调用的方法,就一层一层地去父类中找。如果用super.方法名(),那么直接去父类中找方法。再提一嘴,方法名()等价于this.方法名()。this是啥?就是程序当前执行的方法的调用者
回到题目,这道题用语言来描述会有点麻烦,大家可以了解一下我前面所说的必备知识,然后自己思考一下执行流程,一定要在idea中debug一下,只需要在main方法中打一个断点即可,看看整个程序的执行流程,以后再遇到类似的题目,基本没啥问题。
答案:
22 34 17

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表