java面经2

3面向对象

1、wait方法底层原理
synchronied有一个等待队列,阻塞的线程,均放在该队列中。当执行到对象的wait的方法,所在线程被添加到等待队列,将队列的头的线程唤醒。
2、Java有哪些特性,举个多态的例子。
抽象(面向对象)、封装、继承、多态
3、String为啥不可变?
它是一个不可变类被final修饰,一旦初始化就无法改变。并且它的成员变量都由final修饰,且未暴露这些成员变量,不过可以通过反射方法可以改变。
4、类和对象的区别
类实例化后就是对象。
起始类在jvm的存在形式也对象,是一个Class类的对象。
5、请列举你所知道的Object类的方法。
equals()、hashcode()、clone()、toString()、wait()、notify()
6、重载和重写的区别?相同参数不同返回值能重载吗?
重载(overload):就是一个类中有多个方法同名,但参数列表不同的类。
重写(Override):两同两小一大。函数名、参数列表相同,并且修饰符的范围子类必须要大于父类,抛出的异常和返回值类型 子类必须小于父类
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
7、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
修饰变量表示静态变量,作为类变量,所有对象共享该属性;修饰方法表示是静态方法,作为类方法,仅能访问。
private方法不能override,表示的仅仅是为子类新增了一个方法;
static方法形式上可以被重写,即子类中可以重写父类中静态的方法。但实际上不起作用。
8、String能继承吗?
不能,是一个不可变类
9、StringBuffer和StringBuilder有什么区别,底层实现上呢?
StringBuffer是线程安全的,StringBuilder是线程不安全的。基本上差不多,StringBuffer通过synchronized关键字对方法加锁。
11、静态变量存在哪?
方法区-静态变量池;JDK1.8之后存到Heap中
12、讲讲什么是泛型?
泛型的本质是参数化类型,所操纵的数据类型被指定为一个参数。未引入之前是直接通过Object强制类型转换;泛型会在编译的时候检查类型安全。
13、解释extends 和super 泛型限定符-上界不存下界不取
extends只能传入该类与其子类,是上界。
super只能传入该类与其父类,是下界。
14、是否可以在static环境中访问非static变量?
不可以。static表示属于类的属性,在对象实例化之前就已经存在了,而非static变量属于对象的属性,在对象实例化之后才真正存在。
15、谈谈如何通过反射创建对象?
通过反射创建对象的两种方法
1.通过Class字节码对象newInstance();(默认通过无参构造创建)

		Class clz = Class.forName("test.java.zxj.test_project.User");
		Object object = clz.newInstance();
		System.out.println(object instanceof User);

2.通过获取构造器
getConstructor(Class…parameterTypes);(通过有参的构造器,参数可以指定具体类型和多个数量)

		Class clz = Class.forName("test.java.zxj.test_project.User");
		//获取参数为的构造器
		Constructor constructor = clz.getConstructor(String.class, String.class);
		Object object = constructor.newInstance("userId_001","name_jack");

16、Java支持多继承么?
不支持
17、接口和抽象类的区别是什么?

接口 抽象类
可以实现多个接口 只能继承一个抽象类
implement,该接口的子类必须实现所有的成员方法 extends,若子类为非抽象类,必须实现所有的抽象方法
成员方法不能写方法体 可以为成员方法写方法体
默认的访问权限是public 默认的访问权限是friendly,可以修改成public,protected
不可以有构造方法 可以有构造方法

18、Comparable和Comparator接口是干什么的?列出它们的区别。
对自定义的class比较大小的。
Comparator定义在类的的外部:当调用sort方法时,可以传入自定义的比较方法。
Comparable定义在Person的内部:当调用sort方法时,会默认使用Comparable的比较方法。
19、面向对象的特征有哪些方面
封装:描述一个对象的属性和行为的代码封装在一个类中。
抽象:就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处。
继承:子类自动共享父类数据和方法的机制,代码重用
多态:是指允许不同子类型的对象对同一消息作出不同的响应。

20、final, finally, finalize的区别。
略。
21、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
Overload:重载,同一个类中,方法名相同、参数列表不同
Override:重写,子类重写父类的方法,方法名相同、参数列表相同,
可以。
22、abstract class和interface有什么区别?
同上。
23、Static Nested Class 和 Inner Class的不同

Static Nested Class Inner Class
静态内部类 内部类
不可以访问类的成员变量和成员方法,可以访问静态变量和方法 可以访问成员变量和成员方法,静态变量和方法
要创建嵌套类Static Nested Class的对象,并不需要其外围类的对象 它的创建依赖一个外部类对象作为宿主,内部类必须寄生在外部类对象中才能创建实例

24、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
引用传递。
25、Java的接口和C++的虚类的相同和不同处。

26、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。
在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。

throws:显示地表示函数会抛出异常,调用该函数必须处理抛出的异常(要不通过try块处理,或者继续向外面抛)
throw:throw后面跟一个实例化的Exception或者它的子类,表示出现了这个异常。
try:当try块中出现异常将会被捕获
catch:和try搭配使用,catch相应类型的异常,进行处理。
finally:无论try块是否捕获到异常,都会执行finally中的代码,一般用来关闭资源

可以,直接交由catch块处理。
27、内部类可以引用他包含类的成员吗?有没有什么限制?
内部类可以,静态内部类不可以。
29、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
略。同上。
30、如何通过反射获取和设置对象私有字段的值?

	//Set
	Class  clz=User.class;
	Field ageField=clz.getDeclaredField(“age”);
	ageField.setAccessible(true);//修改访问权限
	Object obj=clz.newInstance();
	ageField.setInt(obj, 17);
//Get
Field nameField=clz.getDeclaredField(“name”);
nameField.setAccessible(true);
Object nameObj=nameField.get(obj);

31、谈一下面向对象的"六原则一法则"。
(一)单一职责原则:一个类只做它该做的事情。
(二)开闭原则:软件实体应当对扩展开放,对修改关闭。
(三)依赖倒转原则:面向接口编程。
该原则说的直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所代替。
(四)里氏替换原则:任何时候都可以用子类替换掉父类型。
(五)接口隔离原则:接口要小而专,绝不能大而全。
(六)合成聚合复用原则:优先使用聚合或合成关系复用代码。
(七)迪米特法则:它又称为最少知识原则,一个对象应当对其他对象有尽可能少的了解。
31、Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

你可能感兴趣的:(Java面试题)