《java入门第一季》之面向对象(final关键字)

/*
	final可以修饰类,方法,变量
	
	特点:
		final(可以修饰类),该(类)(不能被继承)。一旦修饰了一个类,这个类就不能被继承了!
		final以修饰方法,该方法可以被继承但是不能被重写。(覆盖,复写)
		final可以修饰变量,该变量可以被继承但是不能被重新赋值。因为这个变量其实是常量。
		
	常量:
		A:字面值常量
			"hello",10,true
		B:自定义常量
			final int x = 10;
*/

//final class Fu //无法从最终Fu进行继承,final是最终类,最终类是无法被继承的哦

class Fu {
	public int num = 10;
	public final int num2 = 20;
	
}

class Zi extends Fu {
	public void show() {
		num = 100;//注意这里是,num=100;不是int num = 100.该语句改变了num的值,即使使用super.num结果仍然是100(因为被重新赋值了)。没有被final修饰,不是最后的变量,还可以被重新赋值。
		System.out.println(this.num);
		System.out.println(super.num);
		
		//无法为最终变量num2分配值,该变量不能被重新赋值。因为这个变量其实是常量
		//num2 = 200;
		System.out.println(num2);
	}
}

class FinalDemo {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}



/*
	final修饰变量的初始化时机
		A:被final修饰的变量只能赋值一次。
		B:在构造方法完毕前。(条件是非静态的常量)
*/
class Demo {
	//int num = 10;
	//final int num2 = 20;//常量,无法为最终变量num2分配值
	
	int num;
	final int num2;//这样定义再给值是没有问题的
	
	{
		num2 = 10;//num2赋值只能给一次
	}
	
	public Demo() {
		num = 100;
		//无法为最终变量num2分配值
		num2 = 200;
	}
}

class FinalTest2 {
	public static void main(String[] args) {
		Demo d = new Demo();
		System.out.println(d.num);
		System.out.println(d.num2);
	}
}

/*
	继承的代码体现
	
	由于继承中方法有一个现象:方法重写。
	所以,父类的功能,就会被子类给覆盖调。
	有些时候,我们(不想让子类去覆盖掉父类的功能),(只能让他使用),final修饰之后只能被继承不能被重写。
	这个时候,针对这种情况,Java就提供了一个关键字:final
	
	final:最终的意思。常见的是它可以修饰类,方法,变量。
*/
class Fu {
	public final void show() {
		System.out.println("这里是绝密资源,任何人都不能修改");
	}
}

class Zi extends Fu {
	// Zi中的show()无法覆盖Fu中的show(),父类中的方法加上final后,子类没法对该方法进行重写了.报错
	public void show() {//报错
		System.out.println("这是一堆垃圾,你重写show方法就回报错");
	}
}

class ZiDemo {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}