java - 是否可以使用匿名内部类和访问其中方法的机制来实例化抽象类

标签 java inner-classes anonymous

<分区>

没有任何方法可以使用抽象类创建对象。但是当使用匿名内部类时,可以运行以下代码。不仅 start() 方法不可访问,因此运行以下程序而不给出任何编译错误的原因是什么,访问 start() 的机制是什么方法。

abstract class Vehicle{
        abstract void park();
    }   

    class Demo{
        public static void main(String args[]){
            Vehicle v1=new Vehicle(){
                int speed;
                void park(){
                    System.out.println("Parking for cars...");
                }
                void start(){
                    System.out.println("Start...");
                }
            };
            v1.park();
        }
    }

最佳答案

考虑以下代码(代码 2)。

abstract class Vehicle{
    abstract void park();
}   

class Demo{
  static class Car extends Vehicle {
       int speed;
       void park(){
                System.out.println("Parking for cars...");
       }
   }

   public static void main(String args[]){
        Vehicle v1=new Car();
        v1.park();
   }
}

毫不奇怪,前面的代码没有出现编译错误。
Car extends Vehicle 并且 Car 不是抽象的。因此您可以实例化它。

让我们看看编译代码 2 时会发生什么:

javac *.java
list .class files
Demo$Car.class  Demo.class  Vehicle.class

这就是编译问题中的代码(代码 1)时发生的情况:

javac *.java
list .class files
Demo$1.class  Demo.class  Vehicle.class

除了我们在代码 1 中得到 Demo$1.class 和在代码 2 中得到 Demo$Car.class 之外,我们得到了相同的结果。
发生这种情况是因为代码 1 实际上是在创建一个继承自 Vehicle 的类。一个所谓的匿名类。该类没有名称 (*),但它仍然是一个完整的类,它继承自 Vehicle 并且可以像 Car 可以被实例化一样被实例化。

这段代码:

Vehicle v1=new Vehicle(){

不是实例化类 Vehicle 的对象。它正在实例化一个类的对象,该类继承自没有名称的 Vehicle。

(*) 其实它是有名字的。它的名字是“1 in Demo”又名 Demo$1。 JVM 需要一个名称才能运行它,您不能只告诉 JVM 运行某些东西而不告诉它运行什么。该名称不是类的语法上有效的名称;不能将类命名为 1。这是设计使然,因为它确保匿名类名不会与普通类名冲突。

关于java - 是否可以使用匿名内部类和访问其中方法的机制来实例化抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32410049/

相关文章:

authentication - 识别匿名用户

java - 集中缓存服务器。 (Ehcache 或 Hazelcast)

java - 使用spark-submit部署程序时出现java.lang.NoSuchMethodError

java - Rest API 因 javax.xml.bind.JAXBException(400 错误请求)而失败

java - 如何定义继承内部类的子类的构造函数?

c++ - 您将如何从嵌套类的方法中获取基类的 "this"指针?

java - 使用 protected 构造函数匿名初始化类

java - JavaFX TableView 中的重复列

java - 序列化内部类实例

multithreading - 如何在应用程序关闭时终止 Delphi 中的匿名线程?