您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页java总结范本

java总结范本

来源:榕意旅游网

java总结范本

在子类的构造方法中可使用super(argument_list)语句调用父类的构造方法

如果子类的构造方法中没有显示地,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法

如果子类构造方法中既未显式,而父类中又没有无参的构造方法,则编译出错

1publicclassPerson{

3privateStringname;

4privateintage;

5privateDatebirthDate;

7publicPerson(Stringname,intage,Dated){XXX;

XXX;

XXX;

12publicPerson(Stringname,intage){13this(name,age,null);

15publicPerson(Stringname,Dated){

16this(name,30,d);

18publicPerson(Stringname){

19this(name,30);

21……

1publicclassStudente_tendsPerson{

2privateStringschool;

4publicStudent(Stringname,intage,Strings){5super(name,age);

6school=s;

8publicStudent(Stringname,Strings){

9super(name);

10school=s;

12publicStudent(Strings){编译出错:nosuper()13school=s;

对象构造和初始化细节

分配存储空间并进行默认的初始化

按下述步骤初始化实例变量

1.绑定构造方法参数

2.如有this()调用,则调用相应的重载构造方法,然后跳转到步骤5

3.显式或隐式追溯调用父类的构造方法(Object类除外)

4.进行实例变量的显式初始化操作

5.执行当前构造方法的方法体

==操作符与equals方法

==操作符与equals方法的区别:

引用类型比较引用;基本类型比较值;

equals()方法只能比较引用类型,"=="可以比较引用类型及基本类型;

特例:当用equals()方法进行比较时,对类File、String、Date及封装类(WrapperClass)来说,是比较类型及内容而不考虑引用的是否是同一个实例;

用"=="进行比较时,符号两边的数据类型必须一致(可自动转换的基本数据类型除外),否则编译出错;

由装箱引发的——Integer比较的来龙去脉

前置知识:众所周之,java是保留了int,char等基本数据类型的,也就是说int类型的并不是对象,然而有些方法却需要object类型的变量,所以java使用了装箱机制,我们可一自豪的这样声明一个整型变量:Integera=newInteger(10);那么整型的a也就是对象了,那这句是什么意思呢:Integera=10;java中可以这样声明一个对象吗当然不是,从jdk1.5后,java实现了自动装箱,也就是自动将Integera=10中的int类型的10转化为了Integer类型。好,有了前面的只是我们且先看一个题目:

Integera=127;

Integerb=127;

Integerc=128;

Integerd=128;

XXX.println(a==b);

XXX.println(c==d);

答案是什么呢如果您回答true,false,那么很遗憾的告诉你,哈哈,其实你答对了!!!

那我们晕了就相差1的两个数为啥走向了“反目成仇”的地步呢凭啥127等于127,我128就不等于128呢且听我慢慢道来,Integera=127,Integera=128。

127,128应该不会造成什么差异吧,难道是自动装箱的过程有猫腻找下源码看看:

privatestaticclassIntegerCache{

privateIntegerCache(){}

staticfinalIntegercache[]=newInteger[-(-128)+127+1];static{

for(inti=0;i

cache[i]=newInteger(i-128);

publicstaticIntegervalueOf(inti){

finalintoffset=128;

if(i>=-128i<=127){mustcache

rXXX];

returnnewInteger(i);

源码解释:当我们装箱是,jvm实际上是自动调用的valueOf()这个方法,也就是Integera=10相当于

XXX(10)Integer是静态类.好,我们看下Integera=127的执行过程,首先调用XXX(127),由于127在-128到127之间(看上面的源码),所以返回一个缓存值XXX];也就是数组中下标是255的值,那这个到底是什么值呢我们继续看:

static{

for(inti=0;i

cache[i]=newInteger(i-128);

这是用一个for循环对数组cache赋值,cache[255]=newInteger(255-128),也就是newl一个Integer(127),并把引用赋值给cache[255],好了,然后是Integerb=127,流程基本一样,最后又到了cache[255]=newInteger(255-128),这一句,那我们迷糊了,这不是又new了一个对象127吗,然后把引用赋值给cache[255],我们比较这两个引用(前面声明a的时候也有一个),由于是不同的地址,所以肯定不会相等,应该返回false啊!呵呵,这么想你就错了,请注意看for语句给cache[i]初始化的时候外面还一个{}呢,{}前面一个大大的static关键字大咧咧的杵在哪呢,对静态的,那么我们就可以回想下static有什么特性了,只能初始化一次,在对象间共享,也就是不同的对象共享同一个static数据,那么当我们Integerb=127的时候,并没有new出一个新对象

来,而是共享了a这个对象的引用,记住,他们共享了同一个引用!!!,那么我们进行比较a==b时,由于是同一个对象的引用(她们在堆中的地址相同),那当然返回true了!!!

然后我们在看Integerc=128;Integerd=128;这两句。现在不用我说就应该能明白了吧,当数据不再-128到127之间时,是不执行return

XXX];这句的,也就是不会返回一个static的引用,而是执行了returnnewInteger(i);于是当Integerd=128时,又会重新返回一个引用,两个不同的引用

在做c==d的比较时当然返回false了!!

下面附上本程序的字节码以供喜欢底层的读者参考:

Compiledfrom"XXX"

XXX.Object{

publicCompareInteger();

Code:

0:aload_0

1:invokespecial1;Methodjava/lang/Object."":()V4:return

publicstaticvoidmain(XXX.String[]);

Code:

0:bipush127

2:invokestatic2;Method

java/lang/XXX:(I)Ljava/lang/Int

eger;

5:astore_1

6:bipush127

8:invokestatic2;Method

java/lang/XXX:(I)Ljava/lang/Int

eger;

11:astore_2

12:sipush128

15:invokestatic2;Method

java/lang/XXX:(I)Ljava/lang/Int

eger;

18:astore_3

19:sipush128

22:invokestatic2;Method

java/lang/XXX:(I)Ljava/lang/Int

eger;

25:astore4

27:getstatic3;Field

java/lang/XXX:Ljava/io/PrintStream;

30:aload_1

31:aload_2

32:if_acmpne39

35:iconst_1

36:goto40

39:iconst_0

40:invokevirtual4;Methodjava/io/XXX:(Z)V43:getstatic3;Field

java/lang/XXX:Ljava/io/PrintStream;

46:aload_3

47:aload4

49:if_acmpne56

52:iconst_1

53:goto57

56:iconst_0

57:invokevirtual4;Methodjava/io/XXX:(Z)V60:return

评论:呵呵,这么想你就错了,请注意看for语句给cache[i]初始化的时候外面还一个{}呢,{}前面一个大大的static关键字大咧咧的杵在哪呢,对静态的,那么我们就可以回想下static有什么特性了,只能初始化一次,在对象间共享,也就是不同的对象共享同一个static数据,那么当我们Integerb=127的时候,并没有new出一个新对象来,而是共享了a这个对象的引用,记住,他们共享了同一个引用!!!

呵呵,博主我被你这句话小小的误导了一下,其实你这里说的原理没错,但是把位置说错了,这段代码只是初始化cache:

static{

for(inti=0;i

cache[i]=newInteger(i-128);

但真正让cache[i]为static变量的是这句代码:

staticfinalIntegercache[]=newInteger[-(-128)+127+1];

Copyright © 2019- nryq.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务