Java:通过主方法的抽象类调用

时间:2015-05-25 03:40:18

标签: java abstract-class

好吧,人们可能只会通过阅读标题并且没有真正阅读问题而将其标记为重复。所以请知道我已经尝试在这个平台上查看其他问题,但是没有找到能够完全解决我怀疑的问题。请允许我伸出手来问我的问题。提前谢谢。

  

接口绝对是抽象的,无法实例化; Java抽象类也无法实例化,但如果存在main(),则可以调用它。

我不完全理解声明的后半部分。这是在谈论主要方法直接在抽象类本身内吗?它是在谈论通过孩子的主要方法调用抽象类吗?或两者兼而有之?

其次,我看过如下例子。

abstract class Printer
{
     public void print() { … };
}

public class TestPrinter
{
     public static void main( String[] args )
     {
          // use of anonymous class
          final Printer p = new Printer()
          {
               @override
               public void print()
               {
                    ...
               }
          }
     }
}

有人告诉我,匿名课程正在开展工作。但是,我真的不明白,因为变量' p'显然被分配给...而且它是一个抽象的类变量!!这怎么可能呢?我认为抽象类不能被实例化或初始化。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

 final Printer p = new Printer()
      {
           @override
           public void print()
           {
                ...
           }
      }

这意味着创建了一个匿名类extends Printer,而变量p指的是子类实例。

这只是多态。通过在这里创建匿名类,您正在创建一个Printer的子类,使用多态,您正在使用超类引用变量p来引用子类的对象这是匿名的,但是扩展打印机,因为下面的语法

Printer p = new Printer(){...}

这不仅限于抽象类,还可以创建一个实现和接口的匿名类。考虑下面的例子。

package com.test;

public interface SomeInterface {

    public void SomeMethod();

}

以及下面的课程 package com.test;

public class TestAnonymous {

    public static void main(String[] args) {

        SomeInterface obj = new SomeInterface() {

            @Override
            public void SomeMethod() {

                System.out
                        .println("Yaayy!!! Creating an anonymous class which implements SomeInterface ");

            }
        };

        obj.SomeMethod();

    }

}

打印出来

  

Yaayy !!!创建一个实现SomeInterface的匿名类

这意味着语法创建一个匿名类,该类扩展抽象类或实现使用引用变量实例化的接口。它调用子类的方法。

您可以参考jsl。https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.1

现在你的问题

  

接口绝对是抽象的,无法实例化; Java抽象类也无法实例化,但如果main()存在则可以调用

我从你的问题中理解的是,你是否想知道主方法是否可以在抽象类中运行而不实例化,答案是肯定的

package com.test;

public abstract class AbstractClass {

    public static void main(String[] args) {

        System.out.println("main method in abstract class");

    }

}

使用java AbstractClass编译并调用它,它应该打印

main method in abstract class

如果你想知道在实例化anynomous类时是否调用抽象类构造函数,那么答案也是YES。 当调用子类构造函数时,它通过进行super()调用来调用超类构造函数。所以抽象类构造函数也会被调用。 http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

答案 1 :(得分:1)

abstract类就像任何其他类一样 - 除了它不能直接实例化的事实。我认为你知道这种设施的用途。因此它很可能有一个main(),这是static方法,而不是实例方法

示例中的匿名类,extend是抽象类(或implement是一个接口,如果指定了接口。因此,p未分配给abstract类实例,而是分配给扩展抽象类的类的实例

答案 2 :(得分:0)

  

Java抽象类也无法实例化,但如果存在main(),则可以调用它。

由于main()方法是静态的,因此无需实例化即可调用。 e.g。

abstract class AbstractClass{
    public static void main(String[] args){

    }
}

对于Java7,interface也是如此。对于Java8,你可以在interface内部使用静态main方法,因此Java8也是如此

您的第二个问题,在创建Printer的实例时,您已经定义了Printer的子类,但您不能再次使用此Printer的定义实现(因为那里)没有与实现相关联的名称),因此,它是匿名的。

答案 3 :(得分:0)

  
    

Java抽象类也无法实例化,但如果存在main(),则可以调用它。

  

这是无稽之谈。可以调用抽象类的任何静态方法。不只是main().

  

其次,我看过以下示例......并且被告知匿名类正在运行。

这是正确的。

  

但是,我真的不明白怎么做,因为变量'p'显然被分配给......而且它是一个抽象的类变量!!这怎么可能呢?我认为抽象类不能被实例化或初始化。

这里是实例化的匿名类,扩展抽象类,并提供抽象方法的实现。该类的引用存储在Person p中,因为Person是匿名类的超类。您可以为任何其他类或接口执行此操作。这里没有什么新东西。