java学_1

题①、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 持有。

对于这句代码,可分为两个过程:

  1. jvm 首先在字符串常量池内里面看看找不找到字符串"xyz";找到,进入第二步;否则,创建新的 String 对象,并“放到”字符串常量池里面。
  2. 然后由于遇到了 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异常,一般情况下不自定义检查异常。

问题⑥关于内部类调用和初始化问题

1.class Enclosingone

2.{

3.    public class InsideOne {}

4.

5.}

6.public class inertest

7.{

8.    public static void main(string[]args)

9.    {

10.        EnclosingOne eo = new EnclosingOne();

11.        //insert code here

12.    }

13.

14.}

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

public class Enclosingone {

    //非静态内部类

    public class InsideOne {}

    //静态内部类

    public static class InsideTwo{}

}

 

class Mytest02{

    public static void main(String args []){

        Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非静态内部类对象

        Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//静态内部类对象

    }

}

内部类其实和类的属性没什么区别,只是在声明的时候必须是Outer.Inner a,就像int a 一样,至于静态内部类和非静态内部类new的时候有点区别,Outer.Inner a=new Outer().new Inner()(非静态,先有Outer对象才能有属性) Outer.Inner a=new Outer.Inner()要把Outer.Inner看成一部分,就像类变量一样

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑾怀轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值