繁体   English   中英

我如何从内部类对象访问外部类的方法和全局变量,以及如果我不能拥有内部类的目的

[英]How do I access the methods and Global variables of outer class from an inner class object, and if I cannot what is purpose of having an Inner class

public class StaticAndInnerClasses {
    String testString;
    class InnerClass{
    int x;
    int y;


    }
    static class InnerStaticClass{
    int a=10;
    int b=20;

    }
    public void changeCharacter(){
    testString="Characters modified";
    }
    public static void main(String[] args){
    StaticAndInnerClasses.InnerStaticClass statciClassObject=new StaticAndInnerClasses.InnerStaticClass();
    StaticAndInnerClasses outerObject=new StaticAndInnerClasses();
    outerObject.changeCharacter();
    InnerClass innerClassObject=outerObject.new InnerClass();    
    innerClassObject.changeCharacter();   



  }
    }

正如您在代码中看到的那样,我在最后一行中创建了一个innerClassObject,现在我想知道为什么我不能使用innerClassObject访问String testString。 不是testString一个全局变量,我不是在externalClass内创建了innerClass的实例。即“ StaticAndInnerClasses”,如果不可能的话,为什么要拥有内部类

内部类和静态内部类之间是有区别的。

静态内部类没有与外部类的任何实例相关联,因此为什么您不能访问封闭类的字段。

但是,必须使用外部类的实例来构造非静态内部类。 因此,您的测试代码如下所示:

OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();//Yes, with that exact syntax!

编辑对于上面说的内容无法编译的人,这是当尝试直接实例化InnerClass时来自Eclipse的确切消息:

无法访问类型为OuterClass的封闭实例。 必须使用类型为OuterClass的封闭实例来限定该分配(例如xxnew A(),其中x是OuterClass的实例)。

内部类内部代码可以在外部类引用的东西。

对于此玩具示例:

public class StaticAndInnerClasses {
    String testString;
    class InnerClass{
        int x;
        int y;

        public void printString() {
            changeCharacter();
            System.out.println(testString);
        }
    }

    static class InnerStaticClass{
        int a=10;
        int b=20;

    }
    public void changeCharacter(){
        testString="Characters modified";
    }

    public static void main(String[] args){
        StaticAndInnerClasses.InnerStaticClass statciClassObject=new StaticAndInnerClasses.InnerStaticClass();
        StaticAndInnerClasses outerObject=new StaticAndInnerClasses();
        StaticAndInnerClasses.InnerClass innerClassObject=outerObject.new InnerClass();
        innerClassObject.printString();

    }
}

因此,在内部类的代码中,您可以引用外部类的方法和字段,就像在方法printString()所做的那样。 这不会将外部类的方法转换为内部类的方法,因此代码(在外部类main

innerClassObject.changeCharacter();

如您在评论中所引用,将无法正常工作。 实际上,它不会编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM