题①、Java 语言用哪个类来把基本类型数据封装为对象? 包装类
解析: java的数据类型分为两大类:基本类型和引用类型;
基本类型只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能;
为了操作基本类型的数据,java也对它们进行了封装, 得到八个类,就是java中的基本类型的封装类;他们分别是:
八种基本类型: byte short int long float double char boolean
对应的包装类 : Byte Short Integer Long Float Double Character Boolean
题②、关于构造方法表述
解析:1.构造方法也是类的方法,可以在创建对象时为成员变量赋值
2.构造方法可以进行重载,但是参数列表必须不相同,不以返回值和访问级别进行区分
3.构造方法没有返回值
4.构造方法一定要与定义为public的类同名
5.构造方法不能被对象调用,只会创建对象,使用new关键字
题③Java语言中,如果"xyz"没有被创建过,String s =new String(“xyz”);创建了几个string object? 答案:2个
解析:类加载对一个类只会进行一次。
"xyz" 在类加载时就已经创建并驻留了(如果该类被加载之前已经有 "xyz" 字符串被驻留过则不需要重复创建用于驻留的"xyz"实例)。
驻留的字符串是放在全局共享的字符串常量池中的。
在 HotSpot VM 里实现的 string pool 功能的是一个 StringTable 类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身)
也就是说在堆中的某些字符串实例被这个 StringTable 引用之后就等同被赋予了”驻留字符串”的身份。
这个 StringTable 在每个 HotSpot VM 的实例只有一份,被所有的类共享。
在这段代码后续被运行的时候,"xyz" 字面量对应的 String 实例已经固定了(前面的类加载过程),不会再被重复创建。
所以这段代码将常量池中的对象复制一份放到 heap 中,并且把 heap 中的这个对象的引用交给 s1 持有。
对于这句代码,可分为两个过程:
- jvm 首先在字符串常量池内里面看看找不找到字符串"xyz";找到,进入第二步;否则,创建新的 String 对象,并“放到”字符串常量池里面。
- 然后由于遇到了 new,还会在堆创建 String 对象,其实是拷贝的常量池的那个,拷贝比创建大概快吧...最后将其返回给 s1。
将 new String("xyz")
拆分为 new String()
和 "xyz"
如果写在类方法里,请参考前面的类加载,就是相比之下提前驻留了吧。
题④String str1 = “abc”,“abc”分配在内存哪个区域? 答案:字符串常量区
解析:
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
非RAM存储:硬盘等永久存储空间
此题极为不严谨,答案与具体的JVM类型和具体的JVM版本都有关系。以下分析基于广泛使用的Oracle HotSpot虚拟机:
首先,String str1 = “abc” 编译为字节码后,实际上相当于:String str1 = “abc”.intern()
对于JDK 1.6,intern()方法是这样的:如果“abc”是首次遇到,则字符串“abc”本身会被复制到字符串常量池中,且以后如果再遇到“abc”,直接返回常量池的引用。注意,JDK 1.6的常量池存在于JVM的永久代中,而对于Hotspot虚拟机的实现,永久代事实上对应java虚拟机规范中的方法区!
对于JDK 1.7,intern()方法不会对字符串实例进行复制,而只是在字符串常量池中记录首次出现的实例引用。当然,最关键的是,JDK 1.7中的字符串常量池是在堆中的!
题⑤关于运行时异常
解析:
运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
问题⑥关于内部类调用和初始化问题
|
Which statement at line 11 constructs an instance of the inner class?
答案:InsideOne ei=eo.new InsideOne(); 或 EnclosingOne.InsideOne ei=eo.new InsideOne();
解析:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
内部类其实和类的属性没什么区别,只是在声明的时候必须是Outer.Inner a,就像int a 一样,至于静态内部类和非静态内部类new的时候有点区别,Outer.Inner a=new Outer().new Inner()(非静态,先有Outer对象才能有属性) Outer.Inner a=new Outer.Inner()要把Outer.Inner看成一部分,就像类变量一样