java面试题(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jaylhsh/article/details/83140950

1、面向对象的特征:抽象、继承、封装、多态;

抽象:抽象就是只关注对象有哪些属性和行为,并不会去关注他的细节是什么;

继承:继承就是从已有类得到继承信息得到新类的过程。被继承的叫父类(基类),得到继承的叫子类(派生类);

封装:封装就是把能封装的数据或者方法给绑定起来,对数据和方法的访问只能通过已定义的简单的接口;

多态:多态就是允许不同子类型的对象对同一消息做出的不同响应。也就是说相同的对象调用相同的方法但做出了不同的响应。

再直白点就是方法的重载(overload)也可以理解为编译时的多态性。方法重写可以理解为运行时的多态 ;

2、String是不是基本数据类型?

不是。String是引用类型。Java基本数据类型只有8个:byte(-128~127)、short、int、long、float、double、char、boolean。除了这8个基本数据类型其他的都是引用类型;

3、用最有效率的方法计算2乘以8?

2<<3;(左移三位相当于2乘以2的三次方,右移三位相当于除以2的三次方 );

4、switch是否可以作用在byte上,是否能作用于long上,是否可以作用于String上?

在Java5以前switch(expr)中,expr只能是byte、short、int、char。jdk1.7及以上支持String;long目前还不支持;

5、数组有没有length()方法,String有没有length()方法?

在数组中length是属性,不是方法,所以没有,String中有length()方法;

6、构造器能否被重写?

不能;因为构造器(构造方法)不能被继承,所以不能被重写,但是可以被重载;

7、java中如何跳出当前多重嵌套循环?

在最外层加一个标记,如A,然后break A;即可跳出多重循环;

eg:A:for(省略){ break A; }

8、是否可以继承String类?

不可以,因为String是被final类;

9、如果两个对象值相同 x.equals(y)==true ,他们的hash code也相同,对不对?

对;如果满足前者,后者一定相同;如果后者相同,前者未必为true;

10、当一个对象被当作参数传递到一个方法后,这个方法可以改变这个对象的属性,并且可以返回改变后的结果,

那么这里到底是值传递还是引用传递?

值传递;Java语言的方法调用只支持参数的值传递;

11、String和StringBuilder、StringBuffer的区别?

简单的说就是String是只读字符串,不可修改,而StringBuilder和StringBuffer可以直接修改;

12、重载和重写的区别,重载的方法能否根据返回值类型进行去区分?

重载和重写都是实现多态的方式,区别在于前者是编译时多态,后者是运行时多态。重载发生在同一个类中,

重写发生在子父类中。一个类中同名的方法如果有不同的参数列表(参数类型不同,参数个数不同,

参数类型不同的情况下顺序不同),三者满足一个即视为重载;重写要求被重新的和重写的要有相同的返回类型;

对于重载方法,不要试图通过给予不同的返回值类型(参数列表完全相同)加以区分。

因为方法在调用时可以不将返回值赋值给一个对应的变量,这样就没有特征区分。

也不要试图通过在调用这样的重载方法时赋值给对应的变量加以区分,因为问题是出现在重载方法定义上,

而不是调用上。总而言之,Java不允许仅仅利用返回值的不同来区分重载方法。

13、cahr类型变量中能否储存一个中文汉字?

可以;一个char占2个字节(16比特),所以放一个中文是没问题的;

14、抽象类(abstract class)和接口(interface)有什么异同?

都不能实例化,但可以定义抽象类和接口类的引用;一个类如果继承了抽象类或者实现了某个接口,那么必须对其中的抽象方法全部实现。接口比抽象类更加抽象,因为抽象类可以定义构造器可以有抽象方法和具体方法,而接口中不能定义构造器,并且方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中全都是public的;抽象类可以定义成员变量,而接口定义的成员变量都是常量;有抽象方法的类必须声明为抽象类,而抽象类未必要有抽象方法;

15、java中会存在内存泄露吗?

理论上不会,因为java中有垃圾回收机制(GC)不会存在内存泄露问题。这也是java被广泛应用于服务器端编程

的一个重要原因;然而实际开发中,可能会存在无用但可表达的对象,这些对象不能被GC回收,

因此也会导致内存泄露的发生,如hibernate中的session(一级缓存)中的对象属于持久态,

GC不会回收这些对象,而这些对象可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)

一级缓存就可能导致内存泄露;

16、GC是什么?为什么要有GC?

GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的

不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,

Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() 。

17、String s = new String("abc");创建了几个对象?

两个。一个是静态区的abc,一个是用new创建在堆上的对象;

18、接口是否可以继承接口,抽象类是否可以实现接口,抽象类是否可以继承具体类?

接口可以继承接口,而且支持多重继承;抽象类可以实现接口,抽象类可继承具体类也可以继承抽象类;

19、一个.java源文件中是否可以包含多个类(不是内部类)?有什么限制?

可以,但是只能有一个公开类(public class)并且公开类名要与文件名完全一致;

20、java中final关键字有哪些用法?

修饰类表示类不可继承,修饰方法表示方法不可重写,修饰变量表示变量只能一次赋值以后值不可修改(常量);

21、error和exception的区别?

error表示系统级错误和程序不必处理的异常,是 恢复不是不可能但是很困难的情况下的一种严重问题。

比如内存溢出,不指望程序能处理这样的异常。exception表示需要捕捉或需要程序进行处理的异常,

是一种设计和实现问题。也表示如果程序正常从不会发生的某种情况;

22、try{}里面有个return语句,那么紧跟在后面的finally{}里的代码会不会执行,什么时候执行?

会执行,在方法返回调用者前执行;

注:如果有finally代码块,尽量不要再finally里修改返回值,因为有finally代码块的时候,try里面的return不会立马返回调用者,而是记录下返回值,待finally执行后再返回。如果在finally中修改了返回值,则返回修改后的值。

23、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用? 

简单点说:一个程序一般用try来执行一段代码,他可能会抛出异常(throw),可以通过catch来捕获它,或者通过总是执行的finally代码块来处理,throws是用来声明一个方法可能抛出的各种异常。

24、运行时异常和受检时异常有何异同?

异常表示程序运行中可能出现的非正常状态。运行时异常表示虚拟机通常操作中可能遇到的异常,跟程序设计有关,受检时异常也就是非运行时异常,跟上下文环境有关,java编译器要求必须抛出可能发生的受检异常,但不要求必须抛出未被捕获的运行时异常。

25、List、Set、Map是否继承Collection接口?

List和Set是,Map不是。Map是键值对映射容器,与List和Set有明显区别;

26、Collection和Collections的区别?

Collection是一个接口,它是List和Set的父接口;Collections是一个工具类,提供一系列的静态方法供容器操作,如搜、排序、线程安全化等等;

27、List、Set、Map三个接口存取元素时,各有什么特点?

List以特定索引存取元素,可以有重复项,Set不能有重复项(equals()来区分对象是否重复 ),Map保存键值对映射,映射关系可以是一对一或多对一。

28、Thread的sleep()方法和对象的wait()方法都可以让线程暂停,有何区别?

sleep()方法(休眠)是Thread的静态方法调用此方法会让当前线程暂停指定的时间,将执行机会让给其他线程,对象锁依然保持,休眠时间结束后自动恢复。wait()方法导致当前线程放弃对象的锁,线程暂停执行,进入对象的等待池(wait pool),只有调用对象的notify()方法,或者notifyAll()方法时才能唤醒等待池中的线程进入等锁池(lock pool)如果线程重新获取对象的锁就可以就如就绪状态;

29、编写多线程有几种实现方式?

java5以前实现多线程有两种:继承Thread类和实现Runnable接口。两种方式都要重写run()方法来定义线程行为;推荐用后者,因为jav继承是单继承,一个类只能有一个父类,如果继承了Thread就无法继承其他类,所以Runnable接口更为灵活。(Java5以后多了一种方法:实现Callable接口)

30、synchronized关键字的用法?

synchronized可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问;可以用synchronized(对象){...}定义同步代码块,或在声明方法时将synchronized作为方法修饰符。

31、事务的ACID是指什么?

原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项失败都会导致整个事务的失败;

一致性(Consistent):事务结束后系统状态是一致的;

隔离性(Isolated ):并发执行的事务彼此无法看到对方的中间状态;

持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败,通过日志和同步备份都可以在故障发生后重建数据; 

32、JDBC如何进行事务处理?

Connection提供事务处理的方法,通过调用setAutoCommit(false)可设置手动提交事务,事务完成后用commit()显示提交事务,如果处理过程中发生异常用rollback()进行回滚。

33、await/wait 与sleep、yield间的区别

await/wait 会释放锁释放了其获取的锁并阻塞等待而sleep、yield不会。

猜你喜欢

转载自blog.csdn.net/jaylhsh/article/details/83140950
今日推荐