JAVA 练习题 2019-7-31AM

第二题:Java Applet被浏览器加载时,仅为运行一次的方法是()
A.init()
B.stop()
C.opreationcrawl()
D.reader()

答:A

第二题:Applet是什么?

答:

是一种在Web环境下,运行与客户端的java程序组件,已接近淘汰。
Applet必须运行于某个特定的”容器“,这个容器可以是浏览器本身,
也可以说是通过各种插件,或者包括支持Applet的移动设备在内的其他程序来运行。
与一般的JAVA程序不一样,它不通过main方法来运行,
而是调用init方法,然后start()方法,最后paint()方法。

第四题:有一个boolean变量 aa,对aa赋值为真。语句怎么写?

答:

aa=true;

第五题:高内聚,低耦合的含义是什么?

答:

高类聚就是类的内部操作细节自己完成,不允许外部干涉 
低耦合是仅暴露少量的方法给外部使用 

第六题:如何理解,同一个类的对象使用不同的内存段,静态成员对象内存空间连续。

答:

每创建一个实例对象,会为实例对象在堆中分配内存。因此对象在内存中位置可能不连续。
静态成员为类中所有对象共享有,故在一片属于类的存储空间中,被共享。

第六题:如何理解,对象中的方法也要占内存空间?

答:

JAVA内存大体分为3块,堆内存,栈内存,方法内存。
	堆内存一般存放的是对象的属性。
	栈内存一般存放的是局部变量。
	方法内存一般存放函数的地址。但函数是多对象共享的,
	所以函数内容不占用对象的内存地址,函数内容放在代码段中。 

第七题:进行Java基本的GUI设计需要用到的包是()

A.java.io
B.java.sql
C.java.awt
D.java.rmi

答:

java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。
java.sql 提供使用 Java 编程语言访问并处理存储在数据源中的数据的 API。
此 API 包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。
java.awt是一个软件包,包含用于创建用户界面和绘制图形图像的所有分类。
功能:包含用于创建用户界面和绘制图形图像的所有类。
java.rmi 提供 RMI 包。RMI 指的是远程方法调用 (Remote Method Invocation)。
它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。

第十题:解释下面语句。

A.  Class.forName(“com.mysql.jdbc.Driver”); //指定MySQL JDBC驱动程序
B.  String url=” jdbc:mysql://localhost:3306/student”; //指定驱动程序与数据源的连接
C.  db.executeQuery(sql); //用于返回查询结果
D.  db.executeUpdate(sql); //用于执行修改,返回更新条目
E.  while(rs.next())//用于遍历查询结果中的记录

第十四题:一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。

答:

正确。

一个.java文件不一定只生成一个.class ,
一个.java文件中定义多个类(有多少个JAVA类和接口,编译后就会有多少个.class):
注意一下几点:
(1) public权限类只能有一个(也可以一个都没有,但最多只有一个);
(2)这个.java文件名只能是public 权限的类的类名;
(3)倘若这个文件中没有public 类,则它的.java文件的名字是随便的一个类名;
(4)当用javac命令生成编译这个.java 文件的时候,则会针对每一个类生成一个.class文件;

第十五题:servlet中并发的多线程访问共享类变量,会自动完成加锁吗?

答:

不会,在Servlet类中可能会定义共享的类变量,这样在并发的多线程访问的情况下,不同的线程对成员变量的修改会引发错误。

解决方法:定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。

第十六题:servlet中init,service,destroy方法的功能特点。

答:

init方法: 是在servlet实例创建时调用的方法,
	用于创建或打开任何与servlet相的资源和初始化servlet的状态,
	Servlet规范保证调用init方法前不会处理任何请求 
service方法:是servlet真正处理客户端传过来的请求的方法,
	由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法 
destory方法:是在servlet实例被销毁时由web容器调用。
Servlet要销毁对象时,确保在destroy方法调用之前所有请求的处理均完成,

第二十三题: JAVA中的“==” 运算符 与 equals 使用上的区别。

答:
前者比较要更严格。
不同类型调用 == 比较,会出现编译错误,不能比较。
不同类型调用 equals 方法,先是比较类型,若不同的类型,返回假,
但是参数是基本类型,这时候,先会进行自动装箱。
比如int 为基本类型,将装箱为Integer类型再比较他们的内容。
equls如果参数不是基本类型,比如string间的比较,
这时候会比较他们的字符串内容是否一样。
”==“运算符,如果参数不是基本类型,比如string间的比较,
会比较他们的内存地址,注意string也有常量缓存池。

第二十四题: java的垃圾回收机制有那些内容?

答:

首先,垃圾回收机制主要针对的是堆区的回收,原因是栈区的内存已随着线程而释放。

堆区分为三个区:
年轻代(Young Generation)、
年老代(Old Generation)、
永久代(Permanent Generation,也就是方法区)。

年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)针对年老代的回收。
永久代:存储的是final常量,static变量,常量池。

第二十五题:Java中对字段属性是静态绑定,方法成员是动态绑定。若不遵循绑定规范,前者会造成编译不通过,后者会造成什么问题?

答:
静态绑定与动态绑定也叫做前期绑定和后期绑定。
动态绑定发生在运行时,绑定失败常是因为类型检查不通过造成。

动态绑定的范畴除了private,final,static和构造方法是前期绑定外,其他的方法全部为动态绑定。

第二十五题:举例解释动态绑定是如何发生的。

答:
父类A定义了method123,创建了实例ff。子类B重写了method123,创建B的实例,ss。
把ss变量赋给ff。动态绑定伴随着向上转型发生。
java中的后期绑定由JVM来实现的,我们不用去显式的声明它,
而C++则不同,必须明确的声明某个方法具备后期绑定。

第二十八题:JAVA线程中join()、yield()、join()、interrupt()的含义。

答:

wait()
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。
线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

yield()
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,
所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。 

join()
等待该线程终止。
等待调用join方法的线程结束,再继续执行。
如:main方法中有一句 t.join();//主要用于等待t线程运行结束,
若无此句,main则会执行完毕,导致结果不可预测。

interrupt()
中断线程,终结被阻塞状态。
线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,
会通过checkAccess()检查权限。这有可能抛出SecurityException异常。

第二十八题:所有会产生阻塞的方法都会抛受检异常,是否正确?

答:
正确,受检异常英文为 java.lang.InterruptedException。

第二十八题:在join,sleep,wait等方法中,本线程接收到其它线程调用的interrupt()会有什么问题?

答:
一定会发生的事情有:
本线程产生了InterruptedException异常,并清除中断标志.
可能会发生的事情有:
如果程序中存在检查中断标志来确定中断行为的发生,
那么在catch块里会检测不到中断标志。

第二十八题:开发中stop、suspend等方法,没有interrupt()常用,为什么?

答:

这些方法在使用上存在不安全性,会带来不好的副作用,不建议被使用。
interrupt(),在一个线程中调用另一个线程的interrupt()方法,
即会向那个线程发出信号——线程中断状态已被设置。
至于那个线程何去何从,由具体的代码实现决定。

第二十八题:发生InterruptedException时,如何根据Interrupt状态码处理该异常?

答:

通用的做法是:
1,如果你的方法签名可以包含InterruptedException,那么直接抛出,
让你的方法也变成一个阻塞方法。
2,如果你的方法签名不允许你增加InterruptedException,
那么需要你在捕获InterruptedException后及时重置Interrupt状态(一般你调用的阻塞函数
在抛出InterruptedException后会清除Interrupt状态)。

以上2种手法的目的都是为了上层调用方能知道本线程被中断了,
然后一直将这个Interrupt状态传递到线程的管理者模块那,由他再决定如何处理这个线程。
所以你不一定需要捕获,根据你的方法的签名,决定采用方案1或者2来处理这个异常。

第二十九题:线程调用sleep方法,安全起见,通常要捕获异常,主要是捕获那些异常?

答:
在线程阻塞的时候,其他对象很有可能调用了其interrupt(),
产生InterruptedException异常,如果不去捕获异常,那么线程就会异常终止。

第三十题: sleep()与interrupt()使用时有那些关键点需要注意的?

答:
https://www.cnblogs.com/xushun/p/11229298.html
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐