在 Java 中,我们有两种类型的数据(或变量):基元和非基元(也称为引用)。
原始类型的文字值存储在堆栈、临时和短期存储内存中,由Java虚拟机(JVM)管理。 [在此处阅读有关内存类型的更多信息]
原始变量分为四组:
1。整数类型:用于存储整数(不含小数部分)。它们是:byte、short、int、long。长数在数字末尾带有字母“L”或“l”,用于区分。
2.浮点类型: :用于存储带小数部分的数字(实数)。它们是:浮动、双精度。浮点数在数字末尾带有字母“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在这个例子中,即使我们知道“2
内存地址
Java中的第二种数据类型称为引用。这些变量存储引用,即对象的内存地址,而不是像原始类型那样直接存储其值。此存储发生在堆内存中。
一般而言,引用类型是类、接口、枚举和对象。
这里是一个附录。我们在代码中广泛使用的 String 是一个类,而不是原始类型。请注意,即使名称也是大写的,这也是 Java 中类的命名约定。
String 甚至还有一些方法,例如 length(),它返回存储在其中的文本的大小,charAt(int index),它返回文本中字符的索引,或者 substring(int beginIndex, 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 " é 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 引用都指向同一个对象,因此更改其中一个对象的状态会影响另一个对象。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3