【问题标题】:Creating the instance of abstract class or anonymous class创建抽象类或匿名类的实例
【发布时间】:2013-05-28 07:13:59
【问题描述】:

在这段代码中是创建抽象类还是匿名类的对象? 请告诉我。我在这里有点困惑。

public abstract class AbstractDemo {

    abstract void showMessage();
    abstract int add(int x,int y);

    public int mul(int x,int y){
        return x+y;
    }


    public static void main(String[] args) {
        AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

        System.out.println(ad.mul(10, 12));
        System.out.println(ad.getClass());
    }

}

【问题讨论】:

  • 您是否尝试编译此代码?结果如何?
  • 请注意,您正在覆盖抽象方法。这是一个匿名类。
  • 输出为 22 类 com.mj.javademo.AbstractDemo$1
  • 您的最后一个问题是什么?你只想知道ad是一个匿名类吗?

标签: java class syntax


【解决方案1】:

您创建一个匿名类来扩展您的抽象类。

在下面的片段中,您正在扩展 AbstractDemo 并为其抽象方法提供实现。

new AbstractDemo() {
    @Override
    void showMessage() {
        // TODO Auto-generated method stub
    }

    @Override
    int add(int x, int y) {
        // TODO Auto-generated method stub
        return 0;
    }
};

【讨论】:

    【解决方案2】:

    这是这段简短而无辜的代码中发生的事情:

    AbstractDemo ad = new AbstractDemo() {
    
                @Override
                void showMessage() {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                int add(int x, int y) {
                    // TODO Auto-generated method stub
                    return 0;
                }
            };
    
    1. 新类已定义(没有名称,称为匿名类)
    2. 这个新类扩展了AbstractDemo
    3. AbstractDemo 的抽象方法在这个新类中被覆盖
    4. 已创建此新类的新实例并将其分配给 ad 变量

    阅读更多关于 anonymous classes 的 Java here

    【讨论】:

    • 精湛的解释。
    【解决方案3】:

    您不能创建抽象类的实例。
    您可以创建扩展抽象类的类的实例。

    抽象类的全部意义在于它是抽象的——你定义了一个接口但没有定义一个实现。如果没有实现,实例化类不会产生有意义或有用的结果。如果实例化该类的对象确实/有意义,那么您根本不想首先使用抽象类。

    您可以将匿名类概念用于如下实例:

    AbstractDemo abstractDemo  = new AbstractDemo() {
                @Override
                void showMessage() {
                    // TODO Auto-generated method stub
                }
                @Override
                int add(int x, int y) {
                    // TODO Auto-generated method stub
                    return 0;
                }
            }; 
    

    【讨论】:

      【解决方案4】:
      @Override // Here
      void showMessage() {
          // TODO Auto-generated method stub
      }
      
      @Override // here
      int add(int x, int y) {
          // TODO Auto-generated method stub
          return 0;
      }
      

      首先你必须知道你不能为abstract class创建一个instance,这里你只是创建一个anonymous class,它就像一个扩展abstract classinner class,所以它属于你的anonymous class

      【讨论】:

        【解决方案5】:

        在匿名类中实现抽象方法后,您的 AbstractDemo 不再抽象。正所谓:

        Class AbstractDemoImpl extends AbstractDemo {
        
            void showMessage() {
                    // TODO Auto-generated method stub
            }
            int add(int x, int y) {
                    // TODO Auto-generated method stub
                    return 0;
            }
        }
        

        【讨论】:

          【解决方案6】:

          您在anonymous class覆盖 abstract methods..这就是您可以创建对象的原因。见下文。

                  @Override // Here
                  void showMessage() {
                      // TODO Auto-generated method stub
          
                  }
          
                  @Override // here
                  int add(int x, int y) {
                      // TODO Auto-generated method stub
                      return 0;
          

          Abstract Class实现可以在你做的时候被实例化。

          【讨论】:

            【解决方案7】:

            无法制作独立的抽象类的对象,但可以制作匿名抽象类对象,因为它正在提供实现。

            Java不允许抽象类对象的原因是,因为它没有任何方法或某些方法的任何实现,所以你怎么会有一个不完整类的对象。但是在这里以匿名的方式,你正在给它实现,所以它允许你拥有一个对象。

            与界面相同

             AbstractDemo ad = new AbstractDemo() {
            
                        @Override
                        void showMessage() {
                            // TODO Auto-generated method stub
            
                        }
            
                        @Override
                        int add(int x, int y) {
                            // TODO Auto-generated method stub
                            return 0;
                        }
                    };
            

            这里的AbstractDemo类是抽象的,但是它的实现类可以有对象,所以这里匿名类代码是实现代码,所以完全可以有对象。

            更多深入,看下面的代码,MyAbstractClass 是一个抽象类,现在如果你注释掉

            abstract void play();
            

            然后它工作正常,Java 允许创建这个抽象类的对象,但是当你取消注释时,它会拒绝,因为它没有关于该方法的任何实现,所以拒绝创建对象。

            abstract class MyAbstractClass {
                private String name;
            
                public MyAbstractClass(String name)
                {
                    this.name = name;
                }
            
                public String getName(){
                    return this.name;
                }
                abstract void play();
            
            
            
            }
            
            
            public class Test2 {
            
                public static void main(String [] args)
                {
                    MyAbstractClass ABC = new MyAbstractClass("name") {
                    };
            
                    System.out.println(ABC.getName());
                }
            
            }
            

            仔细检查它是在构造函数调用之后的{},这意味着不需要更多的实现,或者你可以覆盖它的一个或多个方法。

            【讨论】:

            • 输出是 com.mj.javademo.AbstractDemo$1 那么这意味着 this 指的是哪个对象?
            【解决方案8】:

            这里我们提供了抽象类的实现。当我们制作对象时,我们提供了它的实现并覆盖了所有的抽象方法。在抽象类只有具体方法的情况下。 见下例

            abstract class MyAbstractClass {
                private String name;
            
                public MyAbstractClass(String name)
                {
                    this.name = name;
                }
            
                public String getName(){
                    return this.name;
                }
            }
            
            public class Test {
            
                public static void main(String [] args)
                {
                    MyAbstractClass ABC = new MyAbstractClass("name") {
                    };
            
                    System.out.println(ABC.getName());
                }
            }
            

            这里我们只是使用像 {} 这样的调用构造函数来创建对象。

            1. 我们正在使用匿名类证明实现。

            2. 就是没有名字的类,我们在制作对象时需要这样做。

            1. 是的,我们正在通过在运行时证明实现来制作抽象类的对象。

            4.它打开了为什么抽象类允许构造函数之类的答案?但我们不能创建它的对象。

            5.另一个关于抽象类的问题是抽象类中只能有静态块,这是什么意思?

            6.仅静态块,因为我们只想加载一次而不扩展和创建它的对象。

            7.编译代码后我们用来获取每个具体类、抽象类或接口的.class。

            8.下一个问题出现在这里为什么java人员不允许接口中的静态块?

            【讨论】:

              猜你喜欢
              • 2023-03-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多