final这个专一的关键字

final变量一旦初始化,则不允许修改

特点: 在构建对象是final属性必须进行赋值,不管采用的是直接赋值、非静态代码块赋值、构造器赋值三种方法中的哪一种,但是一旦被赋值则不允许对其进行修改。
例如:

class Test{
    
    
	final String name = "申霄楠";
	final String Id;
	final Integer age;//初始化的同时可以直接赋值,也可以在代码块中进行赋值或者构造器中进行赋值
	final Date birth;
	{
    
    //代码块,不管执行的是哪个构造器,这个代码块一定执行
		age = 100;
	}
	public Test(){
    
    
		birth = new Date();
		name1 = "birth";
	}
	public test(String Id){
    
    
		birth = new Date();
		age = 99;//语法报错,已经赋值了
		this.Id = Id;
		//final属性也可以通过构造器的参数进行赋值,不是必须为字面量
	}
	public void func(){
    
    
		name = "shenxiaonan";//报错,已经赋值不能对其进行修改
	} 
}	

局部变量

局部变量要求声明的同时必须赋初值,也可以先声明后赋值,但是在变量使用之前必须进行赋值,同时一旦赋值便不能对其修改

public Test{
    
    
	public static void main(String[] args){
    
    
		
	}
}
//普通类
class Comman{
    
    
	//成员属性
	public void func1(int number){
    
    
		final int num = 123;
		final String str;
		if(number%2==0)
			str = "abc";
		else
			str = "123";
		System.out.println(str);
	}
	public void fun2(final int num){
    
    
		num++;//语法报错,在方法内部不允许进行修改
	}
}

修饰方法
如果有final关键字修饰的方法,则不允许子类继承修改

class Common{

	public final void func(){
		System.out.println("Common.func()");
	}
}

class SonCommon extends Common{//继承
	public final void func(){//语法报错,final修饰的方法不能被继承
		System.out.println("SonCommon.func()");
	}
}

修饰类

当final关键字修饰的类时,该类不允许被继承

//不能被继承
final class Parent{
    
    
}
class Son extends Parent{
    
    //语法报错
}

//要想被继承
final class Parent{
    
    
	private Parent(){
    
    }
	private Parent(int age)[}
}
class Son extends Parent{
    
    
	public Son(){
    
    
		super(100);//调用Parent类中的Parent(int age){}这个构造器
	}
}

注意由于String、StringBuffer、StringBuilder的类型是final,所以不可以通过继承的方式重新定义

修饰对象

public class Test{
    
    
	public String name;
	public int age;
	public void setName(String name){
    
    
		this.name = name;
	}
	public static void main(String[] args){
    
    
		final Test test = new Test();//test存放的是Test对象的地址
		test = new Test();//语法报错,不允许重新赋值
		test.setName("beijing");//修改的是属性,而不是修改的test对象的地址
	}
}

总结如下:

  • final属性是修饰的变量可以在声明的同时进行赋值,也可以在构造器或者非静态代码块中进行赋值,一旦赋值不允许修改;
  • final修饰的局部变量可以在声明的同时进行赋值,也可以在第一次使用之前进行赋值,一旦赋值则不允许修改;
  • final针对复杂类型表示的是不允许修改引用,而不是不允许修改引用对象中的属性;
  • final修饰方法,则这个方法不允许在子类中进行覆盖定义,子类中只能继承父类的final方法,但是不允许对继承来的父类方法进行重写;
  • final修饰类,则这个类不能被其他类继承

Guess you like

Origin blog.csdn.net/ananhenku/article/details/121736105