声明和定义的区别

  1.  声明和定义的区别:

在我上课的书中并没有说明两者的区别,书上写着“在本书中,声明和定义有着相同的含义”,当时学的时候也没注意到这点,后来看到一些面试题,才注意到这些坑。

  •       一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。

 

  •   另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。


  声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。

  而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。

  对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。

  总之就是:把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。

  基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。

 

例如:类A

  如果A a;就是一个声明,告诉编译器a是A类的一个对象变量,但是不进行初始化;

  如果以后a=new A();这就是初始化,分配了空间。

  需要注意的是我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。

  定义和声明的具体区别

  所谓定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给它取上一个名字,这个名字就是就是我们经常所说的变量名或对象名。

  声明有2重含义:

  (1) 告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。

  (2) 告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名。


 

 

● 对“定义”的解释:

在java语言中变量或常量的基本定义方式为:

类 变量名= new类();

基本数据类型 变量名 = 值;

举个例子,描述用户的类User:

public class User {

    private String  name;

    private Integer age;

}

现在定义一个变量名为user的User类的对象:User user = new User();

 

当然我们也可以在基本定义方式上增加修饰符:private、public等,也可以在()传入构造函数的参数;

这里需要说明的是:Java的数据类型有基本数据类型(数值型、字符型、布尔型)引用数据类型(类、接口、数组)

其实上面这个基本的变量定义方式包含了4个动作:变量的声明、引用、创建、初始化

 

● 对“声明”的解释:

变量的声明方式:User user;声明的特点是该变量user并没有引用,系统会给它一个默认的引用:null;

 

● 对“引用”的解释:

变量名 = 对象;这个=的过程就是引用;

例:User user2 = user;

这引用表示:变量user2引用的对象与user引用的对象为同一个。

 

● 对“创建”的解释

new 类();这个new的动作即为创建对象;

 

● 对“赋值”的解释

赋值的概念其实基本同引用,所不同是赋值是针对基本数据类型的叫法引用是针对引用数据类型来讲。

例:int n = 100;

定义一个int 类型的变量 n并赋值为100;

 

● 对“初始化”的解释

在变量定义时的赋值或引用即为初始化,也可以理解为第一次赋值或引用的过程。

 

通过上面的解释我们再来回答这个基础的面试题:

以下几种定义变量的方式有什么分别?:

1、  String str;

2、  String str=Null;

3、  String str="";

4、  String str="abc";

5、  String str= new ("abc")

1、  声明了一个变量名为str的类String的变量;

2、  声明了一个变量名为str的类String的变量,它的初始化引用为空;

3、  声明了一个变量名为str的类String的变量,它的初始化引用为一个值是""(空串)的String对象;

4、  声明了一个变量名为str的类String的变量,它的初始化引用为一个值是"abc"的String对象;

5、  声明了一个变量名为str的类String的变量,它的初始化引用为一个新创建的值是"abc"的String对象;

 

1和2的区别在于:2如果是在局部变量的情况下会报编译错误:the local variable b may not have been initialized(局部变量没有被初始化)

2和3的区别在于2的引用是空,也就是在堆(heap)内存中无对应的内存空间,3是指向一个在堆内存中值为“”的一个内存空间;

3和4的区别在于引用对象不同,不同对象对应的内存空间不同;

但是如果:

String a = "", b = "";

String c = "abc"; d = "abc";

这时侯a和b引用的内存地址为同一个,c和d引用的内存地址也为同一个;

这是因为在 =(引用)的过程中,系统会在堆(heap)内存的变量池中查找是否有内存空间存储对象值为"abc"的内存空间,有则引用这个空间。

5与4的别区在于在通过new关键字,系统不会判断堆(heap)内存是否存在相同对象的内存空间,而是直接新申请内存空间创建一个新的对象。

 

  • 101
    点赞
  • 292
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

const

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值