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 修饰了)
    	}
    
    }
    

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

  • 相关阅读:
    ZT等占空比任意整数分频器的verilog语言实现
    并行输入的CRC32校验算法
    在Quartus II_10.1上跑一个用ModelSim仿真的简单例子
    QUARTUS II_10.1安装步骤
    ZT基于FPGA的CRC校验码生成器
    2013.09.17学习计划
    外设capsense的简单调用
    OrCAD学习笔记1
    路程之相遇问题
    ZT电路板设计软件及公司知识普及
  • 原文地址:https://www.cnblogs.com/liaolongjun/p/6758092.html
Copyright © 2011-2022 走看看