??xml version="1.0" encoding="utf-8" standalone="yes"?>
1?/p>
QUESTION NO: 2
2,
Ҏ(gu)上面的程?1Q我们看看得到的l果应该是什么?br />
q道题涉?qing)的问题是对象与对象以用的问题Q这个问题大家很Ҏ(gu)h。这道题的答案是1234?br />
那么Ҏ(gu)问题1,你能否知道问?的答案呢,问题2的答案是2.
分析Q对对象引用的不是很熟?zhn)的h一定以为问?的答案应该不变也?,怎么??
q就是涉?qing)对象以及(qing)对象引用的问题?
一首先介绍一下对象的引用.
创徏对象
创徏一个对象,其实Q它包含?jin)四个动作。object a=new object();
1Q右边的“new object”Q是以objectcMؓ(f)模板Q在堆空间里创徏一个objectcd象(也简UCؓ(f)object对象Q?br />
2Q末()意味着Q在对象创徏后,立即调用objectcȝ构造函敎ͼ对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写QJava?x)给你补上一个默认的构造函数?br />
3Q左边的“object a”创徏?jin)一个objectcd用变量。所谓objectcd用,是以后可以用来指向object对象的对象引用?br />
4Q?#8220;=”操作W对象引用指向刚创建的那个object对象。我们可以把q条语句拆成两部分:(x)
object a;
a= new object();
效果是一L(fng)。这样写Q就比较清楚?jin),有两个实体?x)一是对象引用变量,一是对象本w?nbsp;
在堆I间里创建的实体Q与在数据段以及(qing)栈空间里创徏的实体不同。尽它们也是确实实存在的实体Q但是,我们看不见,也摸不着?br />
不仅如此Q我们仔l研I一下第二句Q找扑ֈ创徏的对象叫什么名字?有h_(d)它叫“object”。不对,“object”是类Q对象的创徏模板Q的名字。一个objectcd以据此创建出无数个对象,q些对象不可能全?#8220;object”?nbsp;
对象q名都没有,没法直接讉K它。我们只能通过对象引用来间接访问对象?nbsp;
Z(jin)形象地说明对象、引用及(qing)它们之间的关p,
Z(jin)说明q个关系,我在|上看到别h的比L好的我也引用一?
对象好比是一只很大的气球Q大到我们抓不住它。引用变量是一根Q可以用来系汽球?nbsp; 如果只执行了(jin)W一条语句,q没执行W二条,此时创徏的引用变量aq没指向M一个对象,它的值是null。引用变量可以指向某个对象,或者ؓ(f)null。它是一根Q一根还没有pMM一个汽球的l뀂执行了(jin)W二句后Q一只新汽球做出来了(jin)Qƈ被系在aq根l上。我们抓住这根Q就{于抓住?jin)那只汽球。再来一句:(x) object a1;又做了(jin)一根Q还没系上汽球。如果再加一句:(x) a1= a;pM?jin)。这里,发生?jin)复制行为。但是,要说明的是,对象本nq没有被复制Q被复制的只是对象引用。结果是Qa1也指向了(jin)a所指向的对象。两根Ѿpȝ是同一只汽球?nbsp; 如果用下句再创徏一个对象:(x)a1= new object();则引用变量a1Ҏ(gu)向第二个对象?nbsp; 从以上叙q再推演下去Q?br />
我们可以获得以下l论Q(1Q一个对象引用可以指?个或1个对象(一根子可以不pL球,也可以系一个汽球)(j)Q(2Q一个对象可以有N个引用指向它Q可以有N条子系住一个汽球)(j)?nbsp;
如果再来下面语句Q?nbsp; a= a1;按上面的推断Qa也指向了(jin)W二个对象。这个没问题。问题是W一个对象呢Q没有一条子系住它Q它飞了(jin)。多C里说Q它被Java的垃圑֛收机制回收了(jin)。这不确切。正地_(d)它已成ؓ(f)垃圾回收机制的处理对象。至于什么时候真正被回收Q那要看垃圾回收机制的心(j)情了(jin)?br />
?jin)解了(jin)上面的对象的引?我们应该熟?zhn)对象以?qing)对象的引用了(jin).我们回头再说W一?/p>
java内部提供?jin)几个?q些cd以不使用new关键字来初始?例如: string
上面问题1,可以Ҏ(gu)下面的方?br /> 1?br />
通过上面对对象应用的理解,q道原因了(jin).
“>>”q算W作带符L(fng)位移处理Q它作位Ud理时Q会(x)先将值向右移Qƈ在高位填0Q然后将位移后所I出的高位,全部Ҏ(gu)原来的最高位的|代表正负L(fng)位)(j)。也是说负的gUdQ仍然是负的|比如Q?
Q?0>>2 =-3
-10= 1111 1111 1111 1111 1111 1111 1111 0110
右移2位:(x)0011 1111 1111 1111 1111 1111 1111 1101
l果Q?111 1111 1111 1111 1111 1111 1111 1101 Q全部天上原本符号位的|(x)1Q?
bQ?#8220;>>>”q算W?
“>>>”q算W所作的是无W号的位Ud理,它不?x)将所处理的值的最高位视ؓ(f)正负W号Q所以作位移处理Ӟ?x)直接在I出的高位填?。当我们要作位移的原始值ƈ非代表数值时Q例如:(x)表示颜色囄的|最高位q正负P(j)Q可能就?x)需要用此U无W号的位UR比如:(x)
Q?0>>>2=1073741821
-10=1111 1111 1111 1111 1111 1111 1111 0110 (不管原来?#8220;W号”位的?一长串1)Q空上的全部直接?)
0011 1111 1111 1111 1111 1111 1111 1101=1037341821
cQ?#8220;<<”q算W?
“>>”q算W的所作的也是无符L(fng)位移处理Q同样地Q它不会(x)所处理的值的最高位视ؓ(f)正负W号Q它作位Ud理时Q会(x)直接左移q在低位填入0。所以第二高位以下的位若Ud?jin)最高位Q该值的正负可能?x)与原来的不同?
Q?147483647<<2=4
-2147483647=1000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0100=4
dQ?#8220;<<<”q算W?
恩,当然?jin),在java里不存在它?/p>
byte关键?
byte表示字节型,它的范围?-127~ 128之间 Q?/p>
byte a=129;q样定义Q超q了(jin) byte的范_(d)?x)不允许定义?/p>
但是?br /> byte a=(byte)3049;q种情况Q进行强制{换的。可以定?br /> a的gؓ(f)-23;
在用PreparedStatementq行模糊查询的时候废?jin)一番周折,以前一直都没有注意q个问题。一般情况下我们q行_查询Qsql语句cMQselect * from table where name =?Q然后调?nbsp;PreparedStatement的setString{方法给Q指定倹{那么模p查询的时候应该怎么写呢Q我首先试?jin)?x)select * from customer where name like ‘%?%’?br />
此时E序报错Q因为?被包含在?jin)单引号中,PreparedStatementq不视它Z个参数。后来上|查?jin)相关的一些资料,发现可以q样写select * from table where name like Q;但是在指定参数的时候把Q指定ؓ(f)”%”+name+”%”Qname是指定的查询条g。这样就O(jin)K?jin)?br />
一般情况下Q我L潜意识的认定?jin)?是取代所指定的参敎ͼ但是实际上我们可以对指定的参数进行了(jin)一定的包装之后再传l?Q比如这里我们在参数的前后都加了(jin)一?Q然后再传给Q?nbsp;
String expr = "select * from table where url like ?";
pstmt = con.prepareStatement(expr);
String a="a";
pstmt.setString(1, "%"+a+"%");//自动d单引?nbsp;Q包装后的参敎ͼ(j)
pstmt.execute();
System.out.println(pstmt.toString());//打印sql
//?x)默认生成sqlQ?select * from table where url like '%http%'