java课后思考题(三)

1.以下代码为何无法通过编译?哪儿出错了?

 

       因为在Foo类中已经有了一个Foo类的有参构造函数,所以Foo类中已经不默认Foo()的无参构造函数,所以在new Foo()时无法调用构造函数。所以在无法通过译。可以再在Foo类中写一个无参构造函数,这样在new Foo()时,就可以通过编译。

2.使用上页幻灯片中定义的类,以下代码输出结果是什么?

 

结果截图:


        java字段初始化的规律:所有类的变量都默认初始化为null,比如String a,Integer b;数字类的原始数据类型默认初始化为0,比如int a,short b,char c;boolean 默认初始化为false。Java进行初始化的地方有两个:初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

3.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

结果截图:

所有的静态初始化块都优先执行,其次才是非静态的初始化块和构造函数,它们的执行顺序是:父类的静态初始化块>子类的静态初始化块>父类的初始化块>父类的构造函数>子类的初始化块>子类的构造函数.

4.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

public class A {

  public static void main(String[] args) {
    A a=new A();
    System.out.println("value="+a.AB());

  }
  static int AB() {
    A a=new A();
    int value=a.AC();
    return value;
  }
  int AC() {
    int value=1;
    return value;
  }

}

结果截图:

5.两对整数明明完全一样,为何一个输出true,一个输出false?

原因:

       java在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。i1和j1的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i2和j2则是分别指向不同的对象。"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。

 

posted @ 2017-10-19 00:11  我是一个粉刷匠^~^  阅读(185)  评论(0编辑  收藏  举报