为什么不能创建抽象类的对象?

时间:2010-04-23 16:30:16

标签: language-agnostic oop

这是我脑海中的一个场景,我用谷歌搜索了,很多但是得到了答案

“抽象类没有实现方法所以,我们不能创建对象” “'Abstract'一词指示编译器不要创建类”

的对象

但是在一个简单的类中我们都有虚拟方法,能够创建一个对象???

此外,我们可以定义修改为Abstract类构造函数的不同访问权限,如private,protected或public。

我的搜索终止于这个问题:

为什么我们不能创建Abstract类的对象?

16 个答案:

答案 0 :(得分:56)

抽象类型定义主要是无法创建的类型。您可以创建它的子类型,但不能创建该类型的子类型。 CLI不允许你这样做。

abstract类有一个protected构造函数(默认情况下),允许派生类型初始化它。

例如,基类型Stream是抽象的。没有派生类型数据将在哪里?当您调用abstract方法时,会发生什么?调用方法没有实际的实现。

答案 1 :(得分:21)

因为它是抽象的,而对象是具体的。抽象类有点像模板,或者是空/部分空结构,你必须先扩展它并在它上面构建它。

以“动物”抽象类为例。没有“纯粹的”动物 - 有特定类型的动物。所以你可以实例化Dog and Cat和Turtle,但你不应该能够实例化普通动物 - 这只是一个基本的模板。并且所有动物共享的某些功能,例如“makeSound()",但不能在基础动物级别定义。因此,如果您可以创建一个Animal对象,并且您将调用makeSound(),,那么对象知道要发出什么声音?

答案 2 :(得分:4)

它旨在用作基类。

http://msdn.microsoft.com/en-us/library/sf985hc5(VS.71).aspx

  

abstract修饰符可以与。一起使用   类,方法,属性,   索引器和事件。

     

在类中使用abstract修饰符   声明表明一个类   仅仅是一个基类   其他课程。

     

抽象类具有以下内容   特性:

     
      
  • 抽象类无法实例化
  •   
  • 抽象类可以包含抽象方法和访问器。
  •   
  • 无法使用sealed修饰符修改抽象类,这意味着无法继承该类。
  •   
  • 从抽象类派生的非抽象类必须包括所有继承的抽象方法和访问器的实际实现
  •   

答案 3 :(得分:3)

作为其他答案的补充,您可能无法创建抽象类的实例,但您当然可以通过抽象类型引用派生类型的实例,并使用抽象类中定义的方法或属性基

abstract class A
{
    public abstract void D();
    public void E() { }
}

class B : A
{
    public override void D() { }
}

class C : A
{
    public override void D() { }
}

...

A a = new B();
a.D();
a.E();

List<A> list = new List<A>() { new B(), new C() };

答案 4 :(得分:2)

抽象类应该至少有一个没有实现的虚方法或属性。这标有abstract关键字。如果继承类本身不是抽象的,则它们必须提供实现。您无法创建抽象类的实例,因为它没有完整的实现。如果确实如此,那么首先不应该将其标记为抽象。

答案 5 :(得分:2)

简单来说,抽象类就像一个类的shell。并非所有方法都有实现,类似于缺少某些线段的电路。虽然大部分都可以构建,但是用户可以根据自己的需要在这些段中插入电线和电阻器。

至于为什么Java不会让你创建它,它的一部分只是一个故障保护(只要你不调用未实现的方法,许多抽象类就可以正常工作而不需要任何添加)。

答案 6 :(得分:1)

如果我们有一个包含纯虚函数的类,那么该类是抽象的。如果我们将创建抽象类的对象并调用没有正文的方法(因为该方法是纯虚拟的),它将给出错误。这就是为什么我们不能创建抽象类的对象。

答案 7 :(得分:1)

我们不能为抽象类bcoz创建对象,大多数抽象类包含“抽象方法”,所以抽象方法是不完整的方法。因此我们无法估计这些方法的内存将占用多少。这是其中之一之所以我们无法为抽象类创建对象。

答案 8 :(得分:0)

这是一个类似的StackOverflow问题。简而言之,在抽象类上拥有一个公共构造函数是合法的。有些工具会警告你这没用。

Whats the utility of public constructors in abstract classes in C#?

答案 9 :(得分:0)

实际上,当我们创建一个普通类的对象时,我们使用Constructor来分配内存 对于那个对象,如

myclass obj=new myclass();

这里使用构造函数clr根据实例变量和方法识别对象需要多少内存。但是在抽象类的情况下,我们无法预测所需的内存量,因为我们不实现抽象方法,因此无法创建对象。

答案 10 :(得分:0)

当我们在Abstract类中创建纯虚函数时,我们在VTABLE中保留了一个函数的插槽(在上一个主题中研究过),但是没有在该插槽中放置任何地址。因此,VTABLE将不完整。

由于抽象类的VTABLE不完整,因此编译器不会为此类创建对象,并且每当您尝试这样做时都会显示错误消息。

来源Study Tonight

答案 11 :(得分:0)

参考studytonight

  

当我们在Abstract类中创建一个纯虚函数时,我们保留一个   VTABLE中的函数的插槽(在上一个主题中研究过),但不是   把任何地址放在那个插槽中。因此,VTABLE将不完整。

     

由于抽象类的VTABLE不完整,因此编译器   不会让这类的对象创建并显示出来   每当你尝试这样做时都会出现错误消息。

答案 12 :(得分:-2)

我不同意接受的答案。原因是我们可以拥有纯虚函数体。

答案是:

当我们在类中创建纯虚函数时,我们为VTABLE中的函数保留一个插槽,但不在该插槽中放置任何地址。因此VTABLE将是不完整的。 由于抽象类的VTABLE不完整,因此编译器不会为这样的类创建对象,并且每当您尝试这样做时都会显示错误消息。

答案 13 :(得分:-2)

对不起伙计们......

当且仅当该抽象类不包含任何抽象方法时,您才可以为抽象类创建对象。

这是我的例子。复制并编译并运行。

abstract class Example {
  void display(){
    System.out.println("Hi I am Abstract Class.");
  }
}

class ExampleDemo {
    public static void main(String[] args) {
        Example ob = new Example(){};
        ob.display();
   }
}

所以你的答案是肯定的,如果它不是抽象方法,我们可以为抽象类创建对象。 检查我的程序。

答案 14 :(得分:-3)

我们可以为这样的抽象类创建对象......

public class HelloWorld
{
    public static void main(String args[])
    {
        Person p = new Person()
        { 
            void eat()
            {
                console.writeline("sooper..");
            } 
        }; 
        p.eat();
    }
}
abstract class Person
{ 
    abstract void eat(); 
} 

答案 15 :(得分:-4)

每个正在编写的数据抽象类都有一些未定义的虚函数。因为我们不能创建对象,但是抽象类是一个带有关键字'abstract'的类,它可能有也可能没有抽象方法。我认为这是一个概念,它不需要任何内存的数据。因此,如果我们可以创建一个对象,则将创建一个不可能的内存,因为我们无法创建一个抽象类的对象,我们可以创建它的引用而不占用任何内存位置。

相关问题