java面试题(4)

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

1、顺序执行下列程序语句后,则b的值是()

String a="Hello";

String b=a.substring(0,2);

答案是He

substring    方法将返回一个包含从    start    到最后(不包含    end    )的子字符串的字符串。

2、下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。

A、java.exe
B、javadoc.exe
C、jdb.exe
D、javaprof.exe

答案是C

java,exe是java虚拟机

javadoc.exe用来制作java文档

jdb.exe是java的调试器

javaprof,exe是剖析工具

3、下面代码的输出是什么?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class Base

{

    private String baseName = "base";

    public Base()

    {

        callName();

    }

    public void callName()

    {

        System. out. println(baseName);

    }

    static class Sub extends Base

    {

        private String baseName = "sub";

        public void callName()

        {

            System. out. println (baseName) ;

        }

    }

    public static void main(String[] args)

    {

        Base b = new Sub();

    }

}

A、null
B、sub
C、base

答案是A

 1)首先,需要明白类的加载顺序

(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)

(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )

(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )

(4) 父类构造函数

(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )

(6) 子类构造函数

其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)

2)其次,需要理解子类覆盖父类方法的问题,也就是方法重写实现多态问题。

Base b = new Sub();它为多态的一种表现形式,声明是Base,实现是Sub类, 理解为 b 编译时表现为Base类特性,运行时表现为Sub类特性。

当子类覆盖了父类的方法后,意思是父类的方法已经被重写,题中 父类初始化调用的方法为子类实现的方法,子类实现的方法中调用的baseName为子类中的私有属性。

由1)可知,此时只执行到步骤4.,子类非静态代码块和初始化步骤还没有到,子类中的baseName还没有被初始化。所以此时 baseName为空。 所以为null。

或者如下解释:

执行 Base b = new Sub();时由于多态 b编译时表现为Base类特性,运行时表现为Sub类特性,

Base b = new Sub();不管是哪种状态都会调用Base构造器执行 callName()方法;

执行方法时,由于多台表现为子类特性,所以会先在子类是否有 callName();

而此时子类尚未初始化(执行完父类构造器后才会开始执行子类),

如果有就执行,没有再去父类寻找

如果把父类 callName()改为 callName2(),则会输出base。

4、JDK提供的用于并发编程的同步器有哪些?

Semaphore、CyclicBarrier、CountDownLatch

猜你喜欢

转载自blog.csdn.net/weixin_38158541/article/details/85337783