>  기사  >  Java  >  Java의 참조 유형 개념 분석

Java의 참조 유형 개념 분석

阿神
阿神원래의
2017-03-18 13:56:421474검색

1. 참조 유형이란
참조 유형은 원시 값이 아닌 객체를 가리키는 변수입니다.
Java에서는 기본 데이터 유형을 제외한 모든 유형이 참조 데이터 유형이며 정의한 클래스는 모두 참조 유형이며 기본 유형처럼 사용할 수 있습니다.
예시는 다음과 같습니다.

    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 프로그래밍 언어에서는 a로 선언됩니다. 클래스 유형 변수는 할당에 중요한 영향을 미치는 비원시 유형을 참조하므로 참조 유형으로 지정됩니다. 다음 코드:

    int x = 7;
    int y = x;
    String s = "Hello";
    String t = s;

두 개의 기본 유형 int와 두 개의 참조 유형 String 등 4개의 변수가 생성됩니다. x의 값은 7이고 이 값은 y에 복사됩니다. x와 y는 두 개의 독립 변수이며 둘 중 하나를 추가로 변경해도 다른 하나에는 영향을 미치지 않습니다. 변수 s와 t의 경우 "Hello"라는 텍스트를 포함하는 하나의 String 개체만 존재하며 s와 t는 모두 이 단일 개체를 참조합니다.

Java의 참조 유형 개념 분석

변수 t가 t="World"로 재정의되면 새 개체 World가 생성되고 t는 이 개체를 참조합니다.

Java의 참조 유형 개념 분석

3. 값 전달과 참조 전달의 차이점
 1) 값 전달
은 메서드가 호출될 때 전달된 매개변수가 값의 복사본으로 전달됨을 의미합니다. 예를 들면 다음과 같습니다.

public class TempTest {
    private void test1(int a) {
        // 做点事情
        a++;
    }
   
    public static void main(String args[]) {
        TempTest t = new TempTest();
        int a = 3;
         t.test1(a);//这里传递的参数a就是按值传递。
         System.out.printIn("main方法中的a===" + a);
      }
  }

값 전달의 중요한 특징: 전달되는 것은 값의 복사본이므로 전달 후에는 관련이 없습니다. 9행의 A와 2행의 a는 두 개의 변수입니다. 2행의 a 값이 변경되면 9행의 a 값은 변경되지 않으므로 인쇄된 결과는 3입니다.
메인 메소드의 a는 3
test1 메소드의 a는 4
9번째 줄의 a를 실제 매개변수, 2번째 줄의 a를 기본 매개변수라고 합니다. 데이터 유형 및 형식 매개변수 데이터의 변경은 실제 매개변수 데이터에 영향을 주지 않습니다.
2) 참조에 의한 전달
은 메소드가 호출될 때 전달된 매개변수가 참조에 의해 전달된다는 의미입니다. 실제로 전달되는 것은 참조의 주소, 즉 메모리입니다. 변수에 해당하는 공간입니다.
예시는 다음과 같습니다.

public class TempTest {
    private void test1(A a) {
        a.age = 20;
        System.out.printIn("test1方法中的age="+a.age);
    }
    public static void main(String args[]) {
        TempTest t = new TempTest();
        A a = new A();
        a.age = 10;
        t.test1(a);// 这里传递的参数a就是按引用传递
           System.out.printIn("main方法中的age="+a.age);
      }
  }
  classA {
      public int age = 0;
  }

실행 결과는 다음과 같습니다. age = test1 메소드의 20 Age = main 메소드의 20
참조 전달의 주요 기능:
What 전달된 값의 참조, 즉 전송 전후 모두 동일한 참조(즉, 동일한 메모리 공간)를 가리킵니다.
참조 전달 과정을 올바르게 이해하려면 메모리 할당 과정을 이해하는 방법을 배워야 합니다. 메모리 할당 다이어그램은 이 과정을 이해하는 데 도움이 될 수 있습니다.
위의 예를 사용하여 분석합니다.
(1) 실행을 시작하고 8행을 실행하고 A의 인스턴스를 생성합니다. 메모리 할당 다이어그램은 다음과 같습니다.
기본 메서드의 a

Java의 참조 유형 개념 분석

(2), 9행을 실행하고 A 인스턴스의 age 값을 수정합니다. 메모리 할당 다이어그램은 다음과 같습니다.
메인 메소드의 a

Java의 참조 유형 개념 분석

(3) 실행 라인 10은 main 메소드의 변수 a가 참조하는 메모리 공간 주소를 test1 메소드의 a 변수에 참조로 전달하는 것입니다. 참고: 이 두 a 변수는 완전히 다릅니다. 동일한 이름에 속지 마십시오. 그러나 동일한 A 인스턴스를 가리킵니다. 메모리 할당 다이어그램은 다음과 같습니다.

Java의 참조 유형 개념 분석



(4), 3행을 실행합니다. test1 메소드입니다. 변수 a는 할당을 위한 A 인스턴스의 수명을 가리킵니다. 완료 후 새 메모리 다이어그램은 다음과 같이 구성됩니다.

Java의 참조 유형 개념 분석

此时A实例的age值的变化是由test1方法引起的。
    (5)、运行第4行,根据此时的内存示意图,输出test1方法中的age=20
    (6)、运行第11行,根据此时的内存示意图,输出main方法中的age=20
    3)对上述例子的改变
    理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面的呢?
    方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:

public class TempTest {
    private void test1(A a) {
        a = new A();// 新加的一行
        a.age = 20;
        System.out.printIn("test1方法中的age="+a.age);
    }
    public static void main(String args[]) {
        TempTest t = new TempTest();
        A a = new A();
         a.age = 10;
        t.test1(a);// 这里传递的参数a就是按引用传递
           System.out.printIn("main方法中的age="+a.age);
      }
  }
  classA {
      public int age = 0;
  }

 运行结果为:test1方法中的age=20  main方法中的age=10
    实现了按引用传递的值传递前与传递后互不影响,还是使用内存示意图来理解一下:
    (1)、运行开始,运行第9行,创建了一个A实例,内存分配示意图如下:

Java의 참조 유형 개념 분석

(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:

Java의 참조 유형 개념 분석


(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

Java의 참조 유형 개념 분석

(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:

Java의 참조 유형 개념 분석

(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:

1Java의 참조 유형 개념 분석

注意:这个时候test1方法中的变量a的age被改变,而main方法中的a变量是没有改变的。
     (6)、运行第5行,根据此时的内存示意图,输出test1方法中的age=20
     (7)、运行第12行,根据此时的内存示意图,输出main方法中的age=10
    说明:
    (1)、“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
    (2)、在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java快车";

相关文章:

Java四种引用类型的具体介绍

详细比较Java中的基本类型变量和引用类型变量

JavaScript 基本数据类型和引用类型的区别详解

위 내용은 Java의 참조 유형 개념 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.