Java常见面试问题整理

1.什么是泛型?

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法 时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化, 类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/ 调用时传入具体的类型(类型实参)。

public class GenericTest {
 public static void main(String[] args) {
	  /*List list = new ArrayList(); 
	  list.add("qqyumidi"); 
	  list.add("corn");
	  list.add(100); */
    List<String> list = new ArrayList<String>(); 
    list.add("qqyumidi");
    list.add("corn"); 
     //list.add(100); // 1 提示编译错误
    for (int i = 0; i < list.size(); i++) { 
     String name = list.get(i); // 2
     System.out.println("name:" + name); 
     }
 }
}

采用泛型写法后,在//1 处想加入一个 Integer 类型的对象时会出现编译错误,通过 List,直接限定了 list集合中只能含有 String 类型的元素,从而在//2 处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是 String 类型 了。

2.StringBuffer 和 StringBuilder 有什么区别,底层实现上呢?

StringBuffer 线程安全,StringBuilder 线程不安全,底层实现上的话,StringBuffer 其 实就是比 StringBuilder 多了 Synchronized 修饰符。

3.是否可以在 static 环境中访问非 static 变量?

static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机 载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量, 编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

4.谈谈如何通过反射创建对象?

方法 1:通过类对象调用 newInstance()方法,例如:String.class.newInstance()
方法 2:通过类对象的 getConstructor()或 getDeclaredConstructor()方法获得构造器 (Constructor)对象并调用其 newInstance()方法创建对象,例如: String.class.getConstructor(String.class).newInstance(“Hello”);

5. Java 支持多继承么?

Java 中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是 java 中的接口支持多继承,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

6.接口和抽象类的区别是什么?

Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于: 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。 类可以实现很多个接口,但是只能继承一个抽象类 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。 Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。 Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者 是 public。 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。 也可以参考 JDK8 中抽象类和接口的区别。

7.final, finally, finalize 的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾回收时的其他资源回收,例如关闭文件等。

8.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性, 并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

9.两个对象值相同(x.equals(y) == true),但却可有不同的 hash code 说法 是否正确?

不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code)应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;(2)如果两个对象的 hashCode 相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存 储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

10.重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类 型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不 同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被 重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。重载对返回类型没有特殊的要求。

11.Java 中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java 编译器会为这个类创建一个默认的构造函数。 Java 中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。 Java 不支持像 C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下, Java 不会创建默认的复制构造函数。

12.hashCode()和 equals()方法有什么联系?

Java 对象的 eqauls 方法和 hashCode 方法是这样规定的:
➀ 相等(相同)的对象必须具有相等的哈希码(或者散列码)。
➁ 如果两个对象的 hashCode 相同,它们并不一定相同。

猜你喜欢

转载自blog.csdn.net/ChenBinBini/article/details/106802401