[英]Creating the instance of abstract class or anonymous class
在这段代码中,它是创建抽象类或匿名类的对象吗? 请告诉我。 我在这里有点困惑。
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
。
您正在重写 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());
}
}
在构造函数调用之后仔细检查它是{},这意味着不再需要实现,或者可以覆盖其方法之一或更多。
在匿名类中实现抽象方法之后,您的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;
}
}
这里我们提供抽象类的实现。在我们创建对象的时候,我们提供它的实现并覆盖所有抽象方法。在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());
}
}
这里我们只是使用像{}之类的调用构造函数来创建对象。
什么只是没有名字的阶级,我们需要做的就是当我们创造一个对象时。
4.为什么抽象类允许构造函数打开答案? 但我们无法创造它的对象。
5.与抽象类相关的另一个问题是我们在抽象类中只能有静态块。这是什么意思?
6.Only静态块因为我们只想加载一次而不扩展和创建它的对象。
7.编译代码后,我们用来获取每个具体类,抽象类或接口的.class。
8.下一个问题出现在这里为什么java人不允许在接口中使用静态块?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.