V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
captainXxX
V2EX  ›  Java

Think In Java 中的问题,求助大神

  •  
  •   captainXxX · 2016-04-10 21:19:03 +08:00 · 2614 次点击
    这是一个创建于 3155 天前的主题,其中的信息可能已经有所发展或是发生改变。

    package chapter10;

    public class Parcel2 { class Contents { private int i = 11; public int value() {return i;} }

    class Destination {
    	private String label;
    	Destination(String whereTo) {
    		label = whereTo;
    	}
    	String readLabel() {return label;}
    }
    
    public Destination to(String s) {
    	return new Destination(s);
    }
    
    public Contents contents() {
    	return new Contents();
    }
    
    public void ship(String dest) {
    	Contents c = contents();
    	Destination d = to(dest);
    	System.out.println(d.readLabel());
    }
    
    public static void main(String[] args) {
    	Parcel2 p = new Parcel2();
    	p.ship("Tasmania");
    	Parcel2 q = new Parcel2();
    	Parcel2.Contents c = q.contents();
    	Parcel2.Destination d = q.to("Borneo");	
    }
    

    } 如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像在 main()方法中那样,具体致命这个对象的类型: OuterClassName.InnerClassName.这句话怎么理解?

    13 条回复    2016-04-11 14:45:51 +08:00
    SoloCompany
        1
    SoloCompany  
       2016-04-10 23:00:54 +08:00 via iPad
    你这代码肯定是弄错了, Destination 不是内部类,不能加前缀
    a0000
        2
    a0000  
       2016-04-11 08:31:10 +08:00
    外部类 1

    <pre>
    public class Outer {
    // 内部类
    public class Inner {

    }
    // <b>1 、外部类的非静态方法之外(成员变量)</b>
    Inner inner = new Inner();

    // <b>2 、外部类的非静态方法之外(静态变量)</b>
    static Inner inner2 = new Outer().new Inner();

    // <b>3 、外部类的静态方法</b>
    public static Inner staticMethod() {
    Inner inner = new Outer().new Inner();
    return inner;
    }

    // 外部类的非静态方法
    public Inner nonStaticMethod() {
    Inner inner = new Inner();
    return inner;
    }

    }
    </pre>

    外部类 2
    <pre>

    import com.a0000.Outer.Inner;

    public class Outer2 {
    // <b>5 、建议这样写,这样写层次很明显( Inner 是 Outer 的内部类)</b>
    public Outer.Inner inner = new Outer().new Inner();
    // <b>4 、导入了 Inner 包就可以这样写了,但是不能很直观的看出来 Inner 是 Outer 的内部类</b>
    public Inner inner2 = Outer.staticMethod();
    }

    </pre>

    他那个写的不对,前 3 个地方是 **(内部类所在的外部类)的非静态方法之外的位置创建内部类的对象**

    第 4 个地方是 **其他外部类的非静态方法之外的位置创建内部类的对象**

    第 5 个地方才是他建议的写法
    a0000
        3
    a0000  
       2016-04-11 08:31:42 +08:00
    我去,怎么格式都没了。。。
    a0000
        4
    a0000  
       2016-04-11 08:32:14 +08:00
    public class Outer {
    // 内部类
    public class Inner {

    }
    // <b>1 、外部类的非静态方法之外(成员变量)</b>
    Inner inner = new Inner();

    // <b>2 、外部类的非静态方法之外(静态变量)</b>
    static Inner inner2 = new Outer().new Inner();

    // <b>3 、外部类的静态方法</b>
    public static Inner staticMethod() {
    Inner inner = new Outer().new Inner();
    return inner;
    }

    // 外部类的非静态方法
    public Inner nonStaticMethod() {
    Inner inner = new Inner();
    return inner;
    }

    }
    linux40
        5
    linux40  
       2016-04-11 08:50:23 +08:00 via Android
    因为其他地方没有外部类的 this 引用
    a0000
        6
    a0000  
       2016-04-11 08:58:36 +08:00
    zgc2537
        7
    zgc2537  
       2016-04-11 09:54:57 +08:00
    其实它说的有点绕了。就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到内部类。其实对于 Thinking in Java 这本书,在这个地方,它不应该这样去补充,这应该由读者自己去总结:静态方法不能直接访问非静态元素(属性,方法,内部类)。
    zgc2537
        8
    zgc2537  
       2016-04-11 09:59:30 +08:00
    上面有句话有点小问题(就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到内部类。)-》改为:就是在外部类的非静态方法中,你可以直接用内部类的类名进行定义,而在外部类的静态方法中,你得使用外部类作为前缀,才能访问到“静态”内部类。

    也就是,如果是外部类的静态方法访问静态内部类,你仍然不需要用外部类作为前缀访问到静态内部类。
    captainXxX
        9
    captainXxX  
    OP
       2016-04-11 10:58:33 +08:00
    @SoloCompany 是内部类,最上面还有一行。
    SoloCompany
        10
    SoloCompany  
       2016-04-11 11:15:21 +08:00
    @captainXxX 不是,这代码连编译都无法通过,最上面那行是封闭的类定义,下面所有定义都是 out of any class scope
    SoloCompany
        11
    SoloCompany  
       2016-04-11 11:18:16 +08:00
    @captainXxX 好吧,我眼神不好,大括号数漏了一个。在外部类里面引用内部类,的确可以不需要 qulified 前缀,加了的话会更明确一点
    captainXxX
        12
    captainXxX  
    OP
       2016-04-11 13:32:30 +08:00 via Android
    @zgc2537 普通内部类依附于外部类对象,静态内部类依附于外部类,这么理解对么。。
    zgc2537
        13
    zgc2537  
       2016-04-11 14:45:51 +08:00
    @captainXxX 也可以这么去理解。把内部类当做和属性和方法一样地去访问和使用就好了,这样理解会更容易一些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:48 · PVG 11:48 · LAX 19:48 · JFK 22:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.