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

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

  • 相关阅读:
    t=20点击发送pingback
    Hibernate 序列生成主键
    oracle创建存储过程
    mysql允许某ip访问
    ORACLE用户解锁
    oracle查询锁表
    oracle杀掉执行的死循环存储过程
    oracle以逗号分隔查询结果列表
    查询oracle的session数
    oracle存储过程-获取错误信息
  • 原文地址:https://www.cnblogs.com/liaolongjun/p/6758092.html
Copyright © 2011-2022 走看看