当前位置: 首页 > 知识库问答 >
问题:

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

江鹏
2023-03-14

没有任何方法可以使用抽象类创建对象。但是在使用匿名内部类时,可以运行以下代码。而且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();
        }
    }

共有1个答案

詹亮
2023-03-14

请考虑下面的代码片段(代码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扩展了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语法可以从外部类访问匿名内部类中定义的新方法?我知道可以有各种变通方法,但我想知道是否存在一种特殊的语法? 举个例子 我自己的解决方案 我只是把所有的方法和成员转移到了外部类。

  • 我有一个抽象类及其具体子类,当我创建子类的对象时,它会自动调用超级构造函数。JVM是否在内部创建抽象类的对象? 那么在JVM中没有对象的情况下构造函数是如何存在的??(对于抽象类) 同样,构造函数在创建对象之后执行,然后不创建抽象类的对象,默认构造函数是如何执行的??(这在Java文档中有所提及)

  • 我确实读过一些讨论内部类的主题,我的印象是内部类可以访问封闭类的变量和方法。下面我有一个外部类和一个内部类,在测试类中我创建一个外部类的实例,然后从它创建一个内部类的实例。但是,我无法通过内部类引用访问字符串变量a。帮忙?

  • 问题内容: 我确实阅读了许多讨论内部类的主题,并且给人的印象是内部类可以访问封闭类的变量和方法。在下面的代码中,我有一个外部类和一​​个内部类,在测试类中,我创建了一个外部类的实例,然后从中创建了一个内部类的实例。但是我无法通过内部类引用访问String变量。救命? 问题答案: 内部类可以通过自己的方法访问外部类的方法和属性。看下面的代码:

  • 当我创建一个抽象类的对象时,我必须像接口一样这样做。 这是否意味着的对象是匿名的内部类对象?

  • 问题内容: 我想创建一个扩展另一个类的匿名内部类。 实际上,我要执行的操作如下: 这可能吗? 问题答案: 您不能给匿名类命名,这就是为什么它被称为“匿名”的原因。我看到的唯一选择是从您的外部范围引用变量 另一个选择是像这样定义一个本地类(不是匿名类): 如果您还需要更多,请创建一个常规类…