有 Java 编程相关的问题?

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

java我们实际上是在实例化一个抽象类吗?

// Concrete implementation built atop skeletal implementation
  static List<Integer> intArrayAsList(final int[] a) {
    if (a == null)
      throw new NullPointerException();
    return new AbstractList<Integer>() {
      public Integer get(int i) {
        return a[i]; // Autoboxing 
      }

      @Override
      public Integer set(int i, Integer val) {
        int oldVal = a[i];
        a[i] = val; // Auto-unboxing
        return oldVal; // Autoboxing
      }

      public int size() {
        return a.length;
      }
    };
  }

到目前为止,我知道我们根本无法实例化抽象类。但是我们在这里对^{做的不是同样的事情吗?我很困惑


共 (4) 个答案

  1. # 1 楼答案

    ,您正在创建一个匿名

    您的代码:

    return new AbstractList<Integer>() {
        public Integer get(int i) {
            return a[i]; // Autoboxing 
        }
    
        @Override
        public Integer set(int i, Integer val) {
            int oldVal = a[i];
            a[i] = val; // Auto-unboxing
            return oldVal; // Autoboxing
        }
    
        public int size() {
            return a.length;
        }
    };
    

    相当于:

    ...
    
    return new myNewClass()
    
    ...
    
    
    public class myNewClass extends AbstractList<Integer>{
        public Integer get(int i) {
            return a[i]; // Autoboxing 
        }
    
        @Override
        public Integer set(int i, Integer val) {
            int oldVal = a[i];
            a[i] = val; // Auto-unboxing
            return oldVal; // Autoboxing
        }
    
        public int size() {
            return a.length;
        }
    }
    
  2. # 2 楼答案

    不,它不是实例化抽象类,因为代码提供了该类的实现。它就像一个匿名的内部类

    就像信息一样,所有类型的内部类都会生成一个。编译过程后的类文件。所以,代码:

    测试。java

    public class Test {
    
        abstract class Foo {
            abstract void foo();
        }
    
        public Foo bar() {
            return new Foo() {
                @Override
                void foo() {
                    System.out.println( "foo!!!" );
                }
            };
        }
    
        public static void main( String[] args ) {
            new Test().bar().foo();
        }
    
    }
    

    将产生:

    • 测试。类:文件的公共类(Test.java)
    • 测试$Foo。类:测试类中的抽象内部类
    • 测试1美元。类:在bar方法中编码的匿名内部类
  3. # 3 楼答案

    您正在创建一个继承抽象类的匿名类。 您需要将抽象类的所有抽象方法实现到匿名类中

  4. # 4 楼答案

    ,您正在创建一个匿名类。您正在对抽象类进行子类化,同时提供一个实现并实例化它

    如果你尝试这个:

    return new AbstractList<Integer>();
    

    您将得到一个错误,因为您不会提供具体的实现

    如果您感到困惑,可以随时查看官方教程。这是: Java Inner Classes