请教下,类不占用存储空间怎么理解?

比如定义一个类 class Time。数据成员中hour,minute,sec 这些不占用存储空间吗?比如hour,这四个字符不占用空间?

楼主不要将抽象的内存存储空间跟实际的物理存储混淆。
教材中是为了说明内存的存储空间的,你声明了一个类,他是抽象的,看不到也摸不到,没有实例化时是无法进行数据的存储的,因此“无处容纳数据”,也就是不占用存储空间;
而你定义了这个类,当将其保存到本地目录D盘下面时,你写的越长,他占用的物理存储也就越多,这个是实际的物理存储,比如你定义hour类型,他占用的物理存储肯定比你没有定义hour前占用的物理存储空间要大。

我们学程序,很少关注物理存储空间,一般教材中说的都是跟内存相关的。

类只是定义,只有真正加载内,实例化对象的时候,才会分配空间。

当然占用存储。
如果这些字段是值类型,那么占用它本身长度的存储。如果是引用类型,占用4个字节。

怎么不占用,你new的时候都要分配空间给各个成员

这只是一个概念上的意思,就是类需要跟实例对象绑定,定义一个类的对象,然后才来说它的占有空间等。

对于C++来说,你定义的字段,对于对象,都是需要分配内存的,无论是堆上还是栈上
你可以用sizeof看下。

静态定义,不参于编译

定义类的时候,如果不是静态类,理论上不会占用内存空间,当实例化后会分配内存空间

当然占用存储。
如果这些字段是值类型,那么占用它本身长度的存储。如果是引用类型,占用4个字节。

  • 是说类,不是说实例吧。
  • 对的,类不占存储空间(当然静态属性、方法不在讨论之列)。可以认为,类是一种格式。它规定了在实例的一块存储空间中那个位置表示什么。
  • 但是类本身不是数据,所以不占存储空间。
  • 在编译的时候,对应的类中的属性、方法都被转换成基础地址的偏移量。
  • 至于你所说的hour,那只是源代码里给人看的,最终给电脑看的版本里面是没有的。

定义类的时候,如果不是静态类,理论上不会占用内存空间,当实例化后会分配内存空间

这个应该是从堆或栈的角度考虑的,类不占用堆或栈的空间而对象需要占用。

楼主说的应该是指编译的时候系统为其分配的内存吧

指的是不占堆的空间(heap),也就是new 操作以后,会被分配的区域。
类的定义是在栈中(Stack)

建议你网上搜搜 Java内存管理

定义一个类的过程,是定义了这个类的表示方式,以及包含的成员。
类本身只是描述了这个类应该如何表达。是一种描述。
类的实例,则是按照类的描述为一个对象在内存中分配空间。

所以只定义一个类是不占用空间的,因为定义的过程只是描述了这个对象,而并没有为对象生成任何实例。
当我们为类声明一个实例时,空间的分配才真正的发生。

一个例外就是静态的类,或静态的类成员。他们在声明是就已经在内存中开辟了空间。

就和你定义一个结构体一样,会占用内存的