Java 我们可以创建抽象类的对象吗?若否,原因为何?

Java 我们可以创建抽象类的对象吗?若否,原因为何?,java,Java,我有一个抽象类B和两个抽象方法 public abstract class B { public abstract void C(); public abstract void D(); } 我正在尝试使用创建抽象类的对象 B objB = new B(){ @Override public void C() { } @Override public void D() {

我有一个抽象类B和两个抽象方法

public abstract class B
{
    public abstract void C();

    public abstract void D();
}
我正在尝试使用创建抽象类的对象

B objB = new B(){

        @Override
        public void C() {

        }

        @Override
        public void D() {

        }};
ObjB
是抽象类的实例吗?我还尝试使用
instanceof
操作符作为
System.out.println(objB instanceof B)返回我
true


如果上面不是抽象类的对象,那么为什么上面的语句返回true?

否,您不能立即实例化
抽象类,原因是:它是
抽象类

为了创建这样一个类的实例,您必须创建一个子类,该子类为该类的所有抽象成员提供实现。 即使您没有添加任何抽象方法,这仍然是正确的

instanceof
这并不意味着“此变量属于该类型”,而是指此变量属于该类型,或者是从该类型继承的类型的实例。因此,在Java中的任何对象上:
myObject instanceof Object
如果实例化了myObject,则无论myObject的实际类型如何,都将返回true

在不创建具体且命名的子类的情况下,最接近实例化抽象类的方法是创建匿名实现:

B object = new B() {
            @Override
            public void C() {

            }

            @Override
            public void D() {

            }
}
正如您所做的那样,上面的块不是抽象类的直接实例化


这是一个新类的创建,您没有提供该类的名称,并且实例化了该类。

代码的可能副本不完整,因此很难看到代码中实际包含的内容。如果我理解正确,您正在创建一个匿名(非抽象)类的单例(使用
objB=new B(){…}
instanceof
将为您提供
true
不仅针对对象的类,还针对其任何祖先。因此,
B
(摘要)由匿名(非摘要)扩展,由
objB
实例化“
instanceof
运算符将对象与指定类型进行比较。您可以使用它来测试对象是类的实例、子类的实例还是实现特定接口的类的实例。“”将返回true,而不管myObject的实际类型如何。“,除非为null!@AndyTurner Good point。”而不创建子类“我认为暗示这不会创建一个子类是误导的。它没有使用
class
关键字,但它确实创建了一个类,然后在运行时创建了该类的实例。我的解释确实有些含糊不清,正如后来我所说的:“这是一个新类的创建,您没有提供该类的名称和实例化。”