创建抽象类或匿名类的实例
那么这个代码在创建抽象类或匿名类的对象呢? 请告诉我这里有点混乱。
public abstract class AbstractDemo { abstract void showMessage(); abstract int add(int x,int y); public int mul(int x,int y){ return x+y; } public static void main(String[] args) { AbstractDemo ad = new AbstractDemo() { @Override void showMessage() { // TODO Auto-generated method stub } @Override int add(int x, int y) { // TODO Auto-generated method stub return 0; } }; System.out.println(ad.mul(10, 12)); System.out.println(ad.getClass()); } }
您创建一个扩展抽象类的匿名类。
在下面的剪辑中,您将扩展AbstractDemo
并为其抽象方法提供实现。
new AbstractDemo() { @Override void showMessage() { // TODO Auto-generated method stub } @Override int add(int x, int y) { // TODO Auto-generated method stub return 0; } };
以下是这段简短而无辜的代码中发生的事情:
AbstractDemo ad = new AbstractDemo() { @Override void showMessage() { // TODO Auto-generated method stub } @Override int add(int x, int y) { // TODO Auto-generated method stub return 0; } };
- 定义了新类 (没有名称,所谓的匿名类)
- 这个新类扩展了
AbstractDemo
类 - AbstractDemo的抽象方法在这个新类中被覆盖
- 创建了此新类的新实例并将其分配给
ad
变量
在这里阅读有关Java中anonymous classes
更多信息。
您无法创建抽象类的实例。
您可以创建扩展抽象类的类的实例。
抽象类的重点是它是抽象的 – 你已经定义了一个接口而不是一个实现 。 如果没有实现,实例化类将不会产生有意义或有用的结果。 如果确实/有意义地实例化该类的对象,那么您根本不想首先使用抽象类。
您可以对以下实例使用匿名类概念:
AbstractDemo abstractDemo = new AbstractDemo() { @Override void showMessage() { // TODO Auto-generated method stub } @Override int add(int x, int y) { // TODO Auto-generated method stub return 0; } };
@Override // Here void showMessage() { // TODO Auto-generated method stub } @Override // here int add(int x, int y) { // TODO Auto-generated method stub return 0; }
首先你必须要知道你不能为abstract class
创建一个instance
,在这里你只是创建一个anonymous class
,它就像一个扩展abstract class
的inner class
,因此它属于你的anonymous class
。
在抽象方法在匿名类中实现之后,您的AbstractDemo不再是抽象的。 它说得好:
Class AbstractDemoImpl extends AbstractDemo { void showMessage() { // TODO Auto-generated method stub } int add(int x, int y) { // TODO Auto-generated method stub return 0; } }
您正在重写 anonymous class
abstract methods
。这就是您可以创建对象的原因。 见下文。
@Override // Here void showMessage() { // TODO Auto-generated method stub } @Override // here int add(int x, int y) { // TODO Auto-generated method stub return 0;
Abstract Class
的实现可以像你一样实例化。
不能创建一个独立的Abstract类的Object,但可以创建一个匿名的抽象类对象,因为它提供了实现。
Java不允许抽象类对象的原因是,因为它没有任何方法或某些方法的任何实现,所以你怎么能有一个不完整类的对象。 但是在匿名的方式,你给它实现,所以它允许你有一个对象。
接口相同的情况
AbstractDemo ad = new AbstractDemo() { @Override void showMessage() { // TODO Auto-generated method stub } @Override int add(int x, int y) { // TODO Auto-generated method stub return 0; } };
这里AbstractDemo类是抽象的,但是它的实现类可以有对象,这里匿名类代码实现了代码,因此完全允许有对象。
更多深入研究,请参阅下面的代码,MyAbstractClass是一个抽象类,现在如果你注释掉了
abstract void play();
然后它工作正常,Java允许创建这个抽象类的对象,但是当你取消注释时,它会拒绝,因为它没有关于该方法的任何实现,因此拒绝创建对象。
abstract class MyAbstractClass { private String name; public MyAbstractClass(String name) { this.name = name; } public String getName(){ return this.name; } abstract void play(); } public class Test2 { public static void main(String [] args) { MyAbstractClass ABC = new MyAbstractClass("name") { }; System.out.println(ABC.getName()); } }
在构造函数调用之后仔细检查它是{},这意味着不再需要实现,或者您可以覆盖其方法之一或更多。
这里我们提供抽象类的实现。在我们创建对象的时候,我们提供它的实现并覆盖所有抽象方法。在Abstract类只有具体方法的情况下。 见下面的例子
abstract class MyAbstractClass { private String name; public MyAbstractClass(String name) { this.name = name; } public String getName(){ return this.name; } } public class Test { public static void main(String [] args) { MyAbstractClass ABC = new MyAbstractClass("name") { }; System.out.println(ABC.getName()); } }
这里我们只是使用像{}之类的调用构造函数来创建对象。
- 我们正在使用匿名类certificate实现。
什么只是没有名字的阶级,我们需要做的就是当我们创造一个对象时。
- 是的,我们通过在运行时certificate实现来创建抽象类的对象。
4.为什么抽象类允许构造函数打开答案? 但我们无法创造它的对象。
5.另一个与抽象类相关的问题是我们在抽象类中只能有静态块。这是什么意思?
6.Only静态阻止,因为我们只想加载一次而不扩展和创建它的对象。
7.编译代码后,我们用来获取每个具体类,抽象类或接口的.class。
8.下一个问题出现在这里为什么java人不允许在接口中使用静态块?