每日十道面试题(二)

来源:互联网 发布:java游戏 编辑:程序博客网 时间:2024/05/16 01:21

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

前者有错,s1 = s1 + 1 后边的s1 + 1会将结果提升为int型进行运算,但是s1 为short型,所以必须显示的进行类型转换,后者虽然是对的,但是short的存储范围过小,还是有可能产生溢出的。

2. sleep和wait有什么区别?

sleep可以使线程休眠一段时间,在sleep时间间隔期满后,线程不一定立即恢复执行,因为在那个时刻,可能有其他线程在运行,所以如果1. 醒来的线程具有更高的优先级2. 正在运行的线程因为其他原因阻塞

wait是线程交互时,如果线程对一个同步对象x发出一个wait调用,该线程会暂停执行,被调用对象进入等待状态,直到被唤醒或者等待时间到。

3. java有没有Goto?

有goto关键字,但是没有使用,因为goto语句的频繁使用,会让程序变得特别繁琐,所以java没有使用goto,但是break和continue在循环中其实是一种类似goto的用法,因为我们可以利用break和continue退出或者继续循环。

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

数组没有length()这个方法,但是有length的属性,String有length这个方法,返回的是字符串的长度,同时从数组的length这个属性可以看出,数组在java中是一个引用类型,所以如果我们在java中定义了’final int [] a = new int[0];’,那么对于a[0],它的值是可以修改的。

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

方法重写override和方法重载overload是java多态性的不同表现,重写是父类与子类之间多态性的一种体现,重载是一个类中多态性的表现,如果我们在子类中定义和父类具有相同方法名和参数列表的方法,成为重写,子类对象调用这个方法的时候,会调用子类中的定义,对它而言,父类中的方法被“屏蔽”,如果在一个类中定义了仅方法名相同,参数列表不同的方法称为重载,可以改变重载方法的返回值,但不能仅仅改变返回值。

6. Set里边的元素是不能重复的,那么用什么方法来区分重复与否呢?使用==还是equals?,它们有什么区别呢?

Set里边的元素是不能重复的,那么用iterator方法遍历区分重复与否,equals方法是判断两个set是否相等。==方法决定引用值是否指向同一对象,比较的是地址;equals方法用来判定两个对象的内容和类型是否相同,比较的是内容。

7. error和exception有什么区别?

error表示恢复不是不可能但是很困难的情况下的一种严重问题,比如内存溢出的时候,不能指望程序员可以解决这种情况。

exception表示一种设计或者实现问题,也就是说,如果一个程序运行正常的情况下,从不会发生的情况。

8. List、Set、Map是否继承自Collection?

父类接口 子类实现 具体实现 Map接口 TreeMap 树 HashMap 哈希表 HashTAble 哈希表 Collection接口 List集合 ArrayList数组 LinkedList链表 Set集合 TreeSet树 HashSet哈希表

9. abstract class和interface有什么区别?

abstract class抽象类:抽象类中可以有私有变量或者私有方法抽象类不能创建实例,抽象类的子类可以有选择的实现方法,但是可以创建一个抽象类的引用,指向具体的实现子类。一个类只能继承一个超类,

interface接口:接口是公开的,不能有私有变量或者私有方法,接口一定要实现所有方法,接口可以实现多重继承,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.。

一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

10. 抽象类中的方法是否可以同时是static,是否可以同时是native,是否可以同时是synchronized?

  1. native:声明本地方法的关键字,它只有方法声明,没有方法实现,但是它将方法的具体实现交给了本地系统的函数库,没有通过虚拟机,这是java语言与其他语言通信的一种机制。很显然我们不能对一个抽象类中的方法既声明为abstract又声明为native。(但是如果在抽象类中利用本地实现该方法如何?)

  2. static:声明静态方法的关键字,首先需要注意的是类其实也是一个对象,抽象类不能产生实例对象,但是类加载机制必然会为一个抽象类产生一个class对象,所以在抽象类中可以定义static方法,因为static方法依赖的是class对象,所以在抽象类中可以定义一个static方法,但是static方法不能被重写,所以我们需要在抽象类中完成静态方法的实现,而且使用AbstractClass.staticMethod()调用。(但这样子有什么意义?)

  3. synchronized:声明同步方法的关键字,这个关键字有两种用法,synchronized方法和synchronized块,但是无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁,而且每个对象只有一个锁(lock)与之相关联,同时实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。从synchronized的原理中我们可以得出synchronized依赖的是对象,那么抽象类有一个class对象,所以我们也可以在抽象类中定义同步方法,有趣的是,当我们定义了同步方法,只能在子类中重写他,但是还需要在抽象类中具有方法体,如果我们将同步方法同时声明为static的,那么就可以直接利用抽象类调用它。

    synchronized原理

    抽象类中到底可以不可以定义static?博客

0 0
原创粉丝点击