Java面试题二
1.Overload和Override的区别。Overload的方法是否可以改变返回值的类型?
Overload:重载 Override:重写
重载:
同一个类中,方法名相同,参数列表不同。与返回值类型无关。
重写:
存在于子父类,或者子父接口中,方法声明相同。
Overload的方法可以改变返回值的类型,因为它与返回值类型无关。
二.String 和 StringBuilder、StringBuffer 的区别?
String:不可变字符串;
StringBuffer:可变字符串、效率低、线程安全;
StringBuilder:可变字符序列、效率高、线程不安全;
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
三.抽象类(abstractclass)和接口(interface)有什么异同?
相同点
1两者都是抽象类,都不能实例。
2.接口的实现类或者抽象类的子类都必须实现了接口或者抽象类中的方法后才可以被实例化。
不同点
1.抽象类抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类。
接口只可以继承接口(一个或多个);子类可以实现多个接口。
2.抽象方法可以有public、protected和default这些修饰符。
接口方法默认修饰符是public。
3.抽象可定义构造方法,可以有抽象方法和具体方法。
接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现。
4.抽象子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。
接口子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。
5.抽象为了把相同的东西提取出来,即重用。
接口为了把程序模块进行固化的契约,是为了降低耦合
四.Stringst=null 和 Stringst= “ ”的区别?Strings=newString(“xyz”)创建了几个对象?
tring s = null;
表示一个空串,没有占用了空间,不在内存中开辟空间
string s = "";
在内存中开辟空间,但空间中没有值(""也是一个字符串)
表示一个空串,被实列化了,占用了内存空间
null 表示一个空引用,
"" 表示一个空字符串,
五.final、finally 和 finalized 的区别?
final:修饰为常量,一旦作为方法的形参或局部变量、全局变量使用,一旦赋值,就不能在被修改
finally:通常和try...catch...finally搭配使用,中无论是否发生异常,都会执行finally里的方法
finalized:方法名,在执行垃圾处理时,会进行调用此方法进行前期的处理工作;
六.throw 和 throws 的区别、及处理方式?
Throw:
- 作用在方法内,表示抛出具体异常,由方法体内的语句处理。
- 具体向外抛出的动作,所以它抛出的是一个异常实体类。若执行了Throw一定是抛出了某种异常。
Throws:
- 作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理。
- 主要的声明这个方法会抛出会抛出某种类型的异常,让它的使用者知道捕获异常的类型。
- 出现异常是一种可能性,但不一定会发生异常。
七.用 Java 写一个单例类?
饿汉式单例
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
懒汉式单例
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}
八.下边程序输出是什么,并说明为什么?
import java.util.Date;
public class Test extends Date{
public static void main (String [] args){
newTest().test();
}
public void test(){
System.out.println(super.getClass().getName());
}
}
输出结果是Test
super.getClass()是表示调用父类的方法。getClass方法来自Object类,它返回的对象是正在运行时的类型。在这里,正在运行时的对象类型是Test,所以this.getClass()和super.getClass()都是返回Test。
本人只是java学习中的小学生,有更好的想法请说明并解释,不然我怕我看不懂[捂脸]。