8.java基础-final

☆final关键字

final关键字是最终的意思,可以修饰类,成员变量,成员方法。

被final修饰的特点

A:它修饰的类,不能被继承。
B:它修饰的方法,不能被重写。
C:它修饰的变量只能被赋值一次。
1:对于基本类型 值不能发生改变
​2:对于引用类型 地址值不能发生改变,但是对象的内容是可以改变的

/*
	继承的代码体现
	由于继承中方法有一个现象:方法重写。
	所以,父类的功能,就会被子类给覆盖调。
	有些时候,我们不想让子类去覆盖掉父类的功能,只能让他使用。
	这个时候,针对这种情况,Java就提供了一个关键字:final
	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();
	}
}

具体报错如下:
无法重写final方法

/*
	final可以修饰类,方法,变量
	特点:
		final可以修饰类,该类不能被继承。
		final可以修饰方法,该方法不能被重写:@override。
		final可以修饰变量,该变量不能被重新赋值。
		
	常量:
		A:字面值常量
			"hello",10,true
		B:自定义常量
			final int x = 10;
*/

//final class Fu //无法从被final修饰的Fu类进行继承

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();
	}
}

final关键字面试题

final修饰局部变量&成员变量

在方法内部,该变量不可以被改变。
在方法声明上,分别演示基本类型和引用类型作为参数的情况。

☆基本类型,是值不能被改变
☆引用类型,是地址值不能被改变

注意:局部变量和成员变量都是变量。上面的结论对于成员变量一样适用。

/*
	面试题:final修饰局部变量的问题
		基本类型:基本类型的值不能发生改变。
		引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。
*/
class Student {
	int age = 10;
}

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

☆final修饰变量的初始化时机:构造方法完毕前

必须在对象构造完毕之前完成final修饰变量的初始化。
final修饰变量的初始化时机:
A:被final修饰的变量只能被赋值一次。
B:在构造方法完毕前必须初始化完成。(非静态的常量)
final修饰变量的初始化的位置
1.声明时为成员变量赋值。
2.构造代码块赋值。
3.构造方法中通过代码或者局部代码块赋值。
4.构造方法的局部代码块。
不能在非构造方法的局部代码块中赋值,因为没有在构造方法完毕前初始化完成。

package study.finals;
class Demo {

	/*	
	虽然成员变量有默认值,但是如果没有对num2做任何显式赋值操作会报错
	final int num2=100;
	*/

	/*
	1.声明时为成员变量赋值
	final int num2=100;
	*/

	/*	
	2.构造代码块赋值
    {
        num2=100;
    }
    */

    int num = 10;
    final int num2;

    public Demo() {
		/*
		3.构造方法中通过代码赋值
		如果num2已经被赋值,那么无法为最终变量num2分配值,因为被final修饰的变量只能赋值一次。
		num2 = 300;
		*/

         /* 4.构造方法中局部代码块赋值               
         {
            num2 = 300;
         }
          */
        num2 = 300;
        num = 100;
    }
	/*
	报错:不能在非构造方法的局部代码块中赋值,因为没有在构造方法完毕前初始化完成。
	public void method() {
		{
			num2 = 300;
		}
	}
	*/
}

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

你可能感兴趣的:(java基础,java)