重载和覆盖(重写)的区别
同一个类中,方法名相同,参数列表不同(参数个数、类型、顺序),与方法返回值、修饰符无关叫重载。
在一个子类包含与父类同名方法的现象称为方法重写
Final,finally,finilize的区别
1.final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承
内部类要访问局部变量,局部变量必须定义成final类型。
2.Finaly是异常处理语句结构中的一部分,表示总是执行
3.Finalize是Object类中的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
String内部实现有哪几种方式?
直接赋值的方式和new String()的方式
String是内容不可变的字符串 。String底层使用了一个不可变的字符数组 (final char[])
而StringBuillder StringBuffer,是内容可以改变的字符串 。StringBuillder StringBuffer底层使用的可变的字符数组(没有使用 final来修饰)
.StringBuilder是线程不安全的,效率较高.而StringBuffer是线程安全的,效率较低
final底层实现?
final变量的赋值使用了putfiled
指令,JVM会在该指令后加入写屏障,保证其他线程读到它的值时不会出现未初始化的情况。那为什么使用了putfield指令后,就可以保证其他线程读到的一定是它初始化后的结果呢?下面,我们从内存层面继续往下看一下它的原理。
我们知道写屏障和读屏障一个重要的特性就是禁止指令间的重排序,特别是对于final域来说,编译器和处理器都需要遵从如下的两条规则:
- 任意构造函数中对一个final域的写入,与随后把这个构造对象的引用赋值给另一个引用变量,这两个操作不能重排序。言外之意:在对象引用为任意线程可见之前,对象的final域已经被正确的初始化过了。
- 初次读一个包含final域对象的引用,与之后初次读这个final域,这两个操作之间不能重排序。言外之意:只有得到了包含final域对象的引用,才能后读到final域的值。
final关键字通过上述的两条规则,保证了在写final域和读final域时的正确性。
多态和抽象类的区别
抽象
如果一个类中,只有方法定义,没有方法的具体实现,那么该方法就称为抽象方法。而拥有抽象方法的类叫做抽象类,使用关键字static定义,抽象类并不能直接实例化,如果想要实例化抽象类,那么需要抽象类变量指向其子类对象。
在抽象类中可以定义抽象方法,也可以定义具体方法,如果一个类继承抽象类,那么必须重写抽象类中定义的所有抽象方法。
抽象方法定义的意义在于,使用父类变量指向子类对象时,可以对抽象方法进行调用。
多态
①使用父类类型的引用指向子类的对象;
②该引用只能调用父类中定义的方法,不能调用子类中独有的方法;
③如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法;
④在多态中,子类可以调用父类中的所有方法;
⑤多态主要体现为方法重载和方法重写,相同的行为,不同的实现方式;
⑥多态的主要应用是多态参数和多态集合
⑦如果一个方法中有父类作为参数类型,就意味着可以给该方法传递任何一个子类对象。