java笔试题专项练习【※※】

1,以下关于java封装的描述中,正确的是:(A)

  • A,封装的主要作用在于对外隐藏内部实现细节,增强程序的安全性
  • B,封装的意义不大,因此在编码中尽量不要使用
  • C,如果子类继承父类,对于父类中进行封装的方法,子类仍然可以直接调用
  • D,只能对一个类中的方法进行封装,不能对属性进行封装

解析:
关于封装:封住、继承、多态是面向对象的三大特征,其重要性与使用频率不言而喻。封装就是将属性私有化,提供公有的方法访问私有属性。通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性。由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强

2,java7后关键字switch支不支持字符串作为条件:(A)

  • A,支持
  • B,不支持

解析:
switch(exp),在JDK7之前,只能是byte、short、char、int或者对应的包装类,或者枚举常量(内部也是由整型或字符类型实现)。
为什么必须是这些呢,因为其实exp只是对int型支持的,其他都是因为可以自动拆卸或者自动向上转型到int,所以才可以。
到了JDK7的时候,String被引入了,为什么String能被引入呢?
其实本质上还是对int类型值得匹配。
原理如下,通过对case后面得String对象调用hashCode方法,得到一个int类型得hash值,然后用这个hash值来唯一标识这个case。那么当匹配时,首先调用exphashCode,得到exphash值,用这个hash值来匹配所有case,如果没有匹配成功,就说明不存在;如果匹配成功了,接着会调用字符串的equals方法进行匹配。(hash值一致,equals可不一定返回的就是true)。所以,exp不能为nullcase子句使用的字符串也不能为null,不然会出现空指针异常。

3,定义:String s1 = “uml”; String s2 = “uml”; String s3= new String(“uml”); String s4= new String(“uml”);那么,s1==s2;s3 == s4;s1.equals(s3); 判断正确与否()

  • A, T,F,T
  • B, F,T,F

解析:
==:比较两个引用的地址和值
equals:比较两个引用的值

  1. s1==s2 true s1s2指向字符串常量池中同一个地址
  2. s3s4 都显示使用了new,是不同的对象, 当然不相等
  3. s1s3 的值都是 “uml”,当然相等

在这里插入图片描述
4,javac的作用是( )。
正确答案: A

  • A,将源程序编译成字节码
  • B,将字节码编译成源程序
  • C,解释执行Java字节码
  • D,调试Java代码

javac是将源程序.java编译成.class文件
java是将字节码转换为机器码文件执行

5,下列代码的执行结果是:( )

public class Test3{
    
    
 public static void main(String args[]){
    
    
    System.out.println(100%3);
    System.out.println(100%3.0);
 }
}

正确答案: B

  • A, 1和1
  • B, 1和1.0
  • C, 1.0和1
  • D, 1.0和1.0
    多种混合计算时,自动将所有数据类型转换为容量最大的一种数据类型。所以都转为float类型。

6,为AB类的一个无形式参数无返回值的方法method书写方法头,可以用AB.method()方式调用,该方法头的形式为( )。
正确答案: A

  • A, static void method( )
  • B, public void method( )
  • C, final void method( )
  • D, abstract void method( )

解析:首先声明什么是静态方法:用static修饰的方法
静态方法是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。
其次说明静态方法的使用:
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,只有调用静态方法时可以无需创建对象。

7,命令javac-d参数的用途是?()
正确答案: A

  • A, 指定编译后类层次的根目录
  • B, 指定编译时需要依赖类的路径
  • C, 指定编译时的编码
  • D, 没有这一个参数

解析:
-d destination 目的地
-s source 起源地
javac -d 指定放置生成的类文件的位置
javac -s 指定放置生成的源文件的位置

在这里插入图片描述
8,J2EE中,当把来自客户机的HTTP请求委托给servlet时,会调用HttpServlet的( )方法

正确答案: A

  • A, service
  • B, doget
  • C, dopost
  • D, init

解析:
HttpServlet容器响应Web客户请求流程如下:

  1. Web客户向Servlet容器发出Http请求;
  2. Servlet容器解析Web客户的Http请求;
  3. Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
  4. Servlet容器创建一个HttpResponse对象;
  5. Servlet容器调用HttpServletservice方法,这个方法中会根据requestMethod来判断具体是执行doGet还是doPost,把HttpRequestHttpResponse对象作为service方法的参数传给HttpServlet对象;
  6. HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
  7. HttpServlet调用HttpResponse的有关方法,生成响应数据;
  8. Servlet容器把HttpServlet的响应结果传给Web客户。

doGet()doPost() 是创建HttpServlet时需要覆盖的方法.

9,在运行时,由java解释器自动引入,而不用import语句引入的包是()。
正确答案: A

  • A, java.lang
  • B, java.system
  • C, java.io
  • D, java.util

解析:
java.lang包是java语言包,是自动导入的。
java.util包是java的工具包,需要手动导入。
java.sql包,JDBC接口类,需要手动导入。
java.io;各种输入输入流,需要手动导入。
system是属于java.lang.sysytem

10,以下代码运行输出的是

public class Person{
    
    
	private String name = "Person";
	int age=0;
}
public class Child extends Person{
    
    
	public String grade;
	public static void main(String[] args){
    
    
		Person p = new Child();
		System.out.println(p.name);
	}
}

正确答案: C

  • A, 输出:Person
  • B, 没有输出
  • C, 编译出错
  • D, 运行出错

解析:

  1. 一个java文件里,public 的类只能出现一个,只能出现一个,只能出现一个,否则,不管你用哪一个类名命名文件名编译器都会报错。【不过一般题目里面默认不在一个java文件,除非特别说明,另外不包括内部类】
  2. 关于多态。子类继承了父类的所有成员,包括private权限的成员变量,但是继承的子类具有私有变量的拥有权但是没有使用权。
  3. private的成员变量,根据权限修饰符的访问控制范围,只有在类内部才能被访问,就算是他的子类,也不能访问。

11,假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()

static String str0="0123456789";
static String str1="0123456789";
String str2=str1.substring(5);
String str3=new String(str2);
String str4=new String(str3.toCharArray());
str0=null;

正确答案: C

  • A, 5
  • B, 10
  • C, 15
  • D, 20

解析:这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池。
str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回。
经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen

12,当x=?时,会输出”Test2“?

switch (x)
{
    
    
    case 1: System.out.println("Test1");
    case 2:
    case 3:
        System.out.println("Test2");
        break;
    default:
    System.out.println("Test3");
    break;
}

正确答案: B C D

  • A, 0
  • B, 1
  • C, 2
  • D, 3
  • E, 4

这里注意题目没有说只打印,所以case 1 也符合条件,这里考的是细心。

13,JAVA反射机制主要提供了以下哪些功能?
正确答案: A B C D

  • A, 在运行时判断一个对象所属的类
  • B, 在运行时构造一个类的对象
  • C, 在运行时判断一个类所具有的成员变量和方法
  • D, 在运行时调用一个对象的方法

解析:普通的java对象是通过new关键字把对应类的字节码文件加载到内存,然后创建该对象的。反射是通过一个名为Class的特殊类,用Class.forName("className");得到类的字节码对象,然后用newInstance()方法在虚拟机内部构造这个对象(针对无参构造函数)。
也就是说反射机制让我们可以先拿到java类对应的字节码对象,然后动态的进行任何可能的操作,包括

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

这些都是反射的功能。使用反射的主要作用是方便程序的扩展。

14,java运行时内存分为“线程共享”和“线程私有”两部分,以下哪些属于“线程共享”部分
正确答案: B D

  • A, 程序计算器
  • B, 方法区
  • C, java虚拟机栈
  • D, java堆

解析:共享的资源有:


  1. 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
  2. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
  3. 静态变量
    虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss.data段,是共享的
  4. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。Win32提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。

独享的资源有


  1. 栈是独享的
  2. 寄存器
    这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC

15,以下说法错误的是()
正确答案: B C D

  • A, 其他选项均不正确
  • B, java线程类优先级相同
  • C, ThreadRunnable接口没有区别
  • D, 如果一个类继承了某个类,只能使用Runnable实现线程

解析:

  • B选项,在java中线程是有分优先等级的所以优先级不能相同,错误
  • C选项,Thread实现了Runnable接口是一个类不是接口,错误
  • D选项,实现多线程的三种方式,一种是继承Thread类使用此方式就不能继承其他的类了。还有两种是实现Runnable接口或者实现Callable接口,所以D错误。
  • A选项,综上A说其余三项都是错误的,所以A选项所述为真,不是错误的。

说明:解析来源于牛客网Java试题后面的优质评论,我只是将这些优质评论收集过来,如果有错误的地方欢迎指出。

Guess you like

Origin blog.csdn.net/will__be/article/details/121211322