java面试题(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38158541/article/details/85337266

1、下列程序的运行结果

1

2

3

4

5

6

7

8

9

10

11

12

public static void main(String args[]) {

    Thread t = new Thread() {

        public void run() {

            pong();

        }

    };

    t.run();

    System.out.print("ping");

}

static void pong() {

    System.out.print("pong");

}

A、pingpong
B、pongping
C、pingpong和pongping都有可能
D、都不输出

答案是B

该题考察的是线程的启动。

在第7行的时候,调用的是t.run();方法,之间调用run方法就是普通的方法调用而已,所以肯定是先执行pong()再执行System.out.print("ping");

如果第7行换成t.start()方法,答案就应该选择c,因为t.start()后,线程变为就绪状态,什么时候开始执行时不确定的,可能是主程序先继续执行,也可能是新线程先执行。

2、以下描述错误的一项是( )?

A、程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行  到了第几行,是线程隔离的
B、原则上讲,所有的对象都是在堆区上分配内存,是线程之间共享的
C、方法区用于存储JVM加载的类信息、常量、静态变量,即使编译器编译后的代码等数据,是线程隔离的
D、Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

  • 栈区:
  1. 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中
  2. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  3. 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
  • 堆区:
  1. 存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。
  2. jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。
  • 方法区:
  1. 又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区和堆内存是线程共享的。

程序计数器、虚拟机栈是线程隔离的。

3、下面的方法,当输入为2的时候返回值是多少?

public static int getValue(int i) {
        int result = 0;
        switch (i) {
        case 1:
            result = result + i;
        case 2:
            result = result + i * 2;
        case 3:
            result = result + i * 3;
        }
        return result;
}
A、0
B、2
C、4
D、10

答案是D

要注意的是 switch结构中没有break的话,匹配完不会跳出,会继续匹配下一个case直到整个结构结束

所以:case 2结束时result=4;

          case3结束时result=10;

4、已知有下列Test类的说明,则下列哪个语句是正确的?()

public class Test

{

private float f = 1.0f;

int m = 12;

static int n = 1;

public static void main (String args[])

{

Test t = new Test();

}

}

A、t.f;
B、this.n;
C、Test.m
D、Test.f

答案是A

A的答案中变量虽然为private,但因为main函数在该类中,所以即使private也仍可使用,B的答案static变量不能使用this

(1)类变量的调用:(1)静态、非静态方法中,可以直接调用。

(2)成员变量的调用有2种方法:(1)非静态方法中,可以通过this关键字直接调用。因为成员变量的初始化时间先于类的构造函数执行前,自然保证了成员变量已经被赋值。(2)静态方法中,先实例化类,利用实例化类的引用才能调用。

(3)this关键字:(1)不能在静态方法中使用。this是指向对象的的引用,而静态方法在类加载的时候创建加载,此时没有创建对象。 B错误

(4)m 和 f 都是普通成员属性,而 “类名.” 方式只能调用 静态成员属性,C、D错误

5、下面赋值语句中正确的是()

A、double d=5.3e12;
B、float f=11.1;
C、int i=0.0;
D、Double oD=3;

答案是A

java中整型默认的是int,浮点默认的是double.

B: double类型的11.1 转成 float,是需要强制转换的

C: double类型的0.0 转成 int,也是需要强制转换的

D: int 转为 封装类型Double,是无法编译的,Double是基本类的封装类,不可直接赋值

    Double oD = 3.0, 会把double类型的3.0自动装箱为Double,没有问题.

6、URL u =new URL("http://www.123.com");。如果www.123.com不存在,则返回______。

A、http://www.123.com
B、””
C、null
D、抛出异常

答案是A

我们在执行URL u =new URL("http://www.123.com");这句话的时候确实要抛出异常,但是这个异常属于IOException,不管网址是否存在,最后都会返回该网址的一个连接,打印出来就是该网址。

new URL()时必须捕获检查异常,但这个异常是由于字符串格式和URL不符导致的,与网址是否存在无关。URL的toString方法返回字符串,无论网址是否存在。

猜你喜欢

转载自blog.csdn.net/weixin_38158541/article/details/85337266
今日推荐