每天十道面试题(第三天)

1、abstract class(抽象类)和interface(接口)有什么区别?

1)抽象类要被子类继承,接口要被类实现。

2)接口只能做方法声明,抽象类中既可以作方法声明,又可以做方法实现。

3)接口里定义的变量只能是公共的静态的常量,默认即为public static final类型,抽象类中的变量是普通变量。

4)接口是设计的结果,抽象类是重构的结果。因此抽象类中可以有构造方法,而接口中不能有构造方法。

5)抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。

6)抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。

7)抽象类主要用来抽象类别,接口主要用来抽象功能。

2、Overload(重载)和Override(重写)的区别。

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

1)重载必须有不同的参数列表,重写参数列表必须与被重写方法的参数列表相同。

2)重载可以有不同的返回类型,重写返回值类型必须与被重写方法的返回值类型相同。

3)重载可以有不同的访问修饰符,重写访问修饰符的限定必须大于被重写方法的访问修饰符(public>protected>default>private)。

4)重载可以抛出不同的异常,重写方法一定不能抛出新的检查异常或者重写的方法申明更加宽泛的检查异常。

3、String 和StringBuffer的区别?

1)内部实现方式方面,String在处理字符串时会生成新的对象,StringBuffer不会生成新的对象,所以StringBuffer在内存使用上优于String。

2)使用情况方面,String类型的字符串内容不可变,所以只能在字符串固定时使用,如果字符串需要增加、删除、修改,那么需要使用StringBuffer,因为StringBuffer提供的字符串内容可以改变。

3)字符串追加的方式方面,StringBuffer类有专门的附加方法append()追加字符,而String类型只能使用‘+’操作符添加字符到一个已经存在的字符串后面,StringBuffer在这一方面效率更高。

String s = s1 + s2;
String s = new StringBuffer(s1).append(s2).toString();//两个语句功能相同

4、String, StringBuffer StringBuilder的区别。

1)可变不可变方面,String类中使用字符数组保存字符串,即private final char value[],因为有“final”修饰符,所以可以知道string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,即char[] value,可知这两种对象都是可变的。

2)多线程安全方面,String中的对象是不可变的,也就可以理解为常量,显然线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。下面我们来看一下StringBuffer的源码:

public synchronized StringBuffer reverse() {
    super.reverse();
    return this;
}
 
public int indexOf(String str) {
    return indexOf(str, 0);        //存在 public synchronized int indexOf(String str, int fromIndex) 方法
}

如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

5、描述一下JVM加载class文件的原理机制?

1)装载:查找和导入class文件;

2)连接:

  • 检查:检查载入的class文件数据的正确性;

  • 准备:为类的静态变量分配存储空间;

  • 解析:将符号引用转换成直接引用(这一步是可选的)

3)初始化:初始化静态变量,静态代码块。

这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

6、char型变量中能不能存贮一个中文汉字?为什么?

可以。

1)java采用unicode编码,2个字节(16位)来表示一个字符, 无论是汉字还是数字,字母,或其他语言都可以存储。

2)char 在java中是2个字节。

所以可以存储中文。

7、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

都不可以。

1)抽象 的方法出现在接口中,它是需要类去实现的,具体的实现类可以native和synchronized,但是对于抽象方法来说没有意义。static方法不能被覆盖,而抽象方法就是要在实现类中覆盖它,所以也没有意义。

2)抽象方法需要重载,static修饰的是静态的类方法,不需要进行重载。抽象是没有实现的方法,而native是本地实现的方法。抽象不可能实际调用,也没有必要用synchronized修饰。

8、静态变量和实例变量的区别?

1)语法角度来看,静态变量前要加static关键字,而实例变量前不加。

2)程序运行角度来看,实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码文件,不用创建任何实例象,静态变量就会被分配空间,静态变量就可以被使用了。

总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

9、是否可以从一个static方法内部发出对非static方法的调用?

不可以。

为因为静态方法里面只能调用静态方法或静态成员。非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,static方法调用不用创建对象,就可以直接调用。

10、String s=new String(“xyz”);创建了几个String Object?

可能是一个,也可能是两个。

因为如果全局共享的字符串常量池中没有“xyz”字符串实例时,必须创建一个字符串对象实例,加上通过new String(String)创建并初始化的、内容与“xyz”相同的实例,就是两个。如果说字符串常量池中有“xyz”字符串实例,那么就是创建了一个。

发布了25 篇原创文章 · 获赞 44 · 访问量 2945

猜你喜欢

转载自blog.csdn.net/abc701110/article/details/105540889