信息发布→ 登录 注册 退出

Java全面细致讲解final的使用

发布时间:2026-01-11

点击量:
目录
  • 一、理解
  • 二、作用
    • 1. 修饰-类
    • 2. 修饰-方法
    • 3. 修饰-变量
      • 3.1 修饰-成员变量(属性)
      • 3.2 修饰-局部变量
  • 三、经典题目

    一、理解

    final:最终的

    二、作用

    final 可以用来修饰的结构:类、方法、变量

    1. 修饰-类

    final 用来修饰一个类,表示此类不能被其它类所继承,提高安全性,提高程序的可读性。

    比如:String类、System类、StringBuffer类…

    代码演示:

    final class A{
    }
    class B extends A{ //错误,不能被继承。
    }

    2. 修饰-方法

    final 用来修饰方法:表明此方法不能被子类重写。

    比如:Object类中getClass();

    代码演示:

    class A {
       public final void print() {
         System.out.println("A");
       } 
    }
    class B extends A {
        public void print() { 
        // 错误,不能被重写。
        } 
    }
    

    3. 修饰-变量

    final 修饰的变量(成员变量或局部变量)称为常量。名称大写,且只能被赋值一次。

    static final 用来修饰属性:全局常量。

    代码演示:

    class A {
       private final String INFO = "嘻嘻"; //声明常量
         public void print() {     
         //INFO = "哈哈";
         //The final field A.INFO cannot be assigned
         } 
    }

    3.1 修饰-成员变量(属性)

    final 标记的成员变量必须在声明(显式初始化)时或在 每个构造器中或代码块中显式赋值,然后才能使用。

    如:final double MY_PI = 3.14;

    3.2 修饰-局部变量

    使用 final 修饰局部变量时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,且不能进行重新赋值。

    三、经典题目

    //题目一:
    public class Test1 {    
            public int addOne(final int x) {
             //   return ++x;
             //Cannot assign a value to final variable 'x'
                return x + 1;
            }
    }
    //题目二:
    public class Something {
        public static void main(String[] args) {
           Other o = new Other();
           new Something().addOne(o);
        }
        public void addOne(final Other o) {
           // o = new Other();
           o.i++;
         } 
    }
    class Other {
       public int i; 
    }
    //题目三:
    class Root{
    	static{
    		System.out.println("Root的静态初始化块");
    	}
    	{
    		System.out.println("Root的普通初始化块");
    	}
    	public Root(){
    		super();
    		System.out.println("Root的无参数的构造器");
    	}
    }
    class Mid extends Root{
    	static{
    		System.out.println("Mid的静态初始化块");
    	}
    	{
    		System.out.println("Mid的普通初始化块");
    	}
    	public Mid(){
    		super();
    		System.out.println("Mid的无参数的构造器");
    	}
    	public Mid(String msg){
    		//通过this调用同一类中重载的构造器
    		this();
    		System.out.println("Mid的带参数构造器,其参数值:"
    			+ msg);
    	}
    }
    class Leaf extends Mid{
    	static{
    		System.out.println("Leaf的静态初始化块");
    	}
    	{
    		System.out.println("Leaf的普通初始化块");
    	}	
    	public Leaf(){
    		//通过super调用父类中有一个字符串参数的构造器
    		super("小老师ir");
    		System.out.println("Leaf的构造器");
    	}
    }
    public class LeafTest{
    	public static void main(String[] args){
    		new Leaf(); 
    		System.out.println();
    		new Leaf();
    	}
    }
    /*output:
    Root的静态初始化块
    Mid的静态初始化块
    Leaf的静态初始化块
    Root的普通初始化块
    Root的无参数的构造器
    Mid的普通初始化块
    Mid的无参数的构造器
    Mid的带参数构造器,其参数值:小老师ir
    Leaf的普通初始化块
    Leaf的构造器
    Root的普通初始化块
    Root的无参数的构造器
    Mid的普通初始化块
    Mid的无参数的构造器
    Mid的带参数构造器,其参数值:小老师ir
    Leaf的普通初始化块
    Leaf的构造器
    */
    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!