1、什么是引用类型
引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。
在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
示例如下:
public class MyDate {
private int day = 8;
private int month = 8;
private int year = 2008;
private MyDate(int day, int month, int year){...}
public void print(){...}
}
public class TestMyDate {
public static void main(String args[]) {
//这个today变量就是一个引用类型的变量
MyDate today = new MyDate(23, 7, 2008);
}
}
2、引用类型的赋值
在java编程语言中,用类的一个类型声明的变量被指定为引用类型,这是因为它正在引用一个非原始类型,这对赋值具有重要的意义。如下代码:
int x = 7;
int y = x;
String s = "Hello";
String t = s;
四个变量被创建:两个原始类型 int 和两个引用类型String。x的值是7,而这个值被复制到y;x和y是两个独立的变量且其中任何一个的进一步的变化都不对另外一个构成影响。至于变量s和t,只有一个String对象存在,它包含了文本"Hello",s和t均引用这个单一个对象。
如果将变量t重新定义为t="World";则新的对象World被创建,而t引用这个对象。
3、按值传递和按引用传递的区别
1)按值传递
指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:
1. public class TempTest {
2. private void test1(int a) {
3. // 做点事情
4. a++;
5. }
6.
7. public static void main(String args[]) {
8. TempTest t = new TempTest();
9. int a = 3;
10. t.test1(a);//这里传递的参数a就是按值传递。
11. System.out.printIn("main方法中的a===" + a);
12. }
13. }
按值传递的重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。第9行的a和第2行的a是两个变量,当改变第2行的a的值,第9行a的值是不变的,所以打印结果是3。
main 方法中的a 为 3
test1 方法中的a 为 4
我们把第9行的a称之为实参,第2行的a称之为形参;对于基本数据类型,形参数据的改变,不影响实参的数据。
2)按引用传递
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址。
示例如下:
1. public class TempTest {
2. private void test1(A a) {
3. a.age = 20;
4. System.out.printIn("test1方法中的age="+a.age);
5. }
6. public static void main(String args[]) {
7. TempTest t = new TempTest();
8. A a = new A();
9. a.age = 10;
10. t.test1(a);// 这里传递的参数a就是按引用传递
11. System.out.printIn("main方法中的age="+a.age);
12. }
13. }
14. classA {
15. public int age = 0;
16. }
运行结果如下:test1方法中的age = 20 main方法中的age = 20
按引用传递的重要特点:
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
用上面的例子来进行分析:
(1)、运行开始,运行第8行,创建了一个A的实例,内存分配示意图如下:
main方法中的a
(2)、运行第9行,修改了A实例里面的age的值,内存分配示意图如下:
main方法中的a
(3)、运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽,但它们指向了同一个A实例。内存分配示意图如下:
(4)、运行第3行,为test1方法中的变量a指向A实例的age进行赋值,完成后形成新的内存示意图如下:
此时A实例的age值的变化是由test1方法引起的。
(5)、运行第4行,根据此时的内存示意图,输出test1方法中的age=20
(6)、运行第11行,根据此时的内存示意图,输出main方法中的age=20
3)对上述例子的改变
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面的呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
1. public class TempTest {
2. private void test1(A a) {
3. a = new A();// 新加的一行
4. a.age = 20;
5. System.out.printIn("test1方法中的age="+a.age);
6. }
7. public static void main(String args[]) {
8. TempTest t = new TempTest();
9. A a = new A();
10. a.age = 10;
11. t.test1(a);// 这里传递的参数a就是按引用传递
12. System.out.printIn("main方法中的age="+a.age);
13. }
14. }
15. classA {
16. public int age = 0;
17. }
运行结果为:test1方法中的age=20 main方法中的age=10
实现了按引用传递的值传递前与传递后互不影响,还是使用内存示意图来理解一下:
(1)、运行开始,运行第9行,创建了一个A实例,内存分配示意图如下:
(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:
(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:
(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:
注意:这个时候test1方法中的变量a的age被改变,而main方法中的a变量是没有改变的。
(6)、运行第5行,根据此时的内存示意图,输出test1方法中的age=20
(7)、运行第12行,根据此时的内存示意图,输出main方法中的age=10
说明:
(1)、“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2)、在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java快车";
- 浏览: 19217 次
相关推荐
Java 中的基本类型和引用类型变量是两个不同的概念,它们在内存分配、变量赋值和函数传递等方面有着本质的区别。 基本类型是 Java 中的八种基本类型,包括 byte、short、int、long、float、double、char 和 boolean...
在Java编程语言中,引用类型变量实际上是对象的引用或指针,而非对象本身。当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1....
在Java编程语言中,引用类型是内存管理的一个重要概念,它允许程序员对对象的生命周期进行一定程度的控制。Java提供了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用(幻象引用),每种引用类型在内存管理...
在Java编程中,深入理解对象与引用的概念对于掌握面向对象编程至关重要。本文将从以下几个方面详细解析对象与引用的基本概念及其相互间的关系。 #### 一、对象与引用的基础概念 **对象**: 在Java中,对象是类的一...
Java教程中的核心知识点主要涉及Java的基本...以上就是Java教程中关于基本数据类型、引用类型、常用包以及其他关键概念的详细解析,这些知识构成了Java编程的基础。理解并掌握这些内容,将有助于深入学习和应用Java。
多态性是Java引用类型的一个关键特性,允许你用父类引用指向子类对象。这使得代码更加灵活,能够处理不同类型的对象。例如: ```java Animal animal = new Dog(); // 父类引用指向子类实例 animal.eat(); // 调用...
综上所述,类型转换是Java编程中非常重要的概念之一。理解不同类型的转换规则及其背后的原因对于编写高效、健壮的代码至关重要。在实际开发过程中,合理运用类型转换可以帮助解决许多复杂的问题。
以上知识点涵盖了Java引用类型的基础概念和高级特性。在实际开发中,理解并熟练运用这些知识可以编写出高效、安全的Java代码。如果想要深入学习,可以查阅这13页的PDF文档,它可能会提供更具体的应用示例和实战技巧...
通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...
虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其是对于对象类型的参数。下面我们将详细探讨这两种传递方式。 首先,对于Java的基本数据类型(如int、char、byte、...
Java中,基本类型的变量不是对象,它们直接存储在栈上,没有引用的概念,这与C++基本类型的处理方式相同,这是为了保持与C++的兼容性。 Python的引用和Java类似,都是对象级别的引用,但Python允许对常量创建引用,...
浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新对象中,但对于引用类型的成员变量,则只复制引用本身。这意味着原对象和新对象中的引用类型成员变量指向同一对象。例如: ```java ...
方法引用的概念是随着Java 8的发布引入的,它是函数式编程特性的一部分,旨在简化代码并提高可读性。本篇文章将深入探讨Java方法引用的各个方面。 首先,我们要理解什么是函数式接口。在Java中,函数式接口是指只有...
本文将深入探讨Java中的对象、引用以及它们之间的关系,并结合值传递的概念进行解析。 首先,我们需要理解什么是Java对象。在Java中,对象是类的实例。当我们使用`new`关键字创建一个类的实例时,就创建了一个对象...
在Java编程语言中,引用类型是理解内存管理的关键概念之一。强引用、弱引用、软引用和虚引用是四种不同的引用强度,它们在垃圾回收机制中扮演着不同的角色。了解这些引用类型对于优化内存使用、防止内存泄漏以及合理...
- 对于引用类型,子类对象可以自动转换为父类引用类型。 3. **自动类型转换示例**:例如,如果你有一个int类型的变量a,你可以将其赋值给long类型的变量b,Java会自动进行类型转换,无需额外代码。 ```java int a...
在Java编程语言中,理解和掌握引用...以上就是Java中关于引用、对象、属性等数据类型的基本知识,这些概念是编写高效、健壮的Java程序的基础。通过深入理解并熟练应用这些知识,开发者可以构建出复杂的系统和应用程序。
从给出的文件内容中提取知识点比较困难,因为内容看起来是随机抽取的字符,不过可以尝试从中提取一些关于Java语言的基础概念。 1. 关键字和修饰符:文档中出现了如public、private、static、final等关键字,这些都...
从JDK 1.2版本开始,Java引入了一种更为精细的引用类型管理机制,通过四种不同的引用类型:强引用、软引用、弱引用和虚引用,让开发者能够更加灵活地控制对象的生命周期。这种机制不仅提升了Java应用程序对内存使用...