java的接口为什么不能实例化

Wesley13
• 阅读 638

java的接口为什么不能实例化呢?首先,我们需要明白实例化的含义。实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student对象s,并且实例化一个Student对象,实则是在堆中开辟出一块空间来存放Student对象,s则是指向这块空间,也就是内存中的一块地址。这块地址中所存放的值就是我们这个Student对象的一些属性。

具体类所占用的内存空间(也就是堆里的一块地址)所存放的值是类的成员变量,这里插入一张图便于我们理解:

java的接口为什么不能实例化

图中可以看到,栈中存放的是per,值是堆中具体Person这个对象的地址,也就是per指向这个具体类的引用。而堆中一块地址,存放的值是Person这个类的成员变量(局部变量在执行时存放在栈中)。

那么换做一个接口呢?假设我们可以new出一个接口,那么这个接口就会占用堆中的一块地址,那么我们想想接口的这块地址上能够存放什么值呢。

说到这个首先要清楚接口中允许有什么:静态的属性以及方法声明。这里再说明下,java的内存空间分为四类:栈(stack)、堆(heap)、代码(code)、静态数据(data)。由此可见接口中所有的东西的具体值都是存放在代码去和静态数据区的,所以接口的这块地址上并没有任何实际的值需要存储,那么为什么要给他一块地址来浪费空间呢。其实用底层代码在内存中开辟出一块空间很容易,那么为什么java设定不允许接口实例化呢,以我的理解而言,那就是接口的实例化没有任何实际意义,只会占用一块内存空间,却不会在这块空间中放任何实际的值,所以java主动去规避掉了这个问题。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
java的内存机制
Java把内存划分成两种:一种是栈内存,另一种是堆内存。 Heap(堆)Stack(栈)JVM中的功能内存数据区内存指令区存储数据对象实例基本数据类型,指令代码,常量,对象的引用地址堆中存储数据堆内存用来存放由new创建的对象和数组。 保存对象实例,实际上是保存对象实例的属性值,属性的类型和
Wesley13 Wesley13
2年前
java成员变量的初始化
类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值
Stella981 Stella981
2年前
Mybatis Plus代码方式实现多表关联查询
 Mapper接口如下:例1@Select("SELECTt\_question.\,t\_student.\name\FROMt\_question,t\_studentWHEREt\_question.student\_idt\_student.id")List<QuestionStudentVOgetQ
Wesley13 Wesley13
2年前
Java虚拟机堆内存(新生代)
Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象。在Java中,堆被划分成两个不同的区域:新生代,老年代。新生代又被分为了三个区域:Eden,from survivor,tosurvivor。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存分配以及回收。堆的内存模型大致为:从图中可以看出:堆大
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
Java构造器的实质作用
Java构造器的实质作用构造器的本质作用就是为对象初始化,即为实例变量初始化,赋初值;而不是创建对象,创建对象时通过new关键字来完成的,当使用new关键字时就会为该对象在堆内存中开辟一块内存,只等构造器来初始化这块内存,为实例变量赋初始值。在未赋初始值之前是默认值。看代码中的构造器和编译后构造器是不一样的,编译后的构造器包含了更多的内容。
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这