Java基础知识

来源:互联网 发布:陕西广电网络秦岭云 编辑:程序博客网 时间:2024/05/22 11:58

Ø  final, finally, finalize的区别。

Final是一个修饰符,可以用来修饰类,方法或变量。当它修饰一个类的时候,该类不能派生出子类,也就是不可被继承。当final又是方法时,该方法只能被调用,不能被改变,也就是说不可被重载。当final修饰变量时,该变量在声明时就必须被初始化,因为final变量在初始化后即不可改变,如果在初始化时不赋值则该变量的值就为空或者默认值,以后都不可改变。

Finally是异常处理中的语句,当发生异常时,会执行与一场类型匹配的catch后的语句,当处理完之后,还会继续执行finally后的语句,也就是说finally后的语句块总会被执行。

Finalize是垃圾回收机制中使用的方法。Java是自己进行垃圾回收的,程序员不必操心内存回收等机制,但如果需要在Java自动回收垃圾之前自己手动进行垃圾回收,就可以通过此方法实现需求。

Ø  Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

匿名内部类是没有名字的内部类,不可以继承其它类,但可以作为接口被其他匿名内部类实现。

Ø  Static Nested Class 和 Inner Class的不同

嵌套类是static类型的内部类,要创建嵌套类对象时,不需要外部类对象;在嵌套类里不能调用非static的变量和方法。内部类则不同,内部类隐式的保存了一个类对象的引用指向调用它的外部类。

Ø  &和&&的区别。

&是位运算符,是将操作符两遍的数按位与运算。

&&是布尔运算符,连接两个布尔表达式,当两个布尔表达式都为真时,结果为真。

Ø  HashMap和Hashtable的区别。

他们都属于Map接口的类,hasmap没有排序,允许一个null键和多个null值,hastable不允许有null键和null值,它比hasmap慢,因为它是同步的,是线程安全的。

Ø  Collection 和 Collections的区别。

Collection是Java.util下的接口,是各种集合结构的父接口。

Collections是Java.util下的类,包含各种集合操作的方法。

Ø  List, Set, Map是否继承自Collection接口?

List和Set是继承自Collection类,Map不是。

Ø  ArrayList和Vector的区别。

Vector是线程安全的,也就是说是同步的,ArrayList是线程不同步的,不安全的。

Vector容量增长时自动增长为原来长度的两倍。ArrayList一次增长原来的一半。

什么时候用assertion?

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

Ø  GC是什么? 为什么要有GC?

GC是垃圾回收器,是Java用来进行垃圾回收的机制。程序员不用关心内存回收问题,因为垃圾回收器会自动进行管理。如果要手动进行垃圾回收,可以调用以下方法:

System.gc() 或者Rantime.getRuntime().gc()

Ø  String s = new String("xyz");创建了几个String Object?

上面语句创建了两个对象,一个是对象”xyz”,另一个是指向对象xyz的引用对象s。

Ø  Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

Math.round(11.5)的记过是12;

Math.round(-11.5)结果是11;

Math.round(n)的计算过程是Math.round(n+1/2)之后四舍五入。因为返回最接近参数的 long。通过加上 1/2 将该结果舍入为整数,取结果的基数并将其强制转换为 long 类型。

Ø  short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

short s1 = 1; s1 = s1 + 1;会出现类型转换错误,因为s1+1操作会自动将结果转换为int型,然后将值付给s1,但s1是short类型的,将一个int数赋值给short会出现编辑错误。

short s1 = 1; s1 += 1;不会出错,因为+= 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

Ø  sleep() 和 wait() 有什么区别?

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

Ø  数组有没有length()这个方法? String有没有length()这个方法?

数组只有length属性没有length()方法,String有length()方法。

Ø  是否可以继承String类?

不可以,因为String类是final类型的,所有不能被继承。

Ø  Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

Orderload是重载,就是多个方法采用相同的方法名,以不同的参数列表来区分各个方法。

Override是覆盖,子类可以覆盖父类的方法,方法名,参数以及返回类型都相同,就相当于把父类的方法重写。

Ø  Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

用equals()方法来区分set里的元素是否相同,因为set里存储的是对象的引用,用equals()方法判断的是对象的引用是否相同,==判断的是对象的值是否相同。所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。

Ø  列举几个常见的runtime exception。

空指针异常NullPointerException

下标越界异常

Ø  error和exception有什么区别?

Error是系统级的错误,例如Java运行环境或硬件错误,无法处理,程序只能退出执行。

Exception是由于程序瑕疵造成的运行异常,程序必须对此类异常进行处理,

Ø  abstract class和interface有什么区别?

相同点:

都是抽象类,不能被实例化。

无论是接口的实现类还是抽象类的子类,都要实现各自需要实现的方法。

不同点:

A.interface需要实现,要用implements,而abstract class需要继承,要用extends。

  B. 一个类可以实现多个interface,但一个类只能继承一个abstractclass。

  C. interface强调特定功能的实现,而abstract class强调所属关系。

  D. 尽管interface实现类及abstrctclass的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

  这个选择有两点含义:

  一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrctclass中必须定义方法体。

  二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。

  E. abstractclass是interface与Class的中介。

  interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。

  abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

 

nterface的应用场合

  A. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。

  B. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。

  C. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。

  D. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

 

abstract class的应用场合

  一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:

  A. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。

  B. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。

  C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能

Ø  接口是否可继承接口? 抽象类是否可实现(implements)接口?

接口可以继承接口,抽象类也可以试下接口。因为抽象类中有可能包含有非抽象方法,这些方法是有方法体的,当抽象类实现某一接口时,就要在内部实现接口定义的方法。

构造器Constructor是否可被override(覆盖)?

因为构造器不能被继承,所以它不能被覆盖,但是可以重载构造函数。

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

编程题: 写一个Singleton出来。

package july;

 

publicclass SingletonTest {

 

    privatestatic SingletonTestsingletonTest =null;

    publicstaticsynchronizedSingletonTest getInstance() {

       if(null==singletonTest){

           returnnew SingletonTest();

       }else{

           returnsingletonTest;

       }

    }

}