Thinking in Java学习笔记(三)(zt)

转载 2004年08月26日 11:02:00
?
第三章?? 控制程序流程
???在java的世界中,对象和数据的处理是通过运算符,而选择和判断则是靠控制语句来实现的
???使用java运算符
?????运算符的2个用处,1、运算符接受引数,并且产生新值,例如 int a=1+1;2、运算符也可以改变操作数的值 例如 i++;
?????大多数的运算符都是可以作用与基本数据类型之上的,但是=、==、!=是例外,他们可以作用于任何对象之上。
?????优先顺序
???????这个其实我自己也很头疼的!所以我向来不记什么运算符的优先顺序,在搞不清楚的地方就加上括号,这样不但你自己看起来很明了,出错率也低,别人来看你的代码也是能清楚明白的
?????赋值和指派
???????赋值的意义是取得运算符右边的值(任何常量、变量、能产生数值的表达式),并将该值传递给左边,使用运算符=号因为基本数据类型存储的是实际的数值,并非句柄(也可以理解我c++中的指针),a=b;这句是把b这个具体数值传递给a这个变量,当你改变a的时候,b这个数值并不会随着你的a的改变而改变,但是当你操作对象的时候就容易出现和上述现象相反的事情。当你在操作对象的时候,实际上操作的是对象的句柄,当你把某个对象指派给另一个对象时,
???????实际指派的是句柄,例如
?????????class one
?????????{
??????????int i=0;
?????????}
?????????class two
?????????{
???????????public static void main(String args[])
???????????{
?????????????one o1=new one();
?????????????one o2=new one();
?????????????o1.i=10;
?????????????o2.i=20;
?????????????System.out.print("o2.i="+o1.i);
?????????????System.out.println("o2.i="+o2.i);
?????????????o1=o2;
?????????????System.out.print("o2.i="+o1.i);
?????????????System.out.println("o2.i="+o2.i);
?????????????o1.i=30;
?????????????System.out.print("o2.i="+o1.i);
?????????????System.out.println("o2.i="+o2.i);
???????????}
?????????}
???????class one在two中被创建2个对象,并且分别回被赋值为10 和20。输出当然就是10和20,接着把o2指派给o1,输出肯定是20 和20,但是奇妙的事情在第3次赋值的时候产生了,当我们把o1.i的值改为30的时候,发现为什么我们的o2.i也变成30了?我们并没有改变他的值啊!这是因为o1和o2中都含有同一个句柄,原先的o1所存储的句柄被覆写了,地址指到了和o2一样的内存空间,而他原先的指向的那个内存空间在适当的时候回被垃圾回收机制给回收了,其实这个过程就发生在我们以为不会有问题的第2次赋值中!以上的现象就叫做别名现象,这个在Thinking in Java的附录a中有专题讲到!如果我们不想发生这样的事情,我们可以使用o1.i=o2.i这句话来进行第2步,这样的写法可以保证2个对象的相互独立,但是这个并不是一个好方法,这样直接操作对象内的数据会导致混乱,并且和oop的思想相违背,更好的方法在附录a中有。
调用函数时的别名问题
???????????class one
???????????{
????????????int i=10;
???????????}
???????????class two
???????????{
????????????static? void hello(one o)
????????????{
?????????????o.i=20;
????????????}
????????????public static void main(String args[])
????????????{
?????????????one someone=new one();
?????????????System.out.println(someone.i);
?????????????hello(someone);
?????????????System.out.println(someone.i);
????????????}
???????????}

???????????我们的java程序会在hello()函数的生存空间之内为我们创建一个名字叫个o的one的实例对象,用于接受外界传递进来的引数,但是我们使用上面的方法,传递进去的其实也只是一个someone的句柄,而hello()之内的那个名字叫个o的对象的i的更改也会影响到超出hello生存空间之外的someone中的i,真是郁闷啊!
???????数学运算符
?????????这里我们要注意一个问题就是整数的除法运算所得结果会把小数部分忽略,注意不是四舍五入!什么是简略运算符?简略运算符是在运算符之后紧跟一个=号,这个方法使用于java中的所有运算符,,例如 把x+10的值从新赋值给x,你就可以用x+=10这种简略形式。具体的数学运算符的例子我就不给大家举了,因为这个很简单,和我们小学学习的数学运算没有什么差别
?????????一元运算符
???????????负号(-)和正号(+)都是一元运算符
???????递增和递减
?????????递增(++)和递减(--)他们都有2中形式,一个是前缀(++i),一个是后缀(i++)需要注意的是,这2个方法是有差别的,在使用前缀的时候,是先进行前缀的运算,然后把值传递给i,然后i再参与后面的运算,而使用后缀时候,是先把i参与运算,再将i 进行后缀的运算,例如
?????????public class test
?????????{
??????????public static void main(String args[])
??????????{
???????????int i=0;
???????????System.out.println(++i);
???????????System.out.println(i++);
???????????System.out.println(i);
??????????}
?????????}
?????????答案是1、1、2 先进行自加,然后把值显示(1)第二次显示是先把i的值显示(1),在自加(2),但是自加的没显示因为自加的值参加下次的运算,也就是第三次显示2的原因。
???????关系运算符
?????????注意,我在我的blog中已经写了一篇关于运算符的文章(http://blog.csdn.com/maoerzuozuo)里面有关于运算符
?????????经常出错的地方和解答,如果你能全部的答对,那么你在数学运算符这一块基本上没问题了!

《Thinking in Java》读书笔记(不断更新中)

概述春节在家乡,家里的电脑都是我上大学时淘汰的,要么运行不起来AS,要么连接不上手机,要么编译不了程序,这Android是写不了了。 记得前几天写插件的时候,用过Intellij IDEA,感觉很流...
  • zxt0601
  • zxt0601
  • 2017年01月31日 11:29
  • 979

《Thinking in Java》读后总结与感想

作为Java界的四大名著之一《Thinking in Java》一直备受推崇,我很早就知道了这本书,当时只是初涉Java,粗略的翻了翻之后觉得看起来这本书讲的比较深就没有再去碰它,后来Java基础学完...
  • qq_28899635
  • qq_28899635
  • 2017年01月16日 09:47
  • 501

Thinking In Java笔记(第八章 多态)

第八章 多态    在面向对象的程序设计语言中,多态是继抽象和技能之后的第三种基本特征。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。     多态的作用是用来消除类型之间的耦合关系...
  • Jing_Unique_Da
  • Jing_Unique_Da
  • 2015年06月10日 10:19
  • 1488

Thinking in Java 源码的获取以及编译问题

《Java编程思想》的源代码的获取、编译过程,以及编译中碰到的错误。还有Ant程序的获取和配置。...
  • pdcxs007
  • pdcxs007
  • 2014年01月09日 10:05
  • 3221

Thinking in Java:容器深入研究

1.虚线框表示Abstract类,图中大量的类的名字都是以Abstract开头的,它们只是部分实现了特定接口的工具,因此创建时可以选择从Abstract继承。Collections中的实用方法:挑几个...
  • zhangqix
  • zhangqix
  • 2016年04月01日 19:48
  • 753

第21章 并发 ——《Thinking in Java》学习笔记

说道并发,就有种异常高大上的感觉,好像比那些顺序编程有种不可明辨的优越感一样,是的,并发的确更深奥,而且现在全世界都离不开并发程序。 但是什么是并发?并发能做什么?并发如何实现? --------...
  • u010635780
  • u010635780
  • 2014年08月12日 19:40
  • 760

Thinking in java学习笔记-并发(一)

一、线程和进程 进程:进程是运行在它自己的地址空间内的自包容的程序 线程:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行...
  • linsawako
  • linsawako
  • 2016年11月20日 18:30
  • 491

【ThinkingInJava】33、动态代理机制

/** * 书本:《Thinking In Java》 * 功能:动态代理机制 * 文件:SimpleProxyDemo.java * 时间:2015年4月15日21:41:39 * 作者:cutte...
  • cutter_point
  • cutter_point
  • 2015年05月17日 08:42
  • 651

thinking in java 14章 类型信息 学习笔记

1.我们需要类型信息有什么用? 类型转换时检查是否可行,在java中所有的类型转换都是在运行时进行正确性检查的。这里就必须用到类型信息。在继承体系中有时候需要知道基类对象引用所指向的对象的具...
  • u014584354
  • u014584354
  • 2014年05月16日 16:20
  • 483

《Thinking in Java 》学习笔记 --- Java内存分配,对象存放到什么地方?怎么放?

有6个地方可以存储数据: 1.寄存器(register)。最快的存储区域,存在于CPU当中。数量有限由编译器统一进行分配,不能直接控制,对于Java程序员来说,寄存器是“透明”的。 2.堆栈(stac...
  • long254229962
  • long254229962
  • 2013年09月17日 23:12
  • 549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Thinking in Java学习笔记(三)(zt)
举报原因:
原因补充:

(最多只允许输入30个字)