V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
pumpkin
V2EX  ›  问与答

关于 Thinking In Java 中的一个问题

  •  
  •   pumpkin · 2016-12-17 20:33:13 +08:00 · 1702 次点击
    这是一个创建于 2899 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在仔细看这本书

    1. 中文版第四版 191 页,讲的内部类,有这么一句话

    “如果想从外部类的非静态方法之外的的任意位置创建某个内部类的对象,那么必须像在 main()方法那样,具体指明这个对象的类型: OuterClassName.InnerClassName ”

    这句话是翻译错误了吗,还是我理解有误。非静态方法之外的任意位置是指“静态方法内”吗?如果是静态方法内我试了不用加 OutClassName 这个前缀。非静态方法明显也不用,这是怎么回事?

    1. 第 198 页
    public class Parcel9{
    	public Destination destination(final String dest){
    		return new Destination(){
    			private String bebel = dest;
    			public String readLabel(){
    				return label;
    			}
    		};
    	}
    
    	public static void main(String[] args){
    		Parcel9 p = new Parcel9();
    		Destination d = p.destination("Tasmania");
    	}
    }
    
    

    “如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象, 那么编译器器参数引用是 final 的”

    199 页

    “下面是带实例初始化的 “ Parcel ”。注意 destination() 的参数必须是 final 的,因为它们是在匿名内部类使用 ”

    public class Parcel10{
    	public Destination destination(final String dest, final float price){
    		return new Destination(){
    			private int cost;
    			{
    				cost = Math.round(price);
    				if(cost > 100){
    					System.out.println("Over budget");
    				}
    			}
    			private String label  = dest;
    			public String readLabel(){
    				return label;
    			}
    		};
    	}
    	public static void main(String[] args){
    		Parcel10 p = new Parcel10();
    		Destination d = p.destination("Tasmania", 101.395F);
    	}
    }
     
    
    

    这上面的 final 我试了都可以不用加,是 Java 后面更新了所以不用了吗?

    各位看看,谢谢大家

    3 条回复    2016-12-17 21:01:40 +08:00
    fantastM
        1
    fantastM  
       2016-12-17 20:56:39 +08:00   ❤️ 1
    Java 编程思想是基于 JDK5 版本的。
    2. 新版 JDK 中(似乎 7 还是不支持的),传入匿名内部类的参数,若无 final 的话,编译器会为你加一个。你可以试一下,传入匿名内部类一个无 final 修饰的参数,然后在内部类中修改它会出现什么情况。
    int i = 1;
    Runnable r = () -> i=2;
    1. 这屌翻译的意思就是。
    class Out {
    class Inner {
    }
    }
    然后调用是这样子:
    Out out = new Out();
    Out.Inner inner = out.new Inner();
    就是这个 Out.Inner
    twm
        2
    twm  
       2016-12-17 20:58:21 +08:00
    你可以不加,但是不能更改对应值。
    Lonely
        3
    Lonely  
       2016-12-17 21:01:40 +08:00
    可以不写 final ,但是这种情况下你不能更改值,不然就会报错,你可以试下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2590 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 15:35 · PVG 23:35 · LAX 07:35 · JFK 10:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.