java中对new创建对象表达式的深入理解:

针对之前在学习的过程中,为了便于理解,将int i = 10;这样的语句,个人理解成:int是最基本的简单类,把int当作类来看待,int这个简单类里含有自己的数学运算方法,i是int类型的引用。然后关于int i = 10 我理解为,i = 10,或等于一个新的对象,如int i = new int(); 或者i =sum(1,2);在我当时的理解,i要么等于子面值,比如10,sum(1,2)。要么i等于创建的新的对象,如new int();
这种理解的确在前面学习中让我理解的更快,而且在C#书中,就是把int当作简单类来理解的。然而,在深入了解java中int和Integer的区别的知识点后,发现前面理解的这种思维是错误的。现在特意纠正过来:

1、java内存的划分:
java虚拟机JVM管理的内存主要分为:堆区、栈区、方法区
(1)堆区(heap):new等指令创建的对象、数组
(2)栈区(stack):基本数据类型的变量、对象的引用变量
(3)方法区(method):又称静态区。方法区存储类的所有信息,包括所有的方法,静态变量,常量。再说详细点,方法区存储的是类的方法代码,常量,静态变量,方法名,访问权限,返回值等等。我们前面的学习中听的比较多的是方法区常量池。因此,只要判断存储的东西不是堆区或栈区的,那就是存在方法区里了。

2、类的实例,类的对象,类的引用,类的变量,类的实例化对象,类的引用变量,类的实例化的概念?
A a = new A(); 

(1)
A:类
a:变量,属性变量,引用,类的引用,类的变量,类的引用变量,类的实例变量。存储在栈区。
new A():类的对象,类的实例,类的实例化对象,类的实例化。存储在堆区。
A():类A的构造方法。存储在方法区。

(2)
A a; 在栈内存里面开辟空间给引用变量a,这时a=null。

new A():
用new关键字创建一个新的对象,即进行实例化,即类的实例,类的实例化,类的实例化对象。
用new创建对象就等同于实例化对象。在堆内存里面开辟空间给类的对象,这个对象没有没有名字。只有完整写为A a = new A();这时,a是对象名。

(3)
A a = new A();
是对象创建表达式。引用a中保存了内存地址,指向堆中当前A类的对象new A()。简单说,a指向了堆中当前类的对象。即右边对象将内存地址传给了左边的引用,使得左边的引用指向了右边的对象。
JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的内存地址,使得该引用指向了对象。
类的实例化的过程就是创建类的对象的过程,就是为对象分配内存空间的过程。

3、int i = 10; 
int不是类,int是java中的一种基本数据类型,直接存储数据值。
这里的i是一个指向int类型的引用,指向10这个字面值。
这些字面值的数据,由于大小可知,生存期可知(这些字面值定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
在栈中创建一个变量为i的int类型的引用,然后开辟一个内存地址来存储字面值10,然后将i指向10的地址。

4、
int和Integer的区别:
(1)int是基本类型,不是类,是面向过程留下的痕迹。,Integer是一个类,为了符合面向对象编程出现的封装类,它是对int进行封装的。Integer是int的包装类(封装类)。
(2)Integer定义了很多的转换方法,提供了处理int类型时非常有用的其他一些常量和方法。
(3)int和Integer都可以表示某一个数值,int和Integer不能够互用,因为他们两种不同的数据类型。Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。Integer变量必须实例化后才能使用。
(4)如果我们定义一个int类型的数,只是用来进行一些加减乘除的运算or作为参数进行传递,那么就可以直接声明为int基本数据类型,但如果要像对象一样来进行处理,那么就要用Integer来声明一个对象,因为java是面向对象的语言,因此当声明为对象时能够提供很多对象间转换的方式与一些常用的方法。

5、
int i; 和 Integer a;
在类进行初始化时,int的默认值是0,Integer的默认值是null。
Integer变量a必须实例化后才能使用,即new Integer();
而int变量不需要,int i; 

6、Integer类创建对象表达式:
(1)
Integer a = new Integer();
Integer是一个类,Integer类型的引用变量a指向了堆中新建的对象new Integer()。
变量a中保存了对象new Integer中的内存地址。

String c = new String();
String是一个类,String类型的引用变量c指向了堆中新建的对象new String()。
变量c中保存了对象new String()中的内存地址。

(2)
Integer b1 = new Integer(b);
将b基本数据类型包装成引用数据类型b1

7、Integer和int的比较: 
(1)
Integer a = new Integer(100);
Integer b = new Integer(100);
两个new创建的对象是不同的,其内存地址不同,因此它们各自将内存地址传向各自的引用变量不想等。

(2)
Integer a = new Integer(100);
int c = 100;
包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较。实际上就变成两个int变量的比较,两个变量都同时指向子面值100的地址,因此相等。

(3)
Integer a = new Integer(100);
Integer d = 100;
new Integer()生成的变量指向堆中新建的对象,指向的地址在堆中。
非new生成的Integer变量指向的是java方法区中常量池中的对象,地址在方法区常量池中。
两个引用变量不相等。

(4)
Integer d = 100;
Integer e = 100;

1.非new生成的Integer变量指向的是java方法区中常量池中的对象,地址在方法区常量池中。
如:
String s2 = "Hello"; //在字符串常量池中新建一个"Hello"字符串对象,该对象不可变
String s3 = "Hello"; //从字符串常量池中直接拿来用
因为"Hello"在字符串常量池中只有一份,所以s2和s3的内存地址相同
变量s2==s3
2.java API中对Integer类型的valueOf源代码的定义中,有return new Integer(i);如果变量的值在[-128,127]中,如上面d为100,e也为100,没有超出范围,所以二者的内存地址相等,d==e。即在
valueOf源代码的定义中,前面的d new了一个新的对象,后面的e没有new,直接在缓存中取相同的内
存地址,所以相同。
3.如果Integer d = 128; Integer e = 128; 二者都分别new一个新的对象,就跟(1)中情况一样,
二者内存地址不相同。
记住:Java里面“==”与equals()的区别:前者比较的是地址,后者比较的是内容。

8、
String c1 = "中国";
这与Integer d = 100;一个本质。
非new生成的类变量指向的是java方法区中常量池中的对象,地址在方法区常量池中。
因此,c1指向在方法区里字符串常量池中新建的"中国"字符串对象。

在经过一番总结后,针对前面所说的错误说法:int是最基本的简单类。现在在暂且抛去int与Integer的区别,暂且认为int是最基本的简单类,其实也不影响什么。总之,只要知道int不是类,int是java中的一种基本数据类型,直接存储数据值,Integer是int的包装类(封装类),Integer变量必须实例化后才能使用。
如果本篇博文有什么知识错误,欢迎指导交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值