zoukankan      html  css  js  c++  java
  • 为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?

    为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?

    public class Ace {
    
    	public static void main(String[] args) throws Exception {
    		go1();
    		go2(); // 这个编译不能通过,运行不了,详情看下面的说明
    	}
    
    	static void go1() {
    		final int n = 5;
    
    		new Ace() {
    			void go() {
    				test(n); // 并不会改变 n 的值
    			}
    
    			void test(int n) {
    				n = 10;
    			}
    		}.go();
    
    		System.out.println(n); // 输出 5
    	}
    
    	static void go2() {
    		int n = 5;
    
    		new Ace() {
    			void go() {
    				n = 10;
    				// 这里我们假设不需要 final 修饰,假设这么写不报错
    				// (实际是报错了,Java8 可以不 final 修饰,但这么写也会报错)
    			}
    		}.go();
    
    		System.out.println(n); // 如果上面不报错的话,这里是不是应该输出 10 呢?答案是不会。
    		// 但是,这么写,会让人很自然的以为 n 的值已经变成 10 了。
    		// 而实际上,n 的值在内部类中变化,在外面是不会变的
    		// 为了让玩家避免犯“很自然”的错误,干脆强制要 final 修饰得了
    		// (让你在内部类中不能改变它,也就不会有上面很自然的错误了)
    		// (Java8 中不需要 final 修饰,但是在内部类中改变时会报错,等于是在进入内部类后,默认 final 修饰了)
    	}
    
    }
    

     再也不想纠结这个问题了! 

  • 相关阅读:
    C#随笔
    C# 程序间通信的各种途径及解析
    C#控件根据窗体改变大小
    c# SqlHelper Class
    初始Java
    函数基础
    基本数据类型的高级特性:
    python基础
    C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
    Oracle使用dblink导入数据
  • 原文地址:https://www.cnblogs.com/liaolongjun/p/6758092.html
Copyright © 2011-2022 走看看