有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android与Java内部类概念

我按照链接http://developer.安卓.com/reference/安卓/app/AlertDialog.html尝试创建新的AlertDialog,如下所示

AlertDialog myAlertDialog = new AlertDialog.Builder(MainActivity.this).create();

根据文档,AlerDialog是外部类,而Builder是AlertDialog中的内部类。现在,在访问内部类时,我将相同的概念与java联系起来,如Outer myOuter2 = new Outer.Inner();这段代码在我尝试访问时出错,下面是完整的java代码

package com.test;

    public class Outer {
        public void OuterMethod() {
            System.out.println("OuterMethod");
        }

        public static void main(String[] args) {
            Outer myOuter = new Outer();

            myOuter.OuterMethod();
            Outer myOuter2 = new Outer.Inner();//this piece of code gives error

        }

        class Inner {

            Inner() {
                System.out.println("constructor Inner");
            }

            public void InnerMethod() {
                System.out.println("Inside InnerMethod");
            }
        }
    }

所以我这里的问题是如何理解安卓中相同的内部类概念,以及如何访问其中的方法


共 (5) 个答案

  1. # 1 楼答案

    OuterInner之间没有关系,只是它们共享一个类文件。因此,您不能键入:

    Outer myOuter2 = new Outer.Inner();
    

    也许你的意思是:

    Outer.Inner myInner = new Outer.Inner();
    

    Inner类需要声明为static才能工作


    请注意,普通生成器将返回与封闭类型相同的类型。下面是一个使用与代码类似的类名的小示例:

    public class Outer {
    
      public static void main(String[] args) {
        Outer outer = new Outer.Builder().withParam("foo").build();
      }
    
      private final String someParam;
    
      private Outer(String someParam) {
        this.someParam = someParam;
      }
    
      public static class Builder {
    
        private String someParam;
    
        public Builder() {
        }
    
        public Builder withParam(String value) {
          this.someParam = value;
          return this;
        }
    
        public Outer build() {
          return new Outer(someParam);
        }
      }
    }
    

    您可能还希望阅读Joshua Bloch的《有效的Java》第二版第2项,以更好地描述建筑设计和基本原理。网上提供:here

  2. # 2 楼答案

    AlertDialog.Builder类是一个静态内部类,如您所见here

    public static class Builder {...}
    
  3. # 3 楼答案

    最后我发现这里是代码

    package com.test;
    
    public class Outer {
        public void OuterMethod() {
            System.out.println("OuterMethod");
        }
    
        public static void main(String[] args) {
            Outer myOuter = new Outer();
    
            myOuter.OuterMethod();
            Outer myOuter2 = new Outer.Inner().InnerMethod();
        }
    
        static class Inner {
    
            Inner() {
                System.out.println("constructor Inner");
            }
    
            public Outer InnerMethod() {
                Outer myOuter = new Outer();
                System.out.println("Inside InnerMethod");
                return myOuter;
    
            }
        }
    }
    
  4. # 4 楼答案

    您的内部类是非静态类型。 我们应该首先创建外部类的实例:

    Outer o=new Outer();
    Outer.Inner oi=o.new Inner();
    

    这是创建非静态内部类对象的基本方法

    假设您的内部类型为static(即static class Inner{....}), 然后,对于创建对象:

    Outer.Inner oi=new Outer.inner();
    
  5. # 5 楼答案

    您已经创建了一个内部非静态类(内部实例类),而AlertDialog.Builder是一个静态类

    要使代码按原样工作,需要一个interesting way of invoking ^{}如下所示:

    Outer.Inner myOuter2 = myOuter.new Inner();
    

    这是因为它的行为非常类似于Outer中的任何其他非静态字段-它需要Outer的实例才能有效。无论如何,这通常不是一个好主意,因为public内部非静态类很少

    您更可能希望Inner是一个静态类,即声明为:

    static class Inner {
    

    本质上,这将Inner与其包含的类解耦,它恰好位于它内部,因此可以通过new Outer.Inner()进行实例化。在一个新的世界里,它可以作为一个公共阶层以自己的权利快乐地生活。而不是java文件

    当内部类仅用于与外部类的关系时,内部静态类非常有用,因此它显示了它们之间的关系

    在Android的例子中,只有在构建AlertDialog时才使用AlertDialog.Builder。如果它是其他类(例如普通类)使用的通用类Builder,则它将被声明为自己的公共类(即不嵌套在另一个类中的独立类)