|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,net网页编程Beans等等,但是我认为如果java想超越.net网页编程,那么他首先要解决的就是IDE工具的整合。
1.栈(stack)与堆(heap)都是Java用来在Ram中寄存数据的中央。与C++分歧,Java主动办理栈和堆,程序员不克不及间接地设置栈或堆。
2.栈的上风是,存取速率比堆要快,仅次于间接位于CPU中的存放器。但弱点是,存在栈中的数据巨细与保存期必需是断定的,缺少天真性。别的,栈数据能够共享,详见第3点。堆的上风是能够静态地分派内存巨细,保存期也不用事前告知编译器,Java的渣滓搜集器会主动收走这些不再利用的数据。但弱点是,因为要在运转时静态分派内存,存取速率较慢。
3.Java中的数据范例有两种。
一种是基础范例(primitivetypes),共有8种,即int,short,long,byte,float,double,boolean,char(注重,并没有string的基础范例)。这类范例的界说是经由过程诸如inta=3;longb=255L;的情势来界说的,称为主动变量。值得注重的是,主动变量存的是字面值,不是类的实例,即不是类的援用,这里并没有类的存在。如inta=3;这里的a是一个指向int范例的援用,指向3这个字面值。这些字面值的数据,因为巨细可知,保存期可知(这些字面值流动界说在某个程序块内里,程序块加入后,字段值就消散了),出于寻求速率的缘故原由,就存在于栈中。
别的,栈有一个很主要的特别性,就是存在栈中的数据能够共享。假定我们同时界说:
inta=3;
intb=3;
编译器先处置inta=3;起首它会在栈中创立一个变量为a的援用,然后查找有无字面值为3的地点,没找到,就启示一个寄存3这个字面值的地点,然后将a指向3的地点。接着处置intb=3;在创立完b的援用变量后,因为在栈中已有3这个字面值,便将b间接指向3的地点。如许,就呈现了a与b同时均指向3的情形。
出格注重的是,这类字面值的援用与类对象的援用分歧。假定两个类对象的援用同时指向一个对象,假如一个对象援用变量修正了这个对象的外部形态,那末另外一个对象援用变量也马上反应出这个变更。相反,经由过程字面值的援用来修正其值,不会招致另外一个指向此字面值的援用的值也随着改动的情形。如上例,我们界说完a与b的值后,再令a=4;那末,b不会即是4,仍是即是3。在编译器外部,碰到a=4;时,它就会从头搜刮栈中是不是有4的字面值,假如没有,从头启示地点寄存4的值;假如已有了,则间接将a指向这个地点。因而a值的改动不会影响到b的值。
另外一种是包装类数据,如Integer,String,Double等将响应的基础数据范例包装起来的类。这些类数据全体存在于堆中,Java用new()语句来显现地告知编译器,在运转时才依据必要静态创立,因而对照天真,但弱点是要占用更多的工夫。4.String是一个特别的包装类数据。便可以用Stringstr=newString("abc");的情势来创立,也能够用Stringstr="abc";的情势来创立(作为对照,在JDK5.0之前,你从未见过Integeri=3;的表达式,由于类与字面值是不克不及通用的,除String。而在JDK5.0中,这类表达式是能够的!由于编译器在背景举行Integeri=newInteger(3)的转换)。前者是标准的类的创立历程,即在Java中,统统都是对象,而对象是类的实例,全体经由过程new()的情势来创立。Java中的有些类,如DateFormat类,能够经由过程该类的getInstance()办法来前往一个新创立的类,仿佛违背了此准绳。实在否则。该类使用了单例形式来前往类的实例,只不外这个实例是在该类外部经由过程new()来创立的,而getInstance()向内部埋没了此细节。那为何在Stringstr="abc";中,并没有经由过程new()来创立实例,是否是违背了上述准绳?实在没有。
5.关于Stringstr="abc"的外部事情。Java外部将此语句转化为以下几个步骤:
(1)先界说一个名为str的对String类的对象援用变量:Stringstr;
(2)在栈中查找有无寄存值为"abc"的地点,假如没有,则启示一个寄存字面值为"abc"的地点,接着创立一个新的String类的对象o,并将o的字符串值指向这个地点,并且在栈中这个地点中间记下这个援用的对象o。假如已有了值为"abc"的地点,则查找对象o,并前往o的地点。
(3)将str指向对象o的地点。
值得注重的是,一样平常String类中字符串值都是间接存值的。但像Stringstr="abc";这类场所下,其字符串值倒是保留了一个指向存在栈中数据的援用!
为了更好地申明这个成绩,我们能够经由过程以下的几个代码举行考证。
Stringstr1="abc";
Stringstr2="abc";
System.out.println(str1==str2);//true
注重,我们这里其实不用str1.equals(str2);的体例,由于这将对照两个字符串的值是不是相称。==号,依据JDK的申明,只要在两个援用都指向了统一个对象时才前往真值。而我们在这里要看的是,str1与str2是不是都指向了统一个对象。
了局申明,JVM创立了两个援用str1和str2,但只创立了一个对象,并且两个援用都指向了这个对象。
我们再来更进一步,将以上代码改成:
Stringstr1="abc";
Stringstr2="abc";
str1="bcd";
System.out.println(str1+","+str2);//bcd,abc
System.out.println(str1==str2);//false
<p>
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak, |
|