抽象类'实例化'及其方法体

时间:2017-03-08 10:28:57

标签: java

我正在开始java编程,我遇到了抽象类。我知道你不能在没有创建扩展它们成为子类的具体类的情况下实例化它们。但是,当我尝试这个代码时,我真的很困惑,它运行正常。

abstract class Communication{
   public void FirstMethod()
   {
       System.out.println("I am first method()\n");
   }
}

public class Main{
   public static void main(String[] args){
      Communication communication = new Communication() {
         @Override
         public void FirstMethod(){
             super.FirstMethod();
         }
      };

      communication.FisrtMethod();
   }
}

输出是:我是第一个方法()。 如果我将其修改为:

Communication communication = new Communication() {
         @Override
         public void FirstMethod(){
             System.out.println("I've been called from Main");
         }
      };

输出结果是:我从Main调用过。 有人可以解释一下这是一种实例化还是这个概念是什么?

3 个答案:

答案 0 :(得分:4)

这被称为

  

匿名类

定义: 声明没有类名的内部类称为匿名内部类。

在匿名内部类的情况下,我们同时声明并实例化它们。通常,只要您需要覆盖类或接口的方法,就会使用它们。

答案 1 :(得分:1)

这称为匿名内部类。这样,您可以实现接口或抽象类,而无需为其找到名称并同时实例化它。当您仅使用某个实现时,此概念非常有用。

构造看起来总是那样:

new SomeClass() {
    //implementation of methods
};

答案 2 :(得分:0)

这称为匿名类。匿名类定义允许您在代码中提供类定义,并且它没有正式名称。匿名类表达式具有类定义和实例创建表达式。这不仅限于抽象类,还适用于接口和具体类。         例如

abstract class A { }
// so the anonymous class expression is 

A a = new A() {// class definition };

// This will actually create an instance of a
// class that extends the abstract class A 
// that java will create at run time 

你甚至可以在方法参数中使用匿名类表达式。例如,这是Collections.sort()方法中的Comparator;

  Collections.sort(listOfValues,new Comparator<Value>(){
      public int compare(Value v1, Value v2){
        // method implemetation.
      }
  })