Java面试基础部分(2)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值