찾다
Javajava지도 시간Java의 참조 유형 개념 분석

Java의 참조 유형 개념 분석

Mar 18, 2017 pm 01:56 PM
java참조 유형

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으로 문의하세요.
Java 개발의 어떤 측면이 플랫폼 의존적입니까?Java 개발의 어떤 측면이 플랫폼 의존적입니까?Apr 26, 2025 am 12:19 AM

javadevelopmentisnotentirelyplatform-IndectionentDuetoSeveralFactors.1) JVMVARIATIONSAFFERFFERFORMANDBEHAVIORACROSSDIFFERENTOS.2) nativelibrariesViajniintrictionPlatform-specificiss.3) filepathsandsystempropertiesdifferbetweenplatectry. 4)

다른 플랫폼에서 Java 코드를 실행할 때 성능 차이가 있습니까? 왜?다른 플랫폼에서 Java 코드를 실행할 때 성능 차이가 있습니까? 왜?Apr 26, 2025 am 12:15 AM

Java 코드는 다른 플랫폼에서 실행할 때 성능 차이가 있습니다. 1) JVM의 구현 및 최적화 전략은 OracleJDK 및 OpenJDK와 같이 다릅니다. 2) 메모리 관리 및 스레드 스케줄링과 같은 운영 체제의 특성도 성능에 영향을 미칩니다. 3) 적절한 JVM을 선택하여 JVM 매개 변수 및 코드 최적화를 조정하여 성능을 향상시킬 수 있습니다.

Java의 플랫폼 독립성의 몇 가지 한계는 무엇입니까?Java의 플랫폼 독립성의 몇 가지 한계는 무엇입니까?Apr 26, 2025 am 12:10 AM

Java'SplatformIndenceHASLIMITATIONSINTERFORMANTOWORHEAD, 버전 컴포팅 가능성, 도전 과제, 플랫폼-특이 적 식품, 및 JVMINSTALLATION/MAYMENDENT.ThesefacteThe "WriteOnce, Runanywhere"

플랫폼 독립성과 크로스 플랫폼 개발의 차이점을 설명하십시오.플랫폼 독립성과 크로스 플랫폼 개발의 차이점을 설명하십시오.Apr 26, 2025 am 12:08 AM

Platform IndependenCealLowsProgramStorunannyplatformwithoutModification, whileCross-PlatformDevelopmentRequiressomplatformspecificAdJustments.platformIndence, PreemplifiedByjava, enableStalExecutionButmayPromiseperformance.cross-platformd

JIT (Just-In-Time) 컴파일은 Java의 성능 및 플랫폼 독립에 어떤 영향을 미칩니 까?JIT (Just-In-Time) 컴파일은 Java의 성능 및 플랫폼 독립에 어떤 영향을 미칩니 까?Apr 26, 2025 am 12:02 AM

jitcompilationinjavaenhancesperformance는 platformindence.1) ItdynamicallyTransLatesByTecodeIntonativeMachinecodeatimeTime, 최적화 FREQUELTEREDCODE.2) TheJVMREMAINSPLATFORM- Independent, 허용 THEMEJAVAAPPLITIONTORUNONDIFFEREN을 허용합니다

Java가 크로스 플랫폼 데스크톱 응용 프로그램을 개발하기 위해 인기있는 선택 인 이유는 무엇입니까?Java가 크로스 플랫폼 데스크톱 응용 프로그램을 개발하기 위해 인기있는 선택 인 이유는 무엇입니까?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits "writeonce, runanywhere"철학

Java의 플랫폼 별 코드 작성 상황에 대해 토론하십시오.Java의 플랫폼 별 코드 작성 상황에 대해 토론하십시오.Apr 25, 2025 am 12:22 AM

Java에서 플랫폼 별 코드를 작성하는 이유에는 특정 운영 체제 기능에 대한 액세스, 특정 하드웨어와 상호 작용하고 성능 최적화가 포함됩니다. 1) JNA 또는 JNI를 사용하여 Windows 레지스트리에 액세스하십시오. 2) JNI를 통한 Linux 특이 적 하드웨어 드라이버와 상호 작용; 3) 금속을 사용하여 JNI를 통해 MacOS의 게임 성능을 최적화하십시오. 그럼에도 불구하고 플랫폼 별 코드를 작성하면 코드의 이식성에 영향을 미치고 복잡성을 높이며 잠재적으로 성능 오버 헤드 및 보안 위험을 초래할 수 있습니다.

플랫폼 독립성과 관련된 Java 개발의 미래 트렌드는 무엇입니까?플랫폼 독립성과 관련된 Java 개발의 미래 트렌드는 무엇입니까?Apr 25, 2025 am 12:12 AM

Java는 Cloud-Native Applications, Multi-Platform 배포 및 교차 운용성을 통해 플랫폼 독립성을 더욱 향상시킬 것입니다. 1) Cloud Native Applications는 Graalvm 및 Quarkus를 사용하여 시작 속도를 높입니다. 2) Java는 임베디드 장치, 모바일 장치 및 양자 컴퓨터로 확장됩니다. 3) Graalvm을 통해 Java는 Python 및 JavaScript와 같은 언어와 완벽하게 통합되어 언어 교차 수용 가능성을 향상시킵니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.