专业的JAVA编程教程与资源

网站首页 > java教程 正文

java程序员必备的基础知识_java面向对象 值传递和所谓的引用传递

temp10 2024-11-11 13:51:19 java教程 12 ℃ 0 评论

本质上java只有值传递,所有的传递都是一次值的拷贝。引用类型拷贝的是引用地址,基础数据类型拷贝的是值,不会传入实例对象本身。

我们先用一个例子热热身,你觉得最后的结果是什么呢?

java程序员必备的基础知识_java面向对象 值传递和所谓的引用传递

public class Dog {
        private String name;
        public Dog(String name) {
        				this.name = name;
        }
        public static void changeDog(Dog dog){
        				dog = new Dog("jerry");
        }
        public static void main(String[] args) {
                Dog dog = new Dog("tom");
                changeDog(dog);
                System.out.println(dog);
        }
        public String getName() {
        				return name;
        }
        public void setName(String name) {
        				this.name = name;
        }
        @Override
        public String toString() {
        				return "Dog{" + "name='" + name + '\'' + '}';
        }
}


我们用下边三个例子,给大家详细的介绍一下我们遇到的各种值传递的问题:

1、对于基础数据类型,调用changeInt(i),这个过程不是把【i】传入这个方法,而是将i的值也就是【5】拷贝一份,赋值给形参【j】,所以形参无论怎么操作,不会影响【i】

changeInt(int j){
				j = 8;
}
int i = 5;
changeInt(i);
System.out.println(i);
//结果:5

2、对于引用数据类型,调用changeInt(dog)方法,也不是将【dog】传入方法,而是将dog的引用地址值(0x123FE222)拷贝一份赋值给形参【d】,名字一样不一样都无所谓,当d = new Dog("tom"); 执行时,形参会开辟新空间,指向新对象,外部的【dog】不受影响。

changeInt(Dog d){
				d = new Dog("tom");
}
Dog dog = new Dog("jerry");
changeInt(dog);
System.out.println(dog.getName());
//结果:jerry

3、下边这种情况是另外一种情况,调用changeInt(dog)方法,当然也不是将【dog】传入方法,而是将dog的引用地址值(0x123FE222)拷贝一份赋值给形参【d】,此时无论是【形参d】还是外部【引用dog】都指向同一个地址的实例对象,内部使用d.setName("tom"); 修改实例对象当然会印象dog所指向的实例,因为是同一个嘛。

changeInt(Dog d){
				d.setName("tom");
}

Dog dog = new Dog("jerry");
changeInt(dog);
System.out.println(dog.getName());
//结果:tom

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表