是否可以为界面创建对象,如果是,我们怎么办?根据我的观点,以下代码说我们可以:
Runnable r= new Runnable(){
// some implementation
}
Pra*_*kar 18
这不是创建Interface的实例,而是创建一个实现接口的类.所以当你写作
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
};
Run Code Online (Sandbox Code Playgroud)
您实际上是创建一个实现Runnable接口的类.你需要遵循这里的所有规则,在这里,我们重写了run方法Runnable
There is similar thing for abstract class also. We can test using an example
public abstract class AbstractClass {
public void someMethod(){
System.out.println("abstract class");
}
}
Run Code Online (Sandbox Code Playgroud)
和另一个类别 TestClass
public class TestClass {
public static void main(String[] args) {
AbstractClass abstractClass = new AbstractClass() {
public void someMethod() {
System.out.println("concrete class method");
}
};
abstractClass.someMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
这将创建我们重写的子类的实例someMethod(); 这个程序打印
concrete class method
Run Code Online (Sandbox Code Playgroud)
这证明我们正在创建子类的实例.
JRE*_*REN 13
您不能直接实例化接口,但可以实例化实现该接口的类:
public class RunClass implements Runnable {
// Class implementation
}
Runnable r = new RunClass();
Run Code Online (Sandbox Code Playgroud)
这与你在线内容基本相同.新的Runnable()之后的括号将包含您的实现内联.
您可以创建一个匿名内部类:
Runnable r = new Runnable() {
@Override
public void run() {
}
};
Run Code Online (Sandbox Code Playgroud)
因此,您创建一个class实现给定的new interface.
是否可以为界面创建对象?
不会.您显示的代码会从匿名类创建一个对象,该类实现该接口.在幕后,JVM实际上创建了一个实现接口的类,然后创建该类的实例.
生成的"匿名"类实际上将具有一个名称,例如,基于此代码所在的类的名称YourClass$1或类似名称.例如:
public class AnonymousName {
public static final void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
}
};
System.out.println(r.getClass().getName());
}
}
Run Code Online (Sandbox Code Playgroud)
...输出
AnonymousName$1
(至少在Oracle的JVM上;我不知道命名约定是在JLS中还是在JVM特定的行为中.)
| 归档时间: |
|
| 查看次数: |
52857 次 |
| 最近记录: |