【Java】学习笔记(1)-关于final

final关键字可以用来修饰类、方法和变量(成员变量和局部变量)

1.修饰类

被final修饰过的类叫做最终类,无法被继承,不会有子类

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

	/*
	public final void show() {
	
	}
	*/
}

class Zi extends Fu {
	// Zi中的show()无法覆盖Fu中的show()
	public void show() {
		num = 100;
		System.out.println(num);
		
		//无法为最终变量num2分配值
		//num2 = 200;
		System.out.println(num2);
	}
}
//测试类
class FinalDemo {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}

2.修饰方法

把方法锁定,以防被任何该方法所属类的继承类覆盖。
被final修饰的方法,不可被重写(覆盖)

//父类
class Fu {
	public final void show() {
		System.out.println("这里是绝密资源,任何人都不能修改");
	}
}
//子类(继承类)
class Zi extends Fu {
	// Zi中的show()无法覆盖Fu中的show()
	public void show() {
		System.out.println("这是一堆垃圾");
	}
}
//测试类
class ZiDemo {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}

报错:Zi中的show()无法覆盖Fu中的show()

3.变量

常量分为 1.字面值常量 “hello” “10” “meme” “michi”
2.自定义常量 final int x =10;
final修饰局部变量问题:
基本类型:基本类型的值不能发生改变。
引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。

class Student {
	int age = 10;
}

class FinalTest {
	public static void main(String[] args) {
		//局部变量是基本数据类型
		int x = 10;
		x = 100;
		System.out.println(x);    //    100
		final int y = 10;
		//无法为最终变量y分配值
		//y = 100;
		System.out.println(y);     //    10
		System.out.println("--------------");
		
		//局部变量是引用数据类型
		Student s = new Student();
		System.out.println(s.age);    //    10
		s.age = 100;
		System.out.println(s.age);     //      100
		System.out.println("--------------");
		
		final Student ss = new Student();
		System.out.println(ss.age);     //   10
		ss.age = 100;
		System.out.println(ss.age);    //     100
		
		//重新分配内存空间
		//无法为最终变量ss分配值
		ss = new Student();
	}
}

4.final修饰的变量初始化

被final修饰的变量只能赋值一次,1.是在定义的时候赋值,
2.在构造方法完毕前赋值(非静态常量)

class Demo {
	//int num = 10;
	//final int num2 = 20;
	int num;
	final int num2;
	
	{
		//num2 = 10;
	}
	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、finally、finalize有什么区别?


下一篇:JAVA常用工具类的使用 NumberUtils、CollectionUtils、Lists