-
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修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。
为什么抽象类还不能创建对象?
首先与具体的类作比较:
与接口作比较:
相同点——不能实例化、包含未实现的方法声明、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)
不同点——
在Java中的应用:
- abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface
- 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
- abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
- 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法
- 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值
- 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值、
- 接口中的方法默认都是 public,abstract 类型的
-
抽象类为什么不能被实例化?
2019-12-04 21:54:39今天无意中看到一个问题:为什么抽象类不能实例化? 很多人的答案都是再说使用抽象类的好处,但是并没有回答为什么不能实例化?这个过程就像是在回答:为什么公鸡不能下蛋?然后回答是使用公鸡可以打鸣。 按照我的...今天无意中看到一个问题:为什么抽象类不能实例化?
很多人的答案都是再说使用抽象类的好处,但是并没有回答为什么不能实例化?这个过程就像是在回答:为什么公鸡不能下蛋?然后回答是使用公鸡可以打鸣。
按照我的理解,如果不对,欢迎补充。
答案是规定。
为什么我这么理解,原因有以下几点。-
第一点:回归问题最初,我们为什么要实例化?
我们先逆向思维来考虑,从面向对象的思想来看:
我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此我们需要对象,因此我们需要实例化。
那么回归本问题,什么是抽象类?
抽象:就是不具体的意思。类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以实例化一个苹果,但你不能实例化一个水果(这个现实中存在的实物)。 -
内存考虑:
对象实例化的时候,关键字new向JVM申请内存,这个类的成员(成员变量,成员方法)会被保存到内存中。而抽象类,没有具体的成员(成员变量,成员方法),没办法准确分配内存。 -
现实逻辑:
按照现实逻辑,抽象是从现实实物的抽离,总结,比如定义一个动物类接口。这个接口是所有动物所共有的特点组成在一起,但是并不能组成现实中真真正正存在的物种。那么为什么要有抽象类? -
设计层面:
为了实现多态,当某些类只希望作为父类使用,不希望被实例化。也就是我们从上层设计角度,就不希望有些类被实例化。当我们进行设计的时候需要尽量依赖父类,越向上层的类越稳定,不容易被修改。
综上所述:现实逻辑,面向对象,设计,内存都不希望我们实例化抽象类,所以编译器规定不能实例化。
关于抽象类可以看这篇文章
还需要注意的一点是实例化和有没有构造方法没有关系,构造方法只是初始化对象的,new关键字向JVM申请内存来创建对象的。
-
-
带你了解什么是抽象类,抽象类不能够被实例化为什么还有构造方法?
2020-06-03 09:52:19接口是我们常用的,抽象类好像并不是怎么常用,但这并不代表他不重要,他可以被继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有这样的功能。 抽象类的出现使得...接口是我们常用的,抽象类好像并不是怎么常用,但这并不代表他不重要,他可以被继承,可以有构造方法,可以给类中的成员变量赋初值,接口就没有这样的功能。
抽象类的出现使得位于上层的类更具有通用性。从某种角度来看,祖先类更加具有通用性。
普通类加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的实例。
抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类,在抽象类中的抽象方法可以只定义,空实现,但是实现了抽象类的子类必须要重写实现抽象类中的抽象方法。 -
不能实例化抽象类&抽象类不能实例化
2020-12-02 14:19:14在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化” 如果只是想单纯的理解,那么... -
关于抽象类无法实例化,但是可以使用“new“来实例的疑问
2020-07-04 20:30:41他问的:“为什么抽象类无法实例化,但是可以new出来一个实例,官方这么说是什么意思?而且去了各类论坛,回答的都是比较含糊其辞,切不到重点.说什么是面向对象设计的规范balabala…”. 我心理想,这貌似是一个老生常谈的... -
什么是抽象类 抽象类有什么好处 为什么要用抽象类
2019-10-24 20:55:31抽象类: 被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.因为... -
Java中抽象类的概述及其详解(什么是抽象类?为什么要使用抽象类?抽象类的特点?)
2019-05-09 17:19:59为什么呢? 因为我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。所以说,动物本身并不是一个具体的事物 而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也... -
抽象类不能继承接口
2017-09-21 10:21:431. 抽象类可以继承普通类,但不可以继承接口。 (public abstract class 抽象类 extends 普通类 { }) 2. 接口可以继承多接口,但不可以继承抽象类。 (public abstract class 接口1 extends 接口2,接口3 ,接口4{ }... -
java中抽象类的作用是什么?抽象类作用的例子
2021-03-01 08:02:24你知道java当中抽象类的作用是什么吗?有什么作用?下面和小编一起来详细的了解一下具体的作用,以及看看抽象类作用的例子吧!一、java抽象类的作用java抽象类的作用具体的可以分成以下的三点:1、抽象类通常都是用来... -
Java 接口和抽象类可以被new么?——顺便总结内部类
2018-09-07 09:57:56最近有同事跟我说了他面试时遇到的问题,考官问:“接口和抽象类可以被new嘛?”。这可能不是考官的原话,但是据他表达考官大概就是这个意思了。听到这个问题,我的第一反应是肯定不行啊,直接对接口和抽象类调用... -
Java中的抽象类和接口
2022-04-08 15:17:42各位铁汁们大家好呀!今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 里面也会讲到多态呀,一起来看看吧 -
接口和抽象类可以被new嘛?——顺便总结内部类
2015-08-04 21:04:13最近有同事跟我说了他面试时遇到的问题,考官问:“接口和抽象类可以被new嘛?”。这可能不是考官的原话,但是据他表达考官大概就是这个意思了。听到这个问题,我的第一反应是肯定不行啊,直接对接口和抽象类调用... -
Java中抽象类有构造方法可以直接new对象
2019-03-11 22:50:00 -
Java中抽象类和接口中有构造方法吗?
2021-03-08 05:52:39以举例的方式说到如何区分抽象类和接口,这里我们从Java语法谈起,使我们更加了解这两者的内在区别。...忽然有此一文,是因为同学疑惑道:抽象类居然还有构造方法,又不能直接用来new。我的解释... -
抽象类和接口
2020-11-24 19:38:35 父类当中的方法,被他的子类们重写,子类的各自实现又不一样。那么父类的方法声明和方法体,只有声明还有意义,而方法体内容则没有存在的意义。我们把这种没有方法体内容的方法称为抽象方法。Java语言规定,... -
3.抽象类:什么是抽象类???抽象类的特点有哪些???
2020-06-16 16:33:09抽象类不能被实例化,即不能使用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:411.继承关键字extendsjava中继承特点:在Java中,类只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类多个类可以继承一个父类在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C... -
不能实例化抽象类c++问题
2015-05-25 01:16:43提示错误 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提供的一种语法工具,引导使用者正确的使用它们,减少误用。相当于对子类进行一定限制。三、抽象类和抽象方法的语法规则... -
接口和抽象类的区别&接口为什么不能有构造函数
2017-01-12 15:26:23它们的语法区别:1)接口不能有构造方法,抽象类可以有。2)接口不能有方法体,抽象类可以有。3)接口不能有静态方法,抽象类可以有。4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。 忽然... -
java抽象类详解
2021-02-25 18:11:57final关键字final 修饰符 可以修饰 类、属性、方法修饰类时 表示该类不能被继承 其他特征 跟普通的类一样修饰 属性时 表示 改属性不能改变 并且 必须赋初始值修饰方法时 表示该方法不能被重写什么是抽象类?... -
Java抽象类 详解
2016-10-05 00:06:35一、抽象类的基本概念普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。...