Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 为什么可以';不能创建抽象类的对象吗?_Language Agnostic_Oop - Fatal编程技术网

Language agnostic 为什么可以';不能创建抽象类的对象吗?

Language agnostic 为什么可以';不能创建抽象类的对象吗?,language-agnostic,oop,Language Agnostic,Oop,这是我脑海中的一个场景,我在谷歌上搜索了很多次,但得到的答案是 抽象类尚未实现方法,因此无法创建对象 “单词'Abstract'指示编译器不要创建类的对象” 但在一个简单的类中,我们都有虚方法,能够创建一个对象吗 此外,我们还可以定义对抽象类构造函数的不同访问,如private、protected或public 我的搜索到此问题结束: 为什么我们不能创建抽象类的对象?抽象类型主要定义为不能创建的类型。您可以创建它的子类型,但不能创建该类型本身的子类型。CLI不允许您执行此操作 抽象类有一个受保护

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

抽象类尚未实现方法,因此无法创建对象 “单词'Abstract'指示编译器不要创建类的对象”

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

此外,我们还可以定义对抽象类构造函数的不同访问,如private、protected或public

我的搜索到此问题结束:

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

抽象类型主要定义为不能创建的类型。您可以创建它的子类型,但不能创建该类型本身的子类型。CLI不允许您执行此操作

抽象
类有一个
受保护的
构造函数(默认情况下),允许派生类型对其进行初始化


例如,基本类型
是抽象的。如果没有派生类型,数据将流向哪里?调用
抽象方法时会发生什么?该方法没有实际的实现可供调用。

它打算用作基类

抽象修饰符可以与 类、方法、属性, 索引器和事件

在类中使用抽象修饰符 声明以指示类 仅用于作为的基类 其他课程

抽象类具有以下特性 特点:

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

因为它是抽象的,对象是具体的。抽象类有点像一个模板,或者一个空的/部分空的结构,在使用它之前,您必须扩展它并在它的基础上进行构建


以“Animal”抽象类为例。没有所谓的“纯”动物——有特定类型的动物。所以你可以实例化狗、猫和海龟,但你不应该实例化普通的动物——这只是一个基本的模板。还有一些所有动物都共享的功能,比如“
makeSound()”,
,但不能在基本动物级别上定义。因此,如果您可以创建一个动物对象并调用
makeSound(),
该对象如何知道要发出哪个声音?

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

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

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=新B();
a、 D();
a、 E();
List List=new List(){new B(),new C()};

简单地说,抽象类就像类的外壳。并非所有的方法都有实现,比如缺少某些导线段的电路。虽然它的大部分可能是建设,它是由用户坚持在这些部分的电线和电阻,因为他们认为合适


至于为什么Java不允许您创建它,它的一部分只是故障保护(只要您不调用未实现的方法,许多抽象类在没有任何添加的情况下都可以正常工作)。

这里有一个类似的StackOverflow问题。简而言之,在抽象类上使用公共构造函数是合法的。一些工具会警告您这毫无意义


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

每个人都在编写数据。抽象类有一些未定义的虚函数。由于这个原因,我们不能创建对象,但抽象类是一个关键字为“abstract”的类,它可能有也可能并没有抽象方法。我认为这是一个概念,它不需要任何dat内存。因此,如果我们可以创建一个对象,那么内存将被创建,这是不可能的,因为我们不能创建抽象类的对象,我们可以创建它的引用,它不占用任何内存位置。

我不同意接受的答案。原因是我们可以有身体来做纯粹的虚功能

答案是:


在类中创建纯虚拟函数时,我们在VTABLE中为函数保留一个插槽,但不在该插槽中放置任何地址。因此VTABLE将是不完整的。 由于VTABLE for Abstract类不完整,因此编译器将不允许为此类创建对象,并在您尝试创建对象时显示错误消息。

抱歉,各位

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

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

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();
   }
}
所以你们的答案是肯定的,若抽象类不是抽象方法,我们可以为它创建对象。
检查我的程序。

我们也可以像这样为抽象类创建对象

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(); 
} 

实际上,当我们创建一个普通类的对象时,我们使用构造函数来分配内存 为此,o
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(); 
} 
myclass obj=new myclass();