问:抽象类对象启动代码?

时间:2016-03-29 05:22:41

标签: java abstract-class

在这个类中,抽象类对象是通过覆盖getNum()来实例化的,这个目的是什么?

public abstract class AbstractTest {
 public int getNum() {
  return 45;
 }
 public static void main(String[] args) // main function
  {
   AbstractTest t = new AbstractTest() // From this point didn't understand
    {
     public int getNum() // function
      {
       return 22;
      }
    }; //use of this        
   System.out.println(t.getNum()); // output
  }
}

2 个答案:

答案 0 :(得分:3)

main()方法中的实例化只是抽象类AbstractTest的具体实例的内联类定义。需要说明的是,变量t是一个匿名的非抽象类实例。以下代码将实现相同的目标:

public class ConcreteTest extends AbstractTest {
    @Override
    public int getNum() {
        return 22;
    }
}

public static void main (String [] args) {
    ConcreteTest t = new ConcreteTest();
    System.out.println(t.getNum());
}

在开发过程中有一些情况,必须创建正式的类定义可能很麻烦。例如,如果您只需要抽象AbstractTest类的单个实例,则使用内联定义会更容易。

答案 1 :(得分:0)

我们称之为“匿名类”#:当您需要创建和使用类,但不需要提供其名称或重用时,您可以使用匿名类。 Here是官方文件。不仅用于抽象类,还可以用于接口和一般可扩展类。

interface Base {
    void print();
}
public static void main(String[] args) {

    Base aInterface = new Base() {
        @Override
        public void print() {
            System.out.println("A anonymous implement.");
        }
    };

    Thread aThread = new Thread() {
        @Override
        public void run() {
            super.run();
        }
    };
}