没有任何方法可以使用抽象类创建对象。但是在使用匿名内部类时,可以运行以下代码。而且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扩展了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变量。救命? 问题答案: 内部类可以通过自己的方法访问外部类的方法和属性。看下面的代码:
当我创建一个抽象类的对象时,我必须像接口一样这样做。 这是否意味着的对象是匿名的内部类对象?
问题内容: 我想创建一个扩展另一个类的匿名内部类。 实际上,我要执行的操作如下: 这可能吗? 问题答案: 您不能给匿名类命名,这就是为什么它被称为“匿名”的原因。我看到的唯一选择是从您的外部范围引用变量 另一个选择是像这样定义一个本地类(不是匿名类): 如果您还需要更多,请创建一个常规类…