Java面试题之五
二十一、super()与this()的区别?
(1)用this的情况:
1.在构造方法中,通过this调用另一个构造方法,用法:this(参数列表)。
2.在函数参数或函数的局部变量与成员变量同名,即成员变量被屏蔽的情况下,要访问成员变量需要用“this.成员变量”的方式进行访问。当然不同名也可这样访问,但是不是必须这样。
3.在函数中,需要引用该函数所属类的当前对象时,直接用this。
(2)用super的情况:
1.在子类构造方法中要调用父类的构造方法时,用“super(参数列表)”方法调用。并且这句话只能出现在子类构造方法的第一行。
2.当子类局部变量或成员变量与父类成员变量同名,即父类成员变量被覆盖时,需要用“super.成员变量”方式来访问父类成员变量。当然不同名时,也可这样访问父类成员变量,但没必要。
3.当父类成员方法被子类成员方法覆盖,也就是他们有相同方法定义(方法体可以不同)时,用“super.方法名(参数列表)”方式访问父类方法。
(3)比较:
1.this 代表当前类对象。super代表当前类的父类对象。super()和this()都只能放在构造方法的第一行。
2.可以用this调用一个构造器,但不能用this调用两个。同时,this和super不能同时出现在一个构造方法里,编译也不会通过。
3.this和super都是指的对象,它们都不能在静态环境中使用。包括静态变量,静态方法,静态块。
4.在构造方法中,若第一行没有super(),编译器会自动插入一个,但是,若父类没有无参构造方法,或其已被私有化,那么只能调用父类有参构造方法,否则会报错。
二十二、JAVA的事件委托机制和垃圾回收机制
事件委托机制:一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。
垃圾回收机制:垃圾回收是将分配给对象但不再使用的内存回收或释放的过程。
如果一个对象没有指向它的引用或者其赋值为null,则此对象适合进行垃圾回收。也就是说垃圾回收,回收的是没有被变量指向的对象。
垃圾回收器是一个单独的低级别的线程。在不可预知的情况下,对内存中已经死亡或者长时间没有使用的对象进行回收。但程序员自己并不能控制垃圾回收。
二十三、在JAVA中,如何跳出当前的多重嵌套循环?
两种方式:break和return。
(1)对于break,有两种方式:
1.在外层循环语句前加一个标号,然后在内层循环体内使用带标号的break语句。个人不推荐使用这种方式。
2.通过内层循环体里的代码去控制外层循环的循环条件。一般定义一个boolean变量去控制。
(2)对于return,比较简单,跳出整个方法,当然也就跳出了多重循环。
二十四、什么是java序列化,如何实现java序列化?
序列化:处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,是一个标示性接口,用来标注该对象可被序列化,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
具体示例可参考http://blog.csdn.net/u010142437/article/details/8967349
二十五、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。如果这个类的修饰符是public,其类名与文件名必须相同。也就是说一个".java"源文件中只能有一个类(不是内部类)声明为public。并且其类名与文件名必须相同。
二十六、排序都有哪几种方法?请列举。用JAVA实现一个快速排序?
排序的方法:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、
快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱
排序、基数排序)。
快速排序的伪代码:
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,以该元素为支点把余下的元素分割为两段left和r i g h t,使得l e f t中的元素都小于等于支点,而right中的元素都大于等于支点。递归地使用快速排序方法分别对左和右进行排序,结果为l e f t + m i d d l e + r i g h t。
二十七、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
Overload指重载;Override指重写。
重载发生在一个类当中。方法名相同,参数列表不同(参数个数、类型、顺序)。重载是一个类中多态性的表现。重载的方法可以改变返回值类型。因为重载只跟参数列表有关,所以重载的方法返回类型是可以不一样的。
重写发生在父类和子类之间。方法名相同,参数列表相同,返回类型也相同。子类重写了父类的方法,调用时会优先调用子类重写的方法,即父类方法在这个时候被覆盖了,所以称之为重写(覆盖)。重写是父类和子类多态性的一种表现。
另外,重写还需注意:子类重写方法的访问修饰符必须不小于父类中的访问修饰符。子类重写抛出的异常不能比父类多。
二十八、Final类有什么特点?
声明为final的类不可以被继承。当然它的方法也没法被重写。但其属性可以是final也可以不是final的。
二十九、什么是类的反射机制?
通过类(Class对象),可以得出当前类的fields、method、construtor、interface、superClass、modified等,同是可以通过类实例化一个实例、设置属性、唤醒方法。Spring中一切都是返射、struts、hibernate都是通过类的反射进行开发的。
三十、类的反射机制中的包及核心类?
java.lang.Class
java.lang.refrection.Method
java.lang.refrection.Field
java.lang.refrection.Constructor
java.lang.refrection.Modifier
java.lang.refrection.Interface