软件开发----Java基础每日刷题(转载于牛客)

1.        类Car里面有个方法run(),如果直接用Car.run(),则方法run前面必须用的关键词是?  ( )

A        class

       final

C        public

D        static

正确答案:D

解析: 

static修饰的的方法是存放在栈里面的,属于类的信息,因此不需要new对象就可以直接用类名调用由static修饰的方法。而其他的方法或属性属于对象的,它们放在堆里,因此需要new出某个类的对象才能引用。


2.        下列哪个对访问修饰符作用范围由大到小排列是正确的?

A        private>default>protected>public

B        public>default>protected>private

C        private>protected>default>public

D        public>protected>default>private

正确答案:D

解析:

补充default和 friendly权限相同,只是在java中没有friendly说法


3.        下面有关JVM内存,说法错误的是?

A        程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的

       虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

C        方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的

D        原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

正确答案:C

解析:

大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 ),其中Method Area 和  Heap 是线程共享的  ,VM Stack,Native Method Stack  和Program Counter Register  是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。

首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈)和Native Method Stack  (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因



4.        关于Java以下描述正确的有(      )

       Class类是Object类的超类

B        Object类是一个final类

       String类是一个final类

D        Class类可以装载其它类

正确答案:CD

解析:

A.

class类是Object的派生类

B.每个类都使用Object类作为超类,而final修饰的类不能被继承

C.

D.Class类中的forName()方法返回与带有给定字符串名的类或接口相关联的Class对象(装载其他类)


5.        Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(    )

A        Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下

       通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法

       通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成员

       Java反射机制提供了字节码修改的技术,可以动态的修剪一个类

       Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多

       Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率

正确答案:ADF

解析:

A Class类在java.lang包

B 动态代理技术可以动态创建一个代理对象,反射不行

C 反射访问私有成员时,Field调用setAccessible可解除访问符限制

D CGLIB实现了字节码修改,反射不行

E 反射会动态创建额外的对象,比如每个成员方法只有一个Method对象作为root,他不胡直接暴露给用户。调用时会返回一个Method的包装类

F 反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化。


6.        关于Java语言的内存回收机制,下列选项中最正确的一项是

A        Java程序要求用户必须手工创建一个线程来释放内存

B        Java程序允许用户使用指针来释放内存

C        内存回收线程负责释放无用内存

D        内存回收线程不能释放内存对象

正确答案:C

解析:

A选项,Java的内存回收是自动的,不需要也不允许程序员手动调用。

B选项,Java语言不允许使用指针。

C选项正确

D选项,无用的对象内存可以被内存回收线程释放。


7.        子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?

A        父类B静态代码块->父类B构造函数->子类A静态代码块->父类B非静态代码块->子类A构造函数->子类A非静态代码块

B        父类B静态代码块->父类B构造函数->父类B非静态代码块->子类A静态代码块->子类A构造函数->子类A非静态代码块

       父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数

D        父类B构造函数->父类B静态代码块->父类B非静态代码块->子类A静态代码块->子类A构造函数->子类A非静态代码块

正确答案:C

解析:

按照先后顺序:

1,静态先于非静态代码库执行(静态代码块随着类的加载而加载,初始化只执行一次)

2,父类先于子类

3,非静态代码块优于构造函数执行


8.        AccessViolationException异常触发后,下列程序的输出结果为(      )

static void Main(string[] args)  
{  
    try  
    {  
        throw new AccessViolationException();  
        Console.WriteLine("error1");  
    }  
    catch (Exception e)  
    {  
        Console.WriteLine("error2");  
    }  
    Console.WriteLine("error3");  
} 

       error2
          error3

B        error3

C        error2

       error1

正确答案:A

解析:

try{ 
//正常执行的代码
 }catch (Exception e){ 
//出错后执行的代码 
}finally{ 
//无论正常执行还是出错,之后都会执行的代码
 } 
//跟上面try catch无关的代码 正常执行的代码如果出现异常,就不会执行出现异常语句后面的所有正常代码.  

情况一:出现异常,没有捕捉,那后面的代码就不会执行。

情况二:出现异常,catch捕捉成功,那后面的代码按顺序执行。

题目中属于情况二,异常被捕捉到了,所有后面代码不受影响。


9.        设有下面两个赋值语句:

a = Integer.parseInt("1024");

b = Integer.valueOf("1024").intValue();

下述说法正确的是()

A        a是整数类型变量,b是整数类对象。

B        a是整数类对象,b是整数类型变量。

       a和b都是整数类对象并且它们的值相等。

D        a和b都是整数类型变量并且它们的值相等。

正确答案:D

解析:

intValue()是把Integer对象类型变成int的基础数据类型;
parseInt()是把String 变成int的基础数据类型;
Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)
本题:parseInt得到的是基础数据类型int,valueof得到的是装箱数据类型Integer,然后再通过valueInt转换成int,所以选择D


10.        关于 访问权限说法正确 的是 ? (    )

A        外部类定义前面可以修饰public,protected和private

B        局部内部类前面可以修饰public,protected和private

C        匿名内部类前面可以修饰public,protected和private

       以上说法都不正确

正确答案:D

解析:

1、外部类前可以修饰:public、default、abstract、final

2、内部类前可以修饰:public、protected、default、private、abstract、final、static

3、局部内部类前可以修饰:abstract、final

其中:访问修饰符(public、protected、default、private),其他都是非访问修饰符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值