0
点赞
收藏
分享

微信扫一扫

常见Java知识点【2】

程序员阿狸 2022-03-30 阅读 58
java

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 classinterface
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 方法只能由一个线程访问。

举报

相关推荐

0 条评论