java常见面试题
面向对象的三大特征
封装:
封装的意义就是 保护程序 保护数据
1)举例来说类就是一种封装,他封装的是对象的属性和行为
2)还有就是方法,方法封装的是特定的业务逻辑功能实现
3)访问控制修饰符(private protected) 封装的是具体的访问权限
继承:
1)作用:代码复用
2)体现在父类和接口和子类当中 超类(所有派生类所共有的属性和行为) 接口(部分派生类) 派生类(特有的)超类和接口都可以看成超类
3)继承的特点是,具有传递性,就是说可以有父亲辈,爷爷辈;一个类只能继承一个父类,但是可以通过实现多个接口 来间接的达到多继承的概念
多态:
1)意义:行为多态(所有抽象方法都是多态)
对象多态(所有对象都是多态的)
2)一般都会用到向上造型、强制类型转换即向下造型。
3)表现形式:
重写:根据对象的不同来表现多态
重载:根据参数的不同来表现多态
请分别描述 final finally finalize?
final是一个关键字,作用是可以修饰类、变量、方法。修饰类的时候 类是不可以被继承的;修饰变量的时候 值是不可以改变的;修饰方法的时候 方法是不可以被重写的。
finally是异常处理机制当中的最后一部分。
他可以却保只要代码执行到try里面,那么finally里的代码一定可以执行。通常把释放资源这样的事放在里面,比如文件操作中的close方法。
finalize定义在java中的object类中 ,他不是功能方法,他是给jc(javac_用的)。
只要类的finalize被调用了说明这个类要被回收了,即是类中最后一个被调用的方法就跟临终遗言一样。
HashMap特点?
HashMap又称散列表、哈希表。使用散列算法实现的Map,当今世界上查询速度最快的数据结构,查询速度最快,查询速度最快。
Map实际上内部保存元素还是使用的数组来保存元素,散列表是根据key元素的hashcode值直接计算出其在数组下标的位置,这样就避免了查询过程中遍历数组这样的操作,所以查询效率不受数组数据量的多少而变化。
hashCode方法是Object定义的方法,意味着所有的类都具有该方法。
在HashMap的使用中存在一种情况,当两个Key的hashCode值相同时(即HashMap在内部数组保存时的下标相同)但equals比较不同时(HashMap认为他们是不重复的Key)那么就会在HashMap内部的数组对应位置处出现一个链表。
来保存这两组键值对。
由于链表缺点是遍历速度慢,因此在HashMap中出现链表会影响查询性能。
Object提供的两个方法已经妥善解决上面问题,但是有时候我们定义的类会去重写equals方法,API文档中Object对这两个方法的解释明确说明了上述问题。
重写时要遵守以下原则:
1.成对重写。即我们重写一个类的equals时还应当重写hashCode方法。
2.一致性。当两个对象的equals比较为true时,hashCode方法返回的数字必须相等。反之不是必须的但是尽量保证当两个对象hashCode值相同时equals比较也为true,否则会在HashMap使用中作为Key存在时形成链表,影响查询性能。
3.稳定性。当一个对象中参与equals方法比较的属性值没有发生变化的前提下多次调用hashCode方法返回的数字应当不变。
可以直接根据hashcode值判断两个对象是否相等吗?
肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
为啥重写equals方法的同时,必须重写hashCode方法?
我们重写equals时,是为了用自身的方式去判断两个自定义对象是否相等,然而如果此时刚好需要我们用自定义的对象去充当hashmap的健值使用时,就会出现我们认为的同一对象,却因为hash值不同而导致hashmap中存了两个对象。因为默认情况下,hashCode方法是将对象的存储地址进行映射。从而才需要进行hashcode方法的重写。
匿名内部类有.class文件吗?
有。内部类名字为 外部类名$内部类名.class,匿名内部类名字为 外部类名$数字(以1开始).class