精华内容
下载资源
问答
  • 抽象类为什么不能直接实例化
    千次阅读
    2020-07-08 22:25:23

    问题背景

    在理解抽象类为什么不能被实例化之前,首先我们要了解以下几个问题。

    • 问题一:什么是抽象类?
      抽象类是Java中一种特殊的类,该类使用了abstract关键字进行修饰,该类允许有普通方法和抽象方法,该类不能够进行实例化(这个在后面进行解释)因为抽象类不能直接实例化,所以必须需要有实现子类。
    • 问题二:为什么要有抽象类?
      抽象类是介于接口与普通类之间的一种结构,接口中定义的都是抽象方法,而类中都是普通方法。当我们存在一类事物,他们大多数结构和功能存在雷同,只有少部分存在不同,如果我们直接使用子类实现接口,那么结构和功能相同部分的代码将会造成大量冗余,因此我们需要一种结构,里面可以提供一部分已经实现了的共同的代码,剩下的一小部分由具体子类去实现即可,达到了代码的重用。

    问题回答

    1.从Java规范来看:很简单直了,Java程序中规定了抽象类不能实例化。强行实例化就会报错。
    2.从功能角度来看:抽象类是一个结构和功能“不完整”的类,如果你让他强行“出生”的话,它可能会患有各种疾病,所以我们不能直接进行实例化,需要通过子类对结构和功能进行补全才能让它健康出生。
    3.从内存分配角度来看:抽象类只在分配了在栈中的引用,没有分配堆中的内存。程序都有一个代码段,在内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化。

    更多相关内容
  • 抽象类为什么不能实例化

    千次阅读 多人点赞 2019-12-04 21:54:39
    今天无意中看到一个问题:为什么抽象类不能实例化? 很多人的答案都是再说使用抽象类的好处,但是并没有回答为什么不能实例化?这个过程就像是在回答:为什么公鸡不能下蛋?然后回答是使用公鸡可以打鸣。 按照我的...

    今天无意中看到一个问题:为什么抽象类不能实例化?
    很多人的答案都是再说使用抽象类的好处,但是并没有回答为什么不能实例化?这个过程就像是在回答:为什么公鸡不能下蛋?然后回答是使用公鸡可以打鸣。
    按照我的理解,如果不对,欢迎补充。
    答案是规定
    为什么我这么理解,原因有以下几点。

    1. 第一点:回归问题最初,我们为什么要实例化?
      我们先逆向思维来考虑,从面向对象的思想来看:
      我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此我们需要对象,因此我们需要实例化。
      那么回归本问题,什么是抽象类?
      抽象:就是不具体的意思。类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以实例化一个苹果,但你不能实例化一个水果(这个现实中存在的实物)。

    2. 内存考虑:
      对象实例化的时候,关键字new向JVM申请内存,这个类的成员(成员变量,成员方法)会被保存到内存中。而抽象类,没有具体的成员(成员变量,成员方法),没办法准确分配内存。

    3. 现实逻辑:
      按照现实逻辑,抽象是从现实实物的抽离,总结,比如定义一个动物类接口。这个接口是所有动物所共有的特点组成在一起,但是并不能组成现实中真真正正存在的物种。那么为什么要有抽象类?

    4. 设计层面:
      为了实现多态,当某些类只希望作为父类使用,不希望被实例化。也就是我们从上层设计角度,就不希望有些类被实例化。当我们进行设计的时候需要尽量依赖父类,越向上层的类越稳定,不容易被修改。
      综上所述:现实逻辑,面向对象,设计,内存都不希望我们实例化抽象类,所以编译器规定不能实例化在这里插入图片描述
      关于抽象类可以看这篇文章
      还需要注意的一点是实例化和有没有构造方法没有关系,构造方法只是初始化对象的,new关键字向JVM申请内存来创建对象的。

    展开全文
  • 在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化” 如果只是想单纯的理解,那么...

    在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化”

    如果只是想单纯的理解,那么意思就是你画了一个有四条边的图形你说是矩形

    但是这是不可以的,为什么?因为矩形还有一个条件就是要四个内角是直角

    其中画有四条边的图形就是抽象类,矩形就是实例化

    如果理解了含义但是不懂代码中的定义,那么那么就百度百度定义!定义真的很重要!

    抽象类定义:

    含有纯虚函数的类称为抽象类

    实例化的定义:

    用类创建对象的过程

    纯虚函数的定义:

    一个只有函数名、参数和返回值类型,没有函数体的函数成为纯虚函数。

    这一层懂了当然最好

    如果不懂再来看看代码test 中shape未编译通过

    #include <iostream>
    using namespace std;
    //定义一个形状抽象类(基类)
    class Shape {
        //保护继承 ,其派生类也会继承保护成员
      protected:
        double x;
        double y;
        //公有继承
      public:
        void set(double i, double j) {
            x = i;
            y = j;
        }
        //纯虚函数
        virtual void area() = 0;
    };
    //定义矩形类并定义其面积为长*宽(派生类)
    class Rectangle : public Shape {
        void area() { cout << x * y << endl; }
    };
    
    int main() {
        Rectangle rec; //定义一个矩形对象(实例化)
        // Shape rec;
        Shape *p = &rec; //定义一个抽象类的指针,并使它指向矩形对象
        p->set(2, 4);    //调用
        p->area();
        return 0;
    }

    详细定义矩形,可以实例化并正常输出

    未定义,提示含有纯虚函数无法抽象实例化对象

    展开全文
  • java 抽象类为什么不能实例化

    千次阅读 2019-08-29 09:30:16
    转载:java 抽象类为什么不能实例化? 我把CSDN论坛里面的一个帖子内容list到下面,自己看着理解,东家一言,西家一语,杂合起来,基本上也就理解了java中的抽象类为什么不能实例化了。 因篇幅有限,只能罗列...

    转载:java 抽象类为什么不能被实例化?

    我把CSDN论坛里面的一个帖子内容list到下面,自己看着理解,东家一言,西家一语,杂合起来,基本上也就理解了java中的抽象类为什么不能被实例化了。

    因篇幅有限,只能罗列部分留言

    以下内容不分先后顺序

    =====================================

    抽象类只在分配了在栈中的引用,没有分配堆中的内存。程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化

    =====================================

    哲学角度,抽象基类往往在逻辑上无法实体化,比如说让别人去买水果,不说买什么,就说买水果,显然是买不到一种叫“水果”的东西的。

    =====================================

    主要是两点,一个是抽象类是一个不完整的类,一个是内存分配问题。
    实际上抽象类更多提供的是一个框架的功能,参数比接口更详细些。

    =====================================

    本末倒置了
    抽不抽象是设计时该考虑的问题,不能问为什么抽象类不能实例化
    因为在设计时,考虑到某些类所具备的信息不足以实例化一个对象,才设计成抽象的
    所以问题反过来就是答案:
    因为这个类不能够被实例化,所以才设计成抽象的,至于为什么这么做,问你的设计师吧,他也许会给出你答案
    不过设计师的脾气都不太好,给你一棒子叫你照着做就行了也是有可能的

    =====================================

    抽象类,就像是向别人声明:我能赚大钱
    实例化就是具体的行动
    因为抽象类只是个声明,而没有计划,也不知道怎么赚钱
    所以我们是不会投资给钱(内存)他的,就算投资他他也不能做任何事
    为了保存大家的利益,没有具休的赚钱计划不能让他执行

    =====================================

    不仅JAVA,其他任何语言都一样~这是由语言的设计决定了的,就是纯粹为了继承而存在

    =====================================

    抽象这个词已经很好的说明这一点了,我的理解是:对事物进行抽象通常是基于一定的经验,从众多的经验中总结出规律,浓缩的结果可以在以后多次获利,但是经验并不能真正帮你工作,你还是需要融入实践应用!

    =====================================

    学过汇编你会知道,程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化

    =====================================

    面向对象思想是对现实社会的模拟(抽象),从哲学上讲进化不完全的物种是不能生存的!

    =====================================

    这是从设计思想层面的东西,为什么要纠结这个问题呢?
    说白一点,这就是java的使用规范.

    =====================================

    如果你是一个老板,你问一个应聘的人员:你会什么?他给你一个“我不知道”的答案,你会怎么做!!
    这个例子视乎能更现实的说明你的这个问题。面向对象语言是从现实中抽象出来的,它该符合正常的逻辑秩序。

    =====================================

    Java中是允许不含抽象方法的抽象类的,我认为应该是出于安全的考虑,编译器强制规定不允许抽象类产生对象!

    =====================================

    java里这么规定的,原因我个人认为是抽象类里有未实现的抽象方法,实例化时不能正常分配内存吧,而且调用这个方法时不是要出异常吗

    参考

    讨论一下:Java中的抽象类到底为何不能实例化?


    展开全文
  • 抽象类为什么不能实例化(new)

    千次阅读 2021-02-09 20:23:43
    抽象类为什么不能实例化(new) 答案是 规定。 第一点:回归问题最初, 我们为什么实例化? 我们先逆向思维来考虑,从面向对象的思想来看: 我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此...
  • 在学习C++时候,有了抽象类不能实例化的第一种解释: 抽象类中包含纯虚函数,所以不能实例化。 今天了解到了另一种解释: 抽象类将它的部分或者是全部操作的实现延迟到子类中,因此不能实例化。 一个是从语法...
  • java规定类都要有一个构造方法,没有默认提供一个空参构造 ...抽象方法需要被字类继承,字类的构造方法中是用super()调用父类的构造方法实例化的,如果抽象类没有构造方法,那么久无法被字类继承了。 ...
  • 文章目录java的接口为什么不能实例化呢?总结: java的接口为什么不能实例化呢? 首先,我们需要明白实例化的含义。实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student...
  • 关于为什么抽象类不可以被实例化

    千次阅读 2018-04-26 20:17:11
    个人想法为什么抽象类不可以被实例化?首先有2个设定在:含有抽象类的方法必须被定义为抽象类。抽象方法是不能被调用的。虽然抽象类一定有抽象方法,但一旦有抽象方法时,就可以通过点方法调用,导致1、2两个...
  • 抽象类能实例化

    千次阅读 2021-02-12 14:14:53
    这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各相同,每个人有每个人的理解,后来我想明白了:抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的对象, 需要先用一个类继承...
  • 不能实例化抽象类”错误

    千次阅读 2021-12-07 21:29:03
    对于“不能实例化抽象类”编译错误,主要基本是子类...若这个时候直接实例化B,则会出现“不能实例化抽象类”的编译错误: int main(){ B b(); } 这时只要实现父类A中的所有纯虚函数即可: class B:public A{ public:
  •       接口是我们常用的,抽象类好像并不是怎么常用,但这并代表他重要,他可以被继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有...抽象类不能够被实例化,也就是说
  • 抽象类不能进行实例化吗?

    万次阅读 2017-07-26 10:55:44
    抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化
  • 抽象类不能实例化

    千次阅读 2018-09-19 21:40:14
    /** * */ package test919; public abstract class Animal { private String name; public Animal(String name) { super(); this.name = name; } public abstract void enjoy();...package t...
  • Java关于抽象类能否被实例化的问题

    千次阅读 2021-02-27 12:43:48
    转载:http://blog.csdn.net/zhanzhan0329/article/details/9173419首先明确地说:抽象类不能实例化。我对抽象类能否被实例化产生疑问始于我看到一句话说:子类实例化会先实例化父类。而且,自己也知道,抽象类...
  • 构造器就是为了初始化对象而存在的吗 既然抽象类不能实例化为什么 还要按个构造器 ?
  • 抽象类无法直接实例化,它的实例化方式并不是通过普通的new方式来创建对象,而是通过父类的应用来指向子类的实例间接地实现父类的实例化,因为子类在实例化之前,一定会先实例化它的父类。这样创建了继承抽象类的...
  • 抽象类为什么不能创建对象?

    千次阅读 2020-07-10 17:24:06
    抽象类什么抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟...
  • 首先我们知道,一个类如果是抽象类,我们就不能用这个类实例化一个对象。什么样的类是抽象类呢? C++没有C Sharp中的关键字abstract,但是当一个类中有一个或多个纯虚函数的时候,这个类就自动成为了抽象类,即...
  • java抽象类到底能不能够实例化

    千次阅读 2020-03-07 16:31:58
    抽象类能不能实例化? 测试 创建一个AbstractFruit抽象类 public abstract class AbstractFruit { public AbstractFruit(){ System.out.println("我是Fruit的抽象类,我被实例化了"); } public abstract v...
  • 他问的:“为什么抽象类无法实例化,但是可以new出来一个实例,官方这么说是什么意思?而且去了各类论坛,回答的都是比较含糊其辞,切到重点.说什么是面向对象设计的规范balabala…”. 我心理想,这貌似是一个老生常谈的...
  • JAVA中抽象类不能实例化,但是却可以写构造方法,为什么呢?  首先第一点:构造方法不能实例化,想象一下,如果可以实例化,那么,实例化的是所有的子类还是具体哪一个?  第二点:为什么可以有构造方法?  看...
  • abstract 修饰类 (抽象类不能直接实例化 可以达到 在编译期间提示程序员不要实例化一些没有意义的类 不能直接实例化 但是可以实例化其子类(可以进行向上转型) 真正干活的有意义的其实也是子类的实例对象 ...
  • 错误:error C2259 不能实例化抽象类 原因: 抽象类不能实例化,需要在派生类中实现基类所有定义的虚函数,只要有一个纯虚函数没有定义,那么在派生类还是抽象类。仍然不能实例化。 解决方法: 把父类的虚函数都...
  • C++ 不能实例化抽象类

    万次阅读 2014-01-03 09:11:18
    关于C++ 不能实例化抽象类: 例: #include class Base{ public:virtual void fun()=0; } ; class Test:public Base{ public:virtual void fun(){cout;} } ; void main(){ Base a; Test *p;p=&a; } void...
  • 抽象类实例化方法

    千次阅读 2018-10-31 22:00:30
    抽象类实例化方法 抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。 ...
  • 这篇文章我讲解一个编程中遇到一个错误,那就是提示”不能实例化抽象类的错误“,在输出窗口有如下的错误提示信息,如下图: 根据具体情况不同,可能涉及到的类也可能不同,但是道理是一样的,之所以出现这样的...
  • MFC工程 error C2259: “CXXXX”: 不能实例化抽象类。 解决方法:就是需要把基类里面的所有纯虚函数在派生类里面全部实现,缺少一个都不行,简单实现就是子类的头文件里面直接空实现(用到此接口的情况下)。 例如...
  • 提示错误 1 error C2259: “AndQuery”: 不能实例化抽象类 d:\vsproject\new_query\new_query\query.h 155 1 New_query 错误 2 error C2259: “OrQuery”: 不能实例化抽象类 d:\vsproject\new_query\new_query\...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 561,605
精华内容 224,642
关键字:

抽象类为什么不能直接实例化