java基础

重载和覆盖(重写)的区别

同一个类中,方法名相同,参数列表不同(参数个数、类型、顺序),与方法返回值、修饰符无关叫重载。

在一个子类包含与父类同名方法的现象称为方法重写

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定义,抽象类并不能直接实例化,如果想要实例化抽象类,那么需要抽象类变量指向其子类对象。

在抽象类中可以定义抽象方法,也可以定义具体方法,如果一个类继承抽象类,那么必须重写抽象类中定义的所有抽象方法。

抽象方法定义的意义在于,使用父类变量指向子类对象时,可以对抽象方法进行调用。

多态

①使用父类类型的引用指向子类的对象;

②该引用只能调用父类中定义的方法,不能调用子类中独有的方法;

③如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法;

④在多态中,子类可以调用父类中的所有方法;

⑤多态主要体现为方法重载和方法重写,相同的行为,不同的实现方式;

⑥多态的主要应用是多态参数和多态集合

⑦如果一个方法中有父类作为参数类型,就意味着可以给该方法传递任何一个子类对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值