|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。java中的基本范例间接存储在栈中,复合范例接纳援用范例,把援用也存储在栈中,而对应的对象存储在
堆中。因而java中把内存分堆内存和栈内存,在函数中界说的一些基础范例或援用都分派栈内存。
堆内存用来寄存由new创立的对象和数组,或是static(类装载信息)。
在堆平分配的内存,由jvm的gc办理。
程序只能把持援用的保存期,对象的保存期是jvm把持的。
在java使用程序中,当对象的援用是传送办法一个参数时,传送的时该援用的一个正本,(按值传送)。而
非援用自己,挪用办法的对象援用和正本都是指向统一个对象。
对象是按援用传送的,java使用程序中有且唯一一种参数传送机制---值传送
按值传送的语义就是当将一个参数传送给一个函数时,函数承受的是原始值的一个正本。
按援用传送的语义就是当将一个参数传送给一个函数时,函数承受的是原始值的内存地点,而非一个正本。
publicclassTest{
publicstaticvoidmain(Stringargs[]){
StringBuffersb1=newStringBuffer("good");
StringBuffersb2=sb1;
sb2.append("afternoon");
System.out.println("sb1=="+sb1);
}
}
运转的了局:goodafternoon
对象的赋值操纵是传送对象的援用,sb1和sb2都指的是统一个对象,这里的实在也是传值,传的是指针的值。这里的
赋值是指针之间的赋值。
1.援用是一种数据范例,保留了对象在内存中的地点,这类范例即不是我们平常所说的复杂数据范例也不是类实例(对象);
2.分歧的援用大概指向统一个对象,换句话说,一个对象能够有多个援用,即该类范例的变量。
publicclassTest1{
publicvoidfun(Strings){
s="hehe";
}
publicstaticvoidmain(Stringargs[]){
Test1test=newTest1();
Stringstr="haha";
test.fun(str);
System.out.println("str=="+str);
}
}
publicclassTest2{
publicvoidfun(ArrayListal){
al.add("hehe");
al.add("haha");
}
publicstaticvoidmain(Stringargs[]){
Test2test=newTest2();
ArrayListal=newArrayList();
test.fun(al);
Iteratorit=al.iterator();
while(it.hasNext()){
System.out.println(""+(String)it.next());
}
}
}
publicclassTest3{
publicvoidfun(ArrayListal){
ArrayListalA=newArrayList();
alA.add("haha");
alA.add("hehe");
al=alA;
}
publicstaticvoidmain(Stringargs[]){
Test3test=newTest3();
ArrayListal=newArrayList();
test.fun(al);
System.out.println(""+al.size());
}
}
经由过程以上例子能够得出
1、假如参数是不成变对象,如原语范例(i.e.int)大概不成变的对象范例(i.e.BigInteger)
如许的参数是平安的,办法体内的任何举措都不会影响办法外的内容
2、关于可变对象的范例,如ArrayListv
对v挪用add()、remove()等办法会招致办法外的变量的变更
这时候大概会招致代码的不平安
可是假如在办法体内对该参数有从头赋值的操纵,如v=newArrayList()
如许v指向的地点已变更,以后对v的任何操纵也不会影响办法外的内容
其实产生见解的过程就是训练自己发现问题,分析问题的能力。根据以上的认识我想谈下传统的学习与通过视频独立学习的优缺点: |
|