精华内容
下载资源
问答
  • 抽象类为什么不能被new
    千次阅读
    2021-02-09 20:23:43

    抽象类为什么不能实例化(new)

    答案是 规定。

    第一点:回归问题最初, 我们为什么要实例化?
    我们先逆向思维来考虑,从面向对象的思想来看:

    我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此我们需要对象,因此我们需要实例化。

    那么回归本问题,什么是抽象类?

    抽象:就是不具体的意思。类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以实例化一个苹果,但你不能实例化一个水果(这个现实中存在的实物)。

    2.内存考虑:

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

    3.现实逻辑:

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

    4.设计层面:

    为了实现多态,当某些类只希望作为父类使用,不希望被实例化。也就是我们从上层设计角度,就不希望有些类被实例化。当我们进行设计的时候需要尽量依赖父类,越向上层的类越稳定,不容易被修改。

    综上所述:现实逻辑,面向对象,设计,内存都不希望我们实例化抽象类,所以 编译器规定不能实例化。

    还需要注意的一点是实例化和有没有构造方法没有关系,构造方法只是初始化对象的,new关键字向JVM申请内存来创建对象的。

    更多相关内容
  • 抽象类为什么不能创建对象?

    千次阅读 2020-07-10 17:24:06
    抽象类什么抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟...

    抽象类是什么?

    抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

    通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。

    抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

     通过上面的阐述,大家应该对抽象类有了一个大概的认识吧!但是对纯虚拟函数和抽象方法分别是什么还是有一定的模糊

    纯虚函数:纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

    纯虚函数也可以叫抽象函数,一般来说它只有函数名、参数和返回值类型,不需要函数体。这意味着它没有函数的实现,需要让派生类去实现。

    抽象方法:java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。

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

    首先与具体的类作比较:

    1. 抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)
    2. 允许(但不要求)抽象类包含抽象成员。
    3. 抽象类不能被密封。

     与接口作比较:

    相同点——不能实例化、包含未实现的方法声明、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)

    不同点——

    1. 类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
    2. 抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
    3. 抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)
    4. 抽象类是对象的抽象,然而接口是一种行为规范。

    在Java中的应用:

    1. abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface
    2. 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
    3. abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
    4. 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法
    5. 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值
    6. 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值、
    7. 接口中的方法默认都是 public,abstract 类型的
    展开全文
  • 抽象类为什么不能被实例化?

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

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

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

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

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

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

    展开全文
  • 接口是我们常用的,抽象类好像并不是怎么常用,但这并代表他重要,他可以继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有这样的功能。       抽象类的出现使得...

          接口是我们常用的,抽象类好像并不是怎么常用,但这并不代表他不重要,他可以被继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有这样的功能。
          抽象类的出现使得位于上层的类更具有通用性。从某种角度来看,祖先类更加具有通用性。
          普通类加abstract即为抽象类。抽象类不能够被实例化,也就是说我定义了一个抽象类public abstract class Person{...}类,这个person类不能被new;大家也都知道,在new的时候是调用了构造方法,既然抽象了不能够被new为什么还要有构造方法?世界之大,无奇不有,这个方法行不通我们就想另一种方法,我们可以通过new,可以通过set、get方法给成员属性赋值,我们还可以在子类中调用super()方法给父类赋初值,然后继承父类当中的属性,既然不能通过new来调用抽象类的构造方法,我们可以看到还可以通过子类的super()方法来调用抽象类的构造方法,并对其赋值,例如我编写了一个Student类,继承于抽象类Person,public class Student extents Person{...},Student类可以被实例化,要想对Person类中的某些成员方法赋初值,可以在Student类中调用super()方法,对抽象类的成员属性进项赋值,继承了抽象类的子类就可以对抽象类的一些属性进行赋值,并且可以继承抽象类已经赋值过的方法和属性。
          需要注意的是,还可以定义一个抽象类的对象变量,但是他只能引用非抽象类子类的对象。例如,Person p = new Stduent(“张三”,28);这里的p是一个抽象类Person的变量,Person引用了一个非抽象子类Student的实例。
          抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类,在抽象类中的抽象方法可以只定义,空实现,但是实现了抽象类的子类必须要重写实现抽象类中的抽象方法。

    展开全文
  • 在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化” 如果只是想单纯的理解,那么...
  • 他问的:“为什么抽象类无法实例化,但是可以new出来一个实例,官方这么说是什么意思?而且去了各类论坛,回答的都是比较含糊其辞,切到重点.说什么是面向对象设计的规范balabala…”. 我心理想,这貌似是一个老生常谈的...
  • 抽象类: 被abstract修饰的类 * 抽象方法: 被...抽象类不能被实例化|能创建对象 * 2.抽象方法要存在与抽象类中,抽象方法必须被重写 * 3.抽象类的使用: * 具体子类: 重写所有的抽象方法+ 按需新增(普通方法)...
  • Java抽象类不能创建对象

    万次阅读 2017-03-06 14:35:21
    抽象类和接口都创建对象,只是后边的new不能是new他们自己,但可以new他们的实现类(必须是类,不抽象类和接口), 人们使用抽象类和接口只是为了说明要干什么事,而让他们的实现类去根据自己的需要去实现这些...
  • 抽象类不能被实例化

    千次阅读 2018-09-19 21:40:14
    /** * */ package test919; public abstract class Animal { private String name;... Cat c = new Cat("smallred", "red"); System.out.println(c.eyeColor); c.enjoy(); } } 结果:
  • 抽象类能创建对象吗?

    千次阅读 2020-07-15 00:27:20
    抽象类不能创建对象的原因: 1.子类更具体,父类更抽象,直接创建父类对象本身没有意义。 2.如果创建的是父类对象再调用方法的时候,调用的父类中的方法,而非子类的方法,它违背了多态的这种思想和设计 3.因为...
  • 为什么呢? 因为我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。所以说,动物本身并不是一个具体的事物 而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也...
  • 抽象类不能继承接口

    千次阅读 2017-09-21 10:21:43
    1. 抽象类可以继承普通类,但可以继承接口。 (public abstract class 抽象类 extends 普通类 { }) 2. 接口可以继承多接口,但可以继承抽象类。 (public abstract class 接口1 extends 接口2,接口3 ,接口4{ }...
  • 你知道java当中抽象类的作用是什么吗?有什么作用?下面和小编一起来详细的了解一下具体的作用,以及看看抽象类作用的例子吧!一、java抽象类的作用java抽象类的作用具体的可以分成以下的三点:1、抽象类通常都是用来...
  •  最近有同事跟我说了他面试时遇到的问题,考官问:“接口和抽象类可以被new嘛?”。这可能不是考官的原话,但是据他表达考官大概就是这个意思了。听到这个问题,我的第一反应是肯定不行啊,直接对接口和抽象类调用...
  • Java中的抽象类和接口

    千次阅读 多人点赞 2022-04-08 15:17:42
    各位铁汁们大家好呀!今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 里面也会讲到多态呀,一起来看看吧
  • 接口和抽象类可以被new嘛?——顺便总结内部类

    万次阅读 多人点赞 2015-08-04 21:04:13
     最近有同事跟我说了他面试时遇到的问题,考官问:“接口和抽象类可以被new嘛?”。这可能不是考官的原话,但是据他表达考官大概就是这个意思了。听到这个问题,我的第一反应是肯定不行啊,直接对接口和抽象类调用...
  • 以举例的方式说到如何区分抽象类和接口,这里我们从Java语法谈起,使我们更加了解这两者的内在区别。...忽然有此一文,是因为同学疑惑道:抽象类居然还有构造方法,又不能直接用来new。我的解释...
  • 抽象类和接口

    千次阅读 2020-11-24 19:38:35
    ​ 父类当中的方法,他的子类们重写,子类的各自实现又一样。那么父类的方法声明和方法体,只有声明还有意义,而方法体内容则没有存在的意义。我们把这种没有方法体内容的方法称为抽象方法。Java语言规定,...
  • 抽象类不能被实例化,即能使用new创建一个对象,只能被继承 被abstract修饰的方法,称为抽象方法 定义方式: public abstract 返回值类型 方法名(); 抽象方法只有声明,没有具体实现,即没有方法体,以分号结尾 2...
  • java抽象类和接口有什么意义

    千次阅读 2021-02-04 16:53:06
    为什么接口和抽象类不能实例化,为什么接口可以多个实现而抽象类只能单继承,特别是java8之后,抽象类和接口里面都可以写代码后,就更加分清了,今天重新整理一下。 什么是抽象类(abstract class) 使用abstract...
  • Java 抽象类和接口

    千次阅读 热门讨论 2021-11-14 16:09:56
    文章目录一、抽象类1....在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并是所有的类都是用来描绘对象的,如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。 1.2抽象方法的
  • 抽象类不能进行实例化吗?

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

    千次阅读 2021-03-15 17:45:41
    1.继承关键字extendsjava中继承特点:在Java中,只支持单继承,允许多继承,也就是说一个只能有一个直接父类多个可以继承一个父类在Java中,多层继承是可以的,即一个的父类可以再去继承另外的父类,例如C...
  • 提示错误 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\...
  • java抽象类和抽象方法

    千次阅读 2021-02-27 12:26:26
    抽象类的使用一般通过继承来实现二、为什么需要抽象类和抽象方法引用抽象方法和抽象类,是java提供的一种语法工具,引导使用者正确的使用它们,减少误用。相当于对子类进行一定限制。三、抽象类和抽象方法的语法规则...
  • 它们的语法区别:1)接口不能有构造方法,抽象类可以有。2)接口不能有方法体,抽象类可以有。3)接口不能有静态方法,抽象类可以有。4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。 忽然...
  • java抽象类详解

    千次阅读 2021-02-25 18:11:57
    final关键字final 修饰符 可以修饰 类、属性、方法修饰类时 表示该类不能被继承 其他特征 跟普通的类一样修饰 属性时 表示 改属性能改变 并且 必须赋初始值修饰方法时 表示该方法不能被重写什么抽象类?...
  • Java抽象类 详解

    万次阅读 多人点赞 2016-10-05 00:06:35
    一、抽象类的基本概念普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 810,047
精华内容 324,018
关键字:

抽象类为什么不能被new