Java final与private
1. 类中所有的private方法都隐式的指定为final的,由于无法取用private方法,所以也就无法覆盖它,可以对private方法添加final修饰符,但并没有添加任何额外意义。
2. 使用final方法的原因是把方法锁定,以防任何继承类修改它的含义。同时如果父类中的这个方法使用了private那么在子类也是不能重写这个方法。实例代码如下:
package com.game.lll; public class FinalOverriding { class WithFinals { private final void a() { System.out.println("WithFinals a"); } private void b() { System.out.println("WithFinals b"); } } class OverridingFinal extends WithFinals{ private final void a() { System.out.println("OverridingFinal a"); } private void b() { System.out.println("OverridingFinal b"); } } class OverridingFinal2 extends OverridingFinal{ private final void a() { System.out.println("OverridingFinal2 a"); } private void b() { System.out.println("OverridingFinal2 b"); } } private OverridingFinal2 of2 = new OverridingFinal2(); public static void main(String[] args) { FinalOverriding finalOverriding = new FinalOverriding(); finalOverriding.of2.a(); finalOverriding.of2.b(); OverridingFinal of = finalOverriding.of2; of.a(); of.b(); WithFinals wf = of; wf.a(); wf.b(); } }
运行结果: +------------------------------------------------------------------+ OverridingFinal2 a OverridingFinal2 b OverridingFinal a OverridingFinal b WithFinals a WithFinals b +------------------------------------------------------------------+
从结果上来看,子类OverridingFinal和OverridingFinal2都没有重写父类方法。在Java中类中private方法只能在供内部访问,所以子类是无法覆盖它。对private方法添加final和不加结果都是一样并没有任何意义。。下面对它做一些修改
第一步:将WithFinals的方法a()改为public
public final void a() { System.out.println("WithFinals a"); }
第二步:将OverridingFinal的方法a()也改为public
public final void a() { System.out.println("OverridingFinal a"); }
结果是编译错误: +------------------------------------------------------------------+ Cannot override the final method from FinalOverriding.WithFinals +------------------------------------------------------------------+
将private修改为public后,结果证明使用final修饰的方法是不能被重写的。如果我们把OverridingFinal和OverridingFinal2的b()方法改为public呢?那么OverridingFinal2方法b将会覆盖OverridingFinal的方法b。运行结果如下:
运行结果: +------------------------------------------------------------------+ OverridingFinal2 a OverridingFinal2 b OverridingFinal a OverridingFinal2 b WithFinals a WithFinals b +------------------------------------------------------------------+
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。