求张国荣 梅艳芳 胭脂扣经典电影百度云,胭脂扣和倩女幽魂的

1576人阅读
Java(19)
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。
如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
String和包装类是什么类型传递这个问题,可能很多人都没有去细想过,下面我就给点我自己的见解。
public class Test {
public static void test1(Integer num){
num = new Integer(5);
public static void test2(String str){
str.replace("1", "4");
public static void main(String[] args) {
Integer num = new Integer(1);
test1(num);
System.out.println(num.intValue());
String str = new String("123");
test2(str);
System.out.println(str);
上述程序很容易让人误以为String类型和包装类型是值传递。
其实我们认真想一下:
String类型和包装类型都是对象类型,所以必然是引用传递。
但是由于String类和包装类都没有提供value对应的setter方法,我们无法改变其内容,所以导致我们看起来好像是值传递。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25967次
排名:千里之外
原创:63篇
转载:12篇
(1)(1)(1)(3)(1)(2)(8)(13)(18)(10)(17)Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义 - GuangBlog - 博客园
随笔 - 20, 文章 - 7, 评论 - 0, 引用 - 0
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询& &&&& 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个String类型的空间,在运行时是 栈内存里的 s 指向堆内存里的那一块存储空间&&& 基本数据类类型存的是数值本身,而引用类型变量在内存放的是数据的引用,并不是数据的本身,引用类型变量是以间接方式去获取数据。&&& 引用类型变量都属于对象类型,如:数组、类、字符串等都属于引用类型变量。所以,引用类型变量里面存放的是数据的地址。&&& 说白了基本数据类型变量就像是直接放在柜子里的东西,而引用数据类型变量就是这个柜子对应编码的钥匙。钥匙号和柜子对应。二.java中引用类型的变量和对象的区别?对象:是按照&类&这个模板建立的,建立的位置则是内存例如A是一个类。A X则是创建一个引用变量,X=NEW A()则是在内存中建立一个对象(开辟了1片空间),对象的模板就是A(可以理解为在空间里复制了A类里的变量到空间里去)。此时就可以使用引用变量X去引用对象中的变量了三.值类型和引用类型的区别?[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法,[值类型]也就是基本数据类型 基本数据类型常被称为四类八种四类: &&1,整型 2,浮点型 3,字符型4,逻辑型八种:& &&&&&&&&& 1,整型3种 byte,short,int,long&&&&&&&& 2,浮点型2种 float,double&&&&&&&& 3,字符型1种 char&&&&&&&& 4,逻辑型1种 boolean[引用类型]除了四类八种基本类型外,所有的类型都称为引用类型(数组,类,接口,字符串)[值传递]&& &基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。[引用传递]引用类型之间赋值属于引用传递。引用传递传递的是对象的引用地址,也就是它的本身(自己最通俗的理解)。引用传递:传的是地址,就是将实参的地址传递给形参,形参改变了,实参当然被改变了,因为他们指向相同的地址。引用和我们的指针差不多,但是它不又不需要我们去具体的操作&[内存分配]一个具有值类型(value type)的数据存放在栈内的一个变量中。即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。值类型的数据具有较快的存取速度。一个具有引用类型(reference type)的数据并不驻留在栈中,而是存储于堆中。即是在堆中分配内存空间,不直接存储所包含的值,而是指向所要存储的值,其值代表的是所指向的地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度。Java中有垃圾回收机制,栈内存中的变量随着方法的结束内存自然销毁了,而用引用类型的时候,当方法结,束的时候,这个对象可能被另一个引用类型所应用,不会销毁,只有当一个对象posts - 12,&
comments - 27,&
trackbacks - 0
&&&&& 以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看。这个毛病得改,就从这一篇开始… &&&&& 最近准备面试,深感基础之重要,奈何我不是计算机科班出身,基础方面有些捉襟见肘。短期怎么补?做面实题呗。遇到哪儿没理解透,自己查资料,印象深刻。这个问题就是这么来的。原题很简单:“对于方法,参数传递分为值传递和____两种。”这还不简单,但我得拓展啊,得思考啊… &&&&& 以下1、2是我的意淫,但记录自己的一些错误想法并思考改正还是有益处的,希望不会对大家有误导。觉得麻烦的话可以直接看3。 1、什么是值传递和引用传递? &&&&& 我一开始的理解是,值类型根本没有引用啊,它能有引用传递?它的值传递和引用传递应该是一样的。至于引用类型,它的值传递应该是一个深拷贝,引用传递应该是一个浅拷贝。对于这一类比,最初还颇感得意。但查资料才知道,What a stupid idea!没办法,非科班出身,知识不成体系,有盲点,但我知道这不是借口,这不在大补嘛,补得跟小鸡子似的。 &&&&& 看了这篇,感性的知道了什么是值传递和引用传递。其实也不是压根不知道,长时间不用忘了,然后就出现了上面离奇的想法。 &&&&& 其实在整个思考完了以后我给值传递和引用传递下了个定义,在这里先搬出来:(欢迎大家批评指正) 值传递是传递栈中的值;引用传递是传递栈地址。 2、引用类型的值传递和引用传递可以类比成深拷贝和浅拷贝吗? &&&& 到此对于这个问题还是有疑问的,就写了个小Demo class Program
static void Main(string[] args)
Student xiaohong = new Student("小红", <span style="color: #);
BanZheng(ref xiaohong);
//BanJiaZheng(xiaohong);
Console.WriteLine(xiaohong.Name + "
" + xiaohong.Age);
Console.ReadKey();
static void BanZheng(ref Student student)
student.Name = "红姐";
student.Age = <span style="color: #;
static void BanJiaZheng(Student student)
student.Name = "红姐";
student.Age = <span style="color: #;
class Student
public Student(string name, int age)
public string Name { get; set; }
public int Age { get; set; }
&&&&& 解释一下:小红今年12,但她要工作,可能家庭困难吧。1、如果她有关系(有关系还家庭困难?解释不了),找到BanZheng方法,给她身份证改成“红姐”18,拿去Main方法输出验证,果然输出“红姐”18。呵呵。但按我理解,ref如果是浅拷贝的话,Age作为一个值类型属性应该是重新烤了一份,其值不应该回传给xiaohong啊,应该输出“红姐”12。看来有关系就是牛逼啊。2、如果她没关系,找了个办假证的BanJiaZheng,一验证还是“红姐”18,如果按我理解,值传递是深拷贝的话,student参数应该和xiaohong是两个完全不同的对象,应该输出“小红”12,看来这个认证机构(我的理解)有水。于是我再查资料…
3、引用类型的值传递和引用传递揭秘
&&&& 功夫不负有心人,找到这么一篇好文,其实看了它就能理解了,但我还是根据上面的Demo做些改进,加深理解。
class Program
static void Main(string[] args)
Student xiaohong = new Student("小红", <span style="color: #);
BanZheng(ref xiaohong);
//BanJiaZheng(xiaohong);
Console.WriteLine(xiaohong.Name + "
" + xiaohong.Age);
Console.ReadKey();
static void BanZheng(ref Student student)
//student.Name = "红姐";
//student.Age = 18;
student = new Student("红姐", <span style="color: #);
static void BanJiaZheng(Student student)
//student.Name = "红姐";
//student.Age = 18;
student = new Student("红姐", <span style="color: #);
class Student
public Student(string name, int age)
public string Name { get; set; }
public int Age { get; set; }
&&&&& 这一次办证方法改了,在方法体中student = new Student(…)。再到Main方法中验证一下,如果调用BanZheng方法,输出“红姐”18,如果调用BanJiaZheng方法,输出“小红”12。看来有关系到什么时候都很牛逼啊。
&&&&& 画两个图理解一下:
(1)如果是BanJiaZheng,即值传递的话:
变量xiaohong和student的栈中有相同的堆地址,都指向10000,即“小红”12,而在BanJiaZheng方法中student = new Student(…),开辟了10010堆,student的栈中的堆地址改为10010,而xiaohong的栈中堆地址还是10000。所以方法调用后xiaohong指向的对象没变,依然是“小红”12。
(2)如果是BanZheng,即引用传递的话:
变量xiaohong和student指向同一栈地址,在student = new Student(…)后,该栈001指向新的堆地址10010,而xiaohong也指向001栈。所以方法调用后xiaohong指向的对象变成了“红姐”18。
&&&&& 至此,我总结出:值传递是传递栈中的值;引用传递是传递栈地址。
&&&&& 这一次我是蛮认真的写的这篇博客,希望人气能好一点,不吝留言赐教的话就感激不尽了。
阅读(...) 评论()Java中的原生数据类型和引用类型的参数传递 - windywindy - ITeye技术网站
博客分类:
&&& 1 :如果参数是基本数据类型(四类八种:byte,short,int,long,double,float,double,boolean,char),
public class PrimitiveType {
  public void change(int a) {
  a = 3;
  public static void main(String[] args) {
  int a = 1;
  PrimitiveType test = new PrimitiveType();
  test.change(a);
  System.out.println(a); // 1 ,而不是3
change 方法在被调用的时候,在内存中也分配一个空间来存储,存的是传过来的值,即3 .
&&& 而当方法结束时,这块内存就等垃圾回收了,而在main 方法中,它打印的a 的值是在调用main
&&& 方法时分配的内存空间,他们俩之间没有任何关系,所以打印的还是1.
2 : 如果参数是引用数据类型(类,数组,接口),那么传的是也是变量的值,
&&& 例如: Point param =new Point();
&&& 那么传过去的是point 这个变量的值 ,而不是说Point 这个对象!
&&& 而point 这个变量的值,其实就是Point 对象在内存中的地址(也叫引用)!
&&& 例子:
public class ReferenceType {
  public void changePoint(Point point) {
  point.x = 5;
  point.y = 6;
  public void changeReference(Point point) {
  point =
  public void testPassByStirng(String param) {
  param = "newValue";
  public static void main(String[] args) {
  int a = 1;
  Point point = new Point(1, 2);
  ReferenceType test = new ReferenceType();
  test.changePoint(point);
  System.out.println(point.x); // 5 而不是 1
  System.out.println(point.y); // 6 而不是 2
  test.changeReference(point); // 调用这个后,下面是否会报空指针呢?
  int x = point.x; // 不会
  System.out.println("x 的值是 " + x );
  String param = "value";
  test.testPassByStirng(param);
  System.out.println(param); // 是value ,而不是 newValue
  class Point {
  public Point(int x, int y) {
  this.x =
  this.y =
在java 中,访问对象是通过指向对象的引用来操作的,而一个对象可以被多个引用所指向,
&&& 无论其中哪个引用对这个对象的内容进行修改,它都会影响到另外一个引用,虽然引用有多个,但
&&& 对象却只有一个!
&&& changePoint 方法被调用时,你把main 方法中的Point 对象的引用point 传给了changePoint的参数
&&& point,此时,这个point 引用也指向了main 方法中的Point 对象(new 出来的),而你在这个方法中,
&&& 用point 这个引用对Point 对象(new 出来的)的内容进行了修改(point.x = 5;point.y = 6;),
&&& 因为它们指向的是同一个Point 对象(new 出来的),所以,当方法执行完后,这个修改会反映到这
&&& 个对象上,而此时,你再打印出Point 对象的x,y 的值,都是被改变后的值! 即不再是1和2,而是5与6 .
&&& 小结:
&&& 在java 中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值 就是你赋给变量的那个值,而
&&& 对于引用数据类型,这个值是对象的引用,而不是这个对象本身。
二: 在java 中,通过方法的调用,只能改变对象的内容,而不能改变对象的引用。
&&& 如 上面的方法
public void changeReference(Point point) {
  point =
  }
&&& point = null ,这句话是把你在调用changeReference方法时,本来point 这个引用与你在main 方法中
&&& 的那个point 引用指向的是同一个对象,而当你调用point = null 时,它就不再指向原来的Point 对象
&&& 了,此时,它只是改变它自身的指向,并没有对main 方法中的point 引用进行修改,main 中的point 引用
&&& 还是指向main 中的Point 对象!所以,你在main 方法中调用 point.x; 是不会发生空指针异常的。
&&& 也就是说:在方法中,你把引用 所对应的对象的内容给改变了,它是会反应到对象上的
&&& ,这时,你再取对象的内容时,已经是你改变过了的!而无论你把传过去的引用如何
&&& 改(point = null),该引用永远指向它原来 的那个对象!
&&& 当String 做为参数传递的时候,是由于String对象本身
&&& 是不变对象所决定的! 上面的testPassByStirng 方法。
&&& String 类型,它是不变对象,但它符合二:
&&& 当它作参数传过去时,如果对引用操作如: paramString = "改变原来的值";
&&& 这个所做的是: "改变原来的值" 其实就是String类的一个匿名对象,所以,你这样是在
&&& 方法中,重新构造一个String 对象出来,然后这个对象的引用赋给paramString ,此时,
&&& 把paramString 这个引用 给改变了,但传过来的引用并没有被改变!
windywindy
浏览: 127395 次
来自: 广州
fatter 写道lz用的是什么数据库?我用的db2上报这样的 ...
lz用的是什么数据库?我用的db2上报这样的错误,前提是我没有 ...
最后一段“如果web.xml遇到了和这两个元素,那么它会忽略元 ...
非常感谢!}

我要回帖

更多关于 胭脂扣张国荣在线观看 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信