理论测试题目:
1. 请描述出java应用程序的运行机制?
先编译后解释运行,通过JVM跨平台。
*.java通过javac编译成二进制*.class文件后通过不同平台下的JVM加载解释运行。
JIT及时编译器
2. 请说明java中间抽象类和接口的联系和区别?
抽象类是用abstract修饰的类,用于知道某一类对象有这个行为但不知道如何实现。里面可以包含抽象和非抽象方法。只能单一继承。继承抽象类的子类必须实现父类的所有抽象方法,除非本身也是抽象类。
接口是用interface修饰的更高一级的抽象,是一种规范,用于定义其实现类的具体行为。里面的属性都是默认public static final,方法都是默认public abstract。可用于多重继承。实现接口的类必须实现接口中的所有方法,否则该类必须声明为抽象类。
3. 请说明java中间访问修饰符有那些,分别的作用?
public 允许其他所有的成员访问。
protected 该类本身,同一个包内及不同包的子类所有成员访问。
default 只有该类及同一个包内的类可以访问。
private 除了该类的成员其他都不可以访问,实现数据隐藏。
4. 详细说明static关键字用在变量,方法和代码块上各自的意思?
static用在变量及为类变量,所有成员共享该变量,其值改变则所有实例成员的变量值都改变。用在方法则该方法只能调用其他静态方法和变量,不能使用this和super关键字。用在代码块则在调用任何方法之前调用该静态块,主要用于静态变量赋值。
5. final关键字用在变量,方法和类中,分别表示什么意思?请详细说明。
final用在变量表示该变量是个常量,用在方法表示该方法不能重写,用在类则表示该类不可以继承。
6. 请说明方法重写和方法重载的定义和作用?
方法重写是子类重新实现了父类的方法,其名称及参数不变,返回类型也不能变,访问修饰符的范围不能比父类的范围小。作用是改写或改善父类的方法。
方法重载是在同一个类中方法名称相同而参数列表不同。返回类型都可以不同,按类分又可以分为构造方法重载和普通方法重载。
7. 请说明List,Map,Set三个接口的作用和区别?
List和Set扩展了Collection接口,List允许有重复值,ArrryList、Vector等类实现了该接口。Set不允许有重复值,TreeSet和HashSet实现类该接口,TreeSet还实现了SortSet能自动排序。Map接口是以键值对来存储元素,
8. 请说明HashMap和Hashtable的联系和区别?
Hashtable是JDK1.0推出的,他基于线性安全的,不能存储空值;而HashMap是JDK1.2推出的,他基于线性不安全的,主要是对执行效率进行考虑,能存储空值。
9. 请代码演示如何遍历一个HashMap对象?(关键代码即可)
HashMap hm=new HashMap();
hm.put(object,object);…
Collection c=hm.values();
Iterator it=c.iterator();
While(it.hasNext()){
System.out.println(it.next().toString());
}
如果遍历键就用hm.keySet();
10. 请说明java.io.Serializable的作用?
该接口只是一种标记,继承了该类则说明该类可以被序列化和反序列化。
11. 你如何理解线程和进程?他们的联系和区别?
一个进程可以包含多个线程。
12. java中间如何编写一个线程类,并启动他。
13. 你如何理解注解(annotation)?它有什么作用?
Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。
14. 请描述什么是web应用程序?
Web应用程序就是基于WEB开发的程序。一般用来作一些网络具有交互功能的东西。
15. 请说明你如何理解Servlet接口,以及说明我们定义的Servlet的生命周期(什么时候创建,什么时候销毁)?
实现了Servlet接口
Servlet在第一次访问的时候创建,或者指定他在Web服务器启动的时候创建,在Web服务器重启或关闭的时候销毁。服务器资源不够的时候会自动清除很长时间未使用的资源。
16. 请说明Session的生命周期(什么时候创建,什么时候销毁)?
Session在用户第一次访问的时候创建,并使用sessionId唯一标示该用户,保存在服务器。一般用在多次请求中传值,销毁分手动销毁和超时销毁,手动销毁:session.invalidate();超时销毁:session.setMasInactiveInterval(60*10)
17. 请写出jsp中间的9大隐式对象。你觉得pageContext有什么作用?
输入输出对象:out,request,response
作用域通信对象:session,pageContext,application
Servlet对象:page,config
错误对象:exception
18. 转发和重定向的区别?
转发是一次请求,速度快,只限于当前工程,不改变地址栏。
重定向是多次请求,速度慢,可以跨工程,会改变地址栏。
19. this和super有什么作用。
this是指当前对象,可用来防止命名冲突,super用来调用父类的属性和方法。包括普通方法和构造方法。
20. final关键字到底修饰了什么?
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
21. instanceof是什么东东?
instanceof是Java的一个二元操作符,和==,>, <是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。(类似C#的is)举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
java中有三种自动类型转换会造成数据的丢失:
1.int->float
2.long->float
3.long->double
原因是因为,实型的数据最后一个字节是用来存储位权的,也就是科学计数法里边的10的多少次方,存储在这个字节里边,比如说int想要转换成float,那么int的4个字节的数值,会相应的存储到float除开位权那一个字节的前3个字节中,也就是说4个字节存入3个字节,自然会产生数据的丢失,相应的float中的第4个字节中这个时候存储的数就会是0。
22. override有什么作用。
override 有人翻译成重写 ,有人翻译成覆盖,这是对方法而言,static,private,final方法出外
对于变量,没有override一说,它们的行为成为hiden
如果有一个由父类声明、由子类new出的对象的引用/在调用父类与子类同名的变量和方法时/则调用子类的方法,调用其自身的变量!!!
例如:
调用方法a.fn()打印的20,是调用的B类中的方法,但是a.x却是10,是A类中的变量
class A
{
int x=10;
void fn()
{
System.out.println(x);
}
}
class B extends A
{
int x=20;
void fn()
{
System.out.println(x);
}
}
class Test
{
public static void main(String []args)
{
B b=new B();
A a=b;
System.out.println(a.x);
a.fn();
}
}
public static void main(String[] args)
{
Integer a = 127 ;
Integer b = 127 ;
Integer a2 = 200 ;
Integer b2 = 200 ;
Integer a3 = new Integer(100) ;
Integer b3 = new Integer(100) ;
System.out.println (a==b); true 改成128则false
System.out.println (a2==b2); false
System.out.println (a3==b3); false
}
public static void main(String[] args){
int i=10;
for(int j=0;j<10;j++){
i=i++;
System.out.println (i); //始终输出10
}
}
T.class和t.class是同一个,所以一个包里不能有t.java和T.java
String String = "111";
写一个方法,用一个for循环打印九九乘法表
/**
*一个for循环打印九九乘法表
*/
publicvoid nineNineMultiTable()
{
for (int i = 1,j = 1; j <= 9; i++) {
System.out.print(i+"*"+j+"="+i*j+" ");
if(i==j)
{
i=0;
j++;
System.out.println();
}
}
}
描述JAVA中异常处理的机制
• 程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。Java
• 当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
• 如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
• 程序员通常只能处理违例(Exception),而对错误(Error)无能为力。
class Car{
class Wheel{
}
}
class PlaneWheel extends Car.Wheel{
PlaneWheel(Car car){
car.super(); //这句什么意思?为什么要这样写?
}
public static void main(String[] args){
Car car = new Car();
PlaneWheel pw = new PlaneWheel(car);
}
调用的是 Car.Wheel 的构造器
因为 你这个类,是集成自 Car.Wheel而不是 Car.
同样,因为你不是单纯的集成子Wheel,所以你必须有一个Car的实例,因为Wheel属于Car。
public class B {
public static void main(String[] aa) {
Set <Integer> set = new TreeSet <Integer>();
List <Integer> list = new ArrayList <Integer>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove(i);
}
System.out.println(set + " " + list);
}
} [-3, -2, -1] [-2, 0, 2]