24、abstract class和 interface有什么区别?
abstract class:抽象类,有抽象方法的类必须定义为抽象类,抽象类中的方法不一定都必须是抽象的。抽象类不能创建实例对象。抽象类中定义的抽象方法必须在具体的子类中实现,所以不能有抽象构造方法和抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为抽象的。
interface:接口,特殊的抽象类。接口中的方法默认为public abstract类型,接口中的成员变量默认为public static final类型。
两者在语法上的区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected 和(默认类型,虽然eclipse 下不报错,但应该也不行),但接口中的抽象方法只能是public 类型的,并且默认即为public abstract 类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final 类型,并且默认即为public static final 类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
两者在应用上的区别:接口更多的是在系统架构设计方面体现作用,主要用以定义模块之间通信的契约,而抽象类更多的是在代码实现方面体现作用,实现代码的复用。
25、abstract的 method是否可同时是 static,是否可同时是 native,是否可同时是 synchronized?
不可同时是static的,因为抽象的方法是要被子类实现。
不可同时是native的,因为native表示该方法要用另外一种平台的编程语言实现,不存在被子类实现的问题。
不可同时是synchronized,从没有见过,只有作用在具体的方法上才有意义。
26、什么是内部类?Static Nested Class和 Inner Class的不同。
内部类就是在一个类内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。
public class Outer { int out_x = 0; public void method() { Inner1 inner1 = new Inner1(); class Inner2 //在方法体内部定义的内部类 { public void method() { out_x = 3; } } Inner2 inner2 = new Inner2(); } public class Inner1 //在方法体外面定义的内部类 { } }
|
27、内部类可以引用它的包含类的成员吗?有没有什么限制?
可以引用,如果不是静态内部类,没有限制。
如果是静态内部类,不能引用外部非静态的成员,只能引用外部静态的成员。
28、Anonymous Inner Class (匿名内部类)是否可以 extends(继承)其它类,是否可以 implements(实现)interface(接口)?
必须可以。
29、super.getClass()方法调用
下面程序的输出结果是多少?
import java.util.Date; public class Test extends Date{ public static void main(String[] args) { new Test().test(); } public void test(){ System.out.println(super.getClass().getName()); } } |
答:结果是Test,要想得到父类的类名,可以用getClass().getSuperclass().getName()
30、String是最基本的数据类型吗?
不是,基本数据类型有:byte、short、int、long、char、float、double、boolean。
31、String s = "Hello";s = s + " world!";这两行代码执行后,原始的 String对象中的内容到底变了没有?
没有改变。string是被设计成不可改变的类。
String s=”Hello”,建立一个string对象,用s指向它,里面存放字符串“Hello”.
s=s+”world!”,再建立一个String对象,s指向它,里面存放的字符串是“Helloworld”。
32、是否可以继承 String类?
String是final的,不可继承。
33、String s = new String("xyz");创建了几个 String Object?二者之间有什么区别?
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区。
34、String和 StringBuffer的区别
String:提供了不可变的字符串,实现了equals方法。
StringBuffer:提供了可变的字符串,没有实现equals方法。
35、如何把一段逗号分割的字符串转换成一个数组?
方法一:正则表达式
String str="d,j,k,f,g,h,o,e,h,o,e"; String[] result=str.split(","); |
36、数组有没有 length()这个方法? String有没有 length()这个方法?
数组没有length()这个方法,有length属性。String有length()这个方法。
37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
答:对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac 编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String 对象。
写如下两行代码
String s ="a" + "b" + "c" + "d";
System.out.println(s== "abcd");
最终打印的结果应该为true。
38、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code会不会被执行,什么时候被执行,在 return前还是后?
会被执行
public class Demo { public static void main(String[] args) { System.out.println("main:"+Demo.test()); } static int test(){ int x=1; try{ return x; }finally{ ++x; System.out.println("finally:"+x); } } } |
输出结果:
finally:2 main:1 |
39、下面的程序代码输出的结果是多少?
public class Demo2 { public static void main(String args[]) { Demo2 t = new Demo2(); int b = t.get(); System.out.println(b); } public int get() { try { return 1; } finally { return 2; } } } |
Return 并不是让函数马上返回,而是return 语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally 语句后才真正开始返回。
40、final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final 类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。jvm不保证此方法总被调用。
41、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
42、error和 exception有什么区别?
error是错误,exception是异常。
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
43、Java中的异常处理机制的简单原理和应用。
异常指java程序运行时所发生的非正常情况或错误。java使用面向对象的方式来处理异常,它把程序中发生的每个异常都分别封装到一个对象来表示,该对象中包含异常的信息。
Java 对异常进行了分类,不同类型的异常分别用不同的Java 类表示,所有异常的根类为java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常。
系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch 处理或用throws 声明继续抛给上层调用方法处理,所以普通异常也称为checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch 处理或用throws 声明,所以系统异常也称为unchecked 异常。
44、请写出你最常见到的5个 runtime exception。
运行时异常:
NullPointerException、IndexOutOfBoundsException、ClassCastException、IllegalArgumentException、NoSuchElementException