Java에는 기본 요소와 비원시 요소(참조라고도 함)라는 두 가지 유형의 데이터(또는 변수)가 있습니다.
기본 유형은 JVM(Java Virtual Machine)이 관리하는 임시 및 단기 저장 메모리인 스택에 리터럴 값이 저장되어 있습니다. [여기에서 메모리 유형에 대해 자세히 알아보세요.]
기본 변수는 네 가지 그룹으로 나뉩니다.
1. 정수 유형: 정수를 저장하는 데 사용됩니다(소수 부분 없음). 바이트, 짧은, int, 긴 것입니다. Long은 구별을 위해 숫자 끝에 "L" 또는 "l" 문자를 붙입니다.
2. 부동 소수점 유형:: 소수 부분(실수)이 포함된 숫자를 저장하는 데 사용됩니다. 그것들은 플로트(float), 더블(double)입니다. 플로트는 구별을 위해 숫자 끝에 "F" 또는 "f" 문자가 있습니다.
3. 문자 유형: 단일 문자(예: 문자, 숫자 또는 기호)를 저장하는 데 사용됩니다: char. 이중 "" 대신 작은따옴표 ''로 초기화됩니다.
4. 부울 유형: 논리값을 저장하는 데 사용됩니다(true 또는 false): bool
"기본값" 외에 각 유형이 갖는 값의 범위는 아래 표를 참조하세요.
과학적인 형식에서 E는 지수를 나타냅니다. 예를 들어 1.23E+10은 1.23 x 10^10
기본값이란 무엇인가요? 변수가 초기화되지 않은 경우 변수가 가정하는 값입니다. 그러나 이 값을 가정하려면 전역 또는 상수(최종)여야 합니다.
public final boolean isTrue;
이 코드 줄에서는 "isTrue" 변수가 초기화되지 않았지만 컴파일러는 부울 변수에 대해 기본값 "false"를 고려하므로 오류를 표시하지 않습니다.
여기서 중요한 경고: 변수의 범위가 로컬인 경우, 즉 함수 내에서 선언된 경우 프로그래머는 변수에 값을 할당해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
public void teste(){ int i = 2; int j; if (i < 10){ j = 5; } System.out.println(j); }
이 예에서는 "2 < 10"이 "true"를 반환한다는 것을 알고 있음에도 불구하고 프로세스 중에 번역한 코드를 절대 실행하지 않는 컴파일러는 조건이 true이고 기본 변수가 "j"는 항상 초기화됩니다. 이렇게 하면 코드를 실행하려고 할 때 "오류: 변수 j가 초기화되지 않았을 수 있습니다."라는 컴파일 오류가 나타납니다.
Java의 두 번째 데이터 유형은 참조입니다. 이러한 변수는 기본 유형에서 발생하는 것처럼 값을 직접 저장하는 대신 참조, 즉 객체의 메모리 주소를 저장합니다. 이 저장은 힙 메모리에서 발생합니다.
참조 유형은 일반적으로 클래스, 인터페이스, 열거형 및 객체입니다.
여기에 부록이 있습니다. 우리 코드에서 널리 사용하는 문자열은 기본 유형이 아닌 클래스입니다. Java의 클래스 명명 규칙과 마찬가지로 이름도 대문자로 표시됩니다.
String에는 저장된 텍스트의 크기를 반환하는 length(), 텍스트에 있는 문자의 인덱스를 반환하는 charAt(int index) 또는 substring(int startIndex, int)와 같은 메서드도 있습니다. endIndex), 문자열 조각을 반환합니다.
하지만 원시 데이터를 더 쉽게 조작하고 싶다면 Java도 이를 허용합니다. 이를 위해 기본 유형을 사용하는 일련의 내장 메서드가 이미 제공되는 Wrapper 클래스가 있습니다.
래퍼는 기본적으로 기본 변수와 이름이 동일하지만 첫 글자는 대문자로 표시됩니다.
public class WrapperExample { public static void main(String[] args) { String numeroStr = "123"; Integer num1 = Integer.parseInt(numeroStr); Integer num2 = 200; int resultadoComparacao = Integer.compare(num1, num2); if (resultadoComparacao < 0) { System.out.println(num1 + " é menor que " + num2); } else if (resultadoComparacao > 0) { System.out.println(num1 + " é maior que " + num2); } else { System.out.println(num1 + " é igual a " + num2); } } }
이 예제 코드에서는 int 래퍼를 사용하여 문자열을 숫자(Integer.parse)로 변환한 다음 이를 다른 숫자(Integer.compare)와 비교합니다.
그러나 String에는 다른 클래스에 없는 특수성이 있습니다. 그녀는 불변합니다.
다음 기본 예를 통해 생각해 보겠습니다.
public class Main { public static void main(String[] args) { String text1 = "Hello"; String text2 = text1; System.out.println(text1); //output: Hello System.out.println(text2); //output: Hello text1 = "Weird"; System.out.println(text1); //output: Weird System.out.println(text2); //output: Hello text2 = "World"; System.out.println(text1); //output: Weird System.out.println(text2); //output: World TestClass test1 = new TestClass("propertyValue"); TestClass test2 = test1; System.out.println(test1.getProperty()); //output: propertyValue System.out.println(test2.getProperty()); //output: propertyValue test2.setProperty("newValue"); System.out.println(test1.getProperty()); //output: newValue System.out.println(test2.getProperty()); //output: newValue } }
이 경우 문자열 "text2"가 "text1"을 가리키더라도 "text2"의 변경 사항은 "text1"의 변경 사항을 반영하지 않는다는 점에 유의하세요. 이제 "test1"을 가리키는 객체 "test2"의 속성이 변경되면 이 변경 사항이 "test1"에도 반영됩니다.
嘿,但是引用變數不是儲存記憶體位址,而不是文字值嗎?是的,他們存儲它。 Java 語言開發人員決定讓 String 變數保持不可變。這意味著,一旦定義, String 物件的值就不能被另一個物件間接更改。
因此,在範例中,我們不會更改 text1 先前引用的物件的值(因為 String 是不可變的)。相反,我們建立一個值為「Weird」的新 String 對象,並使 text1 指向這個新物件。 Text2 仍將指向原始的「Hello」對象,這就是它保留值「Hello」的原因。
簡而言之,為字串指派新值不會修改現有物件的值,它只是更改對新物件的參考。
自訂類別的對象,例如 TestClass,是可變的。 test1 和 test2 參考都指向同一個對象,因此更改其中一個對象的狀態會影響另一個對象。
위 내용은 기본 유형과 Java의 참조 및 문자열의 불변성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!