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原创文章,未经本站允许不得转载。