」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Java 中的原始型別與引用以及字串的不變性

Java 中的原始型別與引用以及字串的不變性

發佈於2024-11-03
瀏覽:984

在 Java 中,我们有两种类型的数据(或变量):基元和非基元(也称为引用)。

原始类型的文字值存储在堆栈、临时和短期存储内存中,由Java虚拟机(JVM)管理。 [在此处阅读有关内存类型的更多信息]

原始变量分为四组:

1。整数类型:用于存储整数(不含小数部分)。它们是:byte、short、int、long。长数在数字末尾带有字母“L”或“l”,用于区分。

2.浮点类型: :用于存储带小数部分的数字(实数)。它们是:浮动、双精度。浮点数在数字末尾带有字母“F”或“f”,用于区分。

3.字符类型: 用于存储单个字符(如字母、数字或符号):char。它们用单引号 '' 初始化,而不是双引号 ""。

4。布尔类型: 用于存储逻辑值(true或false):bool

参见下表,了解每种类型支持的值范围,以及它们的“默认”值:

Tipos primitivos vs referências em Java e a imutabilidade das Strings
在科学格式中,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 



在这个例子中,即使我们知道“2

内存地址

Java中的第二种数据类型称为引用。这些变量存储引用,即对象的内存地址,而不是像原始类型那样直接存储其值。此存储发生在堆内存中。

一般而言,引用类型是类、接口、枚举和对象。

这里是一个附录。我们在代码中广泛使用的 String 是一个类,而不是原始类型。请注意,即使名称也是大写的,这也是 Java 中类的命名约定。

String 甚至还有一些方法,例如 length(),它返回存储在其中的文本的大小,charAt(int index),它返回文本中字符的索引,或者 substring(int beginIndex, int endIndex),它返回一段字符串。

但是,如果您希望更轻松地操作原始数据,Java 也允许这样做。为此,它具有 Wrapper 类,该类已经附带了一系列用于处理基本类型的内置方法。

包装器基本上与原始变量具有相同的名称,但是第一个字母大写:

  • 字节到字节
  • 简称
  • 整数转int
  • 长到长
  • 浮动到浮动
  • 双对双
  • 字符到字符
  • 布尔值到布尔值
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   " é maior que "   num2);
        } else {
            System.out.println(num1   " é igual a "   num2);
        }
    }
}

在此示例代码中,int 包装器用于将字符串转换为数字 (Integer.parse),然后将其与另一个数字进行比较 (Integer.compare)。

然而,字符串具有其他类所没有的特殊性。它是不可变的。

让我们通过这个基本示例来反思一下:

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 引用都指向同一个对象,因此更改其中一个对象的状态会影响另一个对象。

版本聲明 本文轉載於:https://dev.to/anaccortez/tipos-primitivos-vs-referencias-em-java-e-a-imutabilidade-das-strings-2n0j?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3