1、请编写一个Singleton程序,并说明其主要特点。
特点:构造方法被私有化,只能通过 getInstance()方法取得Singleton 类的实例化对象,这样不管外部如何操作,最终也只有一个实例化对象,在单例设计模式中一定会存在一个static方法,用于取得本类的实例化对象。
class Singleton {
private final static Singleton instance = new Singleton();
private Singleton(){} //构造方法私有化
public void print(){
System.out.print("Hello World .");
}
public static Singleton getInstance(){ //取得本类对象
return instance;
}
}
public class TestDemo{
public static void main(String args[]){
Singleton inst = null; //声明对象
inst = Singleton.getInstance(); //利用"类.static 方法()"取得实例化对象
inst.print();//调用方法
}
}
2、java中实现多态的机制是什么?
方法的覆写(Overriding)和重载(Overloading)是Java多态性的不同表现,覆写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。
对象的向上转型和向下转型。
3、编写一个Factory程序
public interface IFruit { //定义接口
public void eat();
}
class AppleImp implements IFruit{ //实现接口
public void eat(){
System.out.println("吃苹果。");
}
}
class OrangeImp implements IFruit{//实现接口
public void eat(){
System.out.println("吃橘子。");
}
}
class Factory{//过渡端
public static IFruit getInstance(String className){
if("apple".equals(className)){
return new AppleImp();
}
if("orange".equals(className)){
return new OrangeImp();
}
return null;
}
}
public class TestDemo {
public static void main(String args[]){
IFruit f = Factory.getInstance("apple");
f.eat();
}
}
4、编写一个Proxy程序
public interface INetwork {//定义 INetwork 接口
public void browse();//定义浏览的抽象方法
}
class RealImp implements INetwork{ //真实的上网操作
public void browse(){
System.out.println("上网浏览信息");
}
}
class Proxy implements INetwork{//代理上网
private INetwork network;
public Proxy(INetwork network){//设置代理的真实操作
this.network = network;
}
public void check(){
System.out.println("检查用户操作是否合法");
}
public void browse(){
this.check();//可以同时调用多个与具体业务相关的操作
this.network.browse();//调用真实上网操作
}
}
public class TestDemo {
public static void main(String args[]){
INetwork net = null;//定义接口对象
net = new Proxy(new RealImp());//实例化代理,同时传入代理的真实操作
net.browse();//客户只关心上网浏览这功能
}
}
5、抽象类和接口的区别?
No. | 区别 | 抽象类 | 接口 |
---|---|---|---|
1 | 定义关键字 | abstract class | interface |
2 | 组成 | 常量、变量、抽象方法、普通方法、构造方法 | 全局常量、抽象方法 |
3 | 权限 | 可以使用各种权限 | 只能是public |
4 | 关系 | 一个抽象类可以实现多个接口 | 接口不能继承抽象类,却可以继承多接口 |
5 | 使用 | 子类使用 extends 继承抽象类 | 子类使用implements 实现接口 |
6 | 设计模式 | 模板设计模式 | 工厂设计模式,代理设计模式 |
7 | 局限 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |
抽象类和接口的对象都是利用对象多态性的向上转型,进行接口或抽象类的实例化操作。
6、int 和 Integer 有什么区别?
Java提供两种不同的类型:基本数据类型 和 引用数据类型。int 是java的基本数据类型,Integer是java为int提供的包装类。
JDK1.5之后,提供了自动装箱和自动拆箱操作。
7、String 是基本的数据类型么?
String 不是基本数据类型,Java中的基本数据类型包括 byte , short , int , long , float , double , char , boolean 。
8、请解释 Error 和 Exception 的区别?
Error : 指的是JVM错误,这个时候的程序并没有执行,无法处理;
Exception :指的是程序中出现的错误信息,可以进行异常处理。
9、请解释Java的异常处理流程。
(1)如果程序中产生了异常,那么会自动地由 JVM 根据异常的类型实例化一个指定异常类的对象;
(2)如果程序中没有任何异常处理操作,则这个异常类的实例化对象将交给 JVM 进行处理,而 JVM 的默认处理方式就是进行异常信息的输出,而后中断程序进行;
(3)如果程序中存在了异常处理,会由 try 语句捕获产生的异常对象;
(4)与 try 之后的每一个 catch 进行匹配,如果匹配成功,则使用指定的 catch 进行处理,如果没有匹配成功,则向后面的 catch 继续匹配,如果没有任何的 catch 匹配成功,将交给 JVM 执行默认处理;
(5)不管是否有异常都会执行 finally 程序,如果此时没有异常,执行完 finally 会继续执行程序中其他代码,如果此时有异常没有处理(没有一个 catch 可满足),那么也会执行 finally ,但执行 finally 后,将默认交给 JVM 进行异常的信息输出,并且程序中断。
10、请解释 throw 和 throws 的区别?
两者都是在异常处理中使用的关键字,区别如下:
throw:用户手工抛出异常类的实例化对象;
throws :用于方法声明上,表示此方法不处理异常,而是将异常交给程序被调用处处理。
11、在 try 语句中有一个 return 语句,那么紧跟在这个 try 后的 finally 语句的代码会不会被执行?什么时候被执行,在 return 前还是后?
finally 语句一定会执行,并且是在 return 前执行。
12、请解释 RuntimeException 和 Exception 的区别,试列举出几个常见的 RuntimeException.
异常(Exception)表示程序运行过程中可能出现的非正常状态,运行时异常(RuntimeException)表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。Java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常,即 Exception 定义了必须处理的异常,而RuntimeException 定义的异常可以选择性地进行处理;
RuntimeException 是 Exception 的自雷:
常见的RuntimeException 有 NumberFormatException , ClassCastException , NullPointerException , ArithmeticException , ArrayIndexOutOfBoundsException
13、什么时候使用 assert ?
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言都支持这种机制。在实际使用中,assertion就是程序中的一条语句,它对一个boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式值为 true;如果这个值为 false,说明程序已经处在不正确的状态下,系统将给出警告或退出。
一般来说,assertion用于保证程序最基本、关键的正确性。assertion 检查通常在开发和测试时开启,为提高性能,在项目发布后,assertion检查通常是关闭的。
assertion(断言)是JDK1.4之后提供的新功能,可以用来检测程序的执行结果,但开发中兵不提倡使用断言进行检测。
14、请解释 enum 和 Enum 的关系?
enum 是JDK 1.5之后定义的新关键字,主要用于定义枚举类型。在 Java中,每一个使用 enum 定义的枚举类型实际上都表示一个默认继承了 Enum 类。
15、Thread 类 和 Runnable接口实现多线程的区别?
从Java的实际开发而言,肯定使用Runnable接口,因为它可以有效地避免单继承的局限。另外从Thread类的定义 :public class Thread extends Object implements Runnable
Thread类是Runnable接口的子类。
16、请解释多线程的两种实现方式和区别,分别编写程序以验证两种实现方式。
多线程的两种实现方式都需要一个线程的主类,而这个类可以实现 Runnable 接口或继承 Thread 类。不管使用何种方式都必须在子类中覆写 run()方法,此方法为线程的主方法;
Thread 类是Runnable 接口的子类,使用Runnable 接口可以避免单继承局限,以更加方便地实现数据共享的概念。
Runnable 接口:
class MtThread implements Runnable{
@ovrride
public void run(){//线程主方法
//线程操作方法
}
}
......
MyThread mt = new MyThread();
new Thread(mt).start();
Thread类:
class MyThread extends Thread{
@Override
public void run(){//线程主方法
//线程操作方法
}
}
......
MyThread mt = new MyThread();
mt.start();
17、进程在哪里?
每一个 JVM 运行就是进程。当用户使用Java命令执行一个类时就表示启动了一个JVM进程,而主方法只是这个进程上的一个线程。当一个类执行完毕后,此进程会自动消失。每一个 JVM 进程都至少启动两个线程:main 和 gc。
18、同步和异步有什么区别,分别在什么情况下使用它们?举例说明。
如果一块数据要在多个线程间进行共享,例如正在写的数据,以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该异步编程。很多情况下采用异步途径往往更有效率。
19、abstract 的 method 是否可同时是 static , native , 或 synchronized ?
都不能和 “abstract” 同时声明方法
20、当一个线程进入一个对象的一个synchronied() 方法后,其他线程是否可进入此对象的其他方法?
不能访问,一个对象操作一个 synchronied 方法只能由一个线程访问。