坚持原创 绝不注水爆肝万字长文Java 语言的基本特性(喂饭式教程)

Posted 益达学长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坚持原创 绝不注水爆肝万字长文Java 语言的基本特性(喂饭式教程)相关的知识,希望对你有一定的参考价值。

如何在 Java 程序中使用标识符、类型、文字和变量

Java 是一种面向对象的编程语言,但 Java 不仅仅是使用对象进行编程。本教程是介绍 Java 语言基础的非面向对象特性和语法的几个教程中的第一个。您将学习如何在 Java 程序中使用注释、标识符、类型、文字和变量。您还将了解为什么以及如何记录您的代码,并且您将看到 Java 对 Unicode 的支持如何影响源代码和编译。

Java 12 中的模块和 var

请注意,本教程中的示例已针对 Java 12 进行了更新,包括 Java 模块功能 ( module-info.java) 及其 10 个受限关键字。我还将向您展示如何使用var声明局部变量

记录 Java 代码的三种方法

假设您在一家大公司的 IT 部门工作。你的老板让你写一个由几千行源代码组成的程序。几周后,您完成程序并部署它。几个月后,用户开始注意到程序偶尔会崩溃。他们向你的老板抱怨,他命令你修理它。问题是,自从创建这个项目以来,您已经在其他项目上工作过,并且您不记得为什么您以这种方式编写代码。

这是一个常见的场景,而且压力很大。您可以通过用有意义的描述记录源代码来避免这种压力。尽管经常被忽视,但记录代码是软件开发中最重要的任务之一。编写文档齐全的代码是专业精神的标志,它将为您和其他开发人员节省大量时间。

在 Java 中,您可以使用注释功能在源代码中嵌入文档。注释是对人类有意义但对编译器没有意义的分隔文本块。当您编译源代码时,Java 编译器会忽略所有注释并且不会为它们生成字节码。Java 支持单行、多行和 Javadoc 注释。

单行注释

一个单行注释跨越一行。它从//当前行的末尾开始并继续。编译器会忽略从//该行末尾开始的所有字符。以下示例显示了单行注释:

System.out.println((98.6 - 32) * 5 / 9); // Output Celsius equivalent of 98.6 degrees Fahrenheit.

单行注释对于指定给定代码行背后意图的简短、有意义的描述很有用。

从 Java 9 开始,您可以jshell尝试使用单行和其他类型的注释。下面是一个例子:

jshell> // single-line comment

jshell>

关于 jshell

Java Shell ( jshell) 是在 Java SE 9 中引入的,作为 Java 编译器 ( javac) 和 Java 应用程序启动器 ( java)的替代品。我们将在本系列中使用它来尝试新的 Java 语言特性

多行注释

一个多行注释跨越多行。它以 开始/并以 结束/。编译器忽略从/到的所有字符/。以下示例显示了多行注释:

/*
   An amount of $2,200.00 is deposited in a bank paying an annual
   interest rate of 2%, which is compounded quarterly. What is
   the balance after 10 years?

   Compound Interest Formula:

   A = P(1+r/n)nt

   A = amount of money accumulated after n years, including interest

   P = principal amount (the initial amount you deposit)

   r = annual rate of interest (expressed as a decimal fraction)

   n = number of times the interest is compounded per year

   t = number of years for which the principal has been deposited
*/

double principal = 2200;
double rate = 2 / 100.0;
double t = 10;
double n = 4;
System.out.println(principal * Math.pow(1 + rate / n, n * t));

如您所见,多行注释对于记录多行代码很有用。或者,您可以为此使用多个单行注释:

// Create a ColorVSTextComponent object that represents a component
// capable of displaying lines of text in different colors and which
// provides a vertical scrolling capability. The width and height of
// the displayed component are set to 180 pixels and 100 pixels,
// respectively.

ColorVSTextComponent cvstc = new ColorVSTextComponent(180, 100);

您还可以使用多行注释来注释掉不想编译但仍希望保留以备将来使用的代码块:

/*
      if (!version.startsWith("1.3") && !version.startsWith("1.4"))
      {
         System.out.println("JRE " + version + " not supported.");
         return;
      }
*/

如果嵌套多行注释,编译器将报告错误。例如,编译器在遇到/* This /* nested multiline comment (on a single line) */ is illegal */. 不要嵌套多行注释。

jshell 多行注释

在 .csv 文件中输入多行(或 Javadoc)注释时,您会注意到一些有趣的事情jshell。…>每次在注释尚未完成时按Enter 键,此工具都会显示继续提示:

jshell> /*
   ...> Multiline comment
   ...> */

jshell>

Javadoc 注释

一个Javadoc注释是一种特殊的多行注释。它以 开始/*并以 结束/。编译器忽略从/*到的所有字符/。以下示例显示了 Javadoc 注释:

/**
 *  Application entry point
 *
 *  @param args array of command-line arguments passed to this method
 */
public static void main(String[] args)
{
   // TODO code application logic here
}

此示例的 Javadoc 注释描述了该main()方法。夹在/*和之间的/是方法的描述和@param Javadoc 标记(工具的 -@前缀指令javadoc)。

考虑这些常用的 Javadoc 标签:

  • @author 标识源代码的作者。
  • @deprecated 标识不应再使用的源代码实体(例如,方法)。
  • @param 标识方法的参数之一。
  • @see 提供另见参考。
  • @since 标识实体首次起源的软件版本。
  • @return 标识方法返回的值的种类。
  • @throws 记录从方法抛出的异常。

尽管编译器会忽略它们,但 Javadoc 注释由 处理javadoc,将它们编译为基于 html 的文档。例如,以下命令为假设的Checkers类生成文档:

javadoc Checkers

生成的文档包括一个index.html描述文档起始页的索引文件 ( )。例如,图 1 显示了来自 Java SE 12 运行时库 API 文档的起始页。

图 1. Java SE 12 运行时库 API 文档由 javadoc 生成

Java 中的 Unicode

Unicode是一种计算行业标准,用于对世界上大多数书写系统中表达的文本进行一致的编码、表示和处理。Unicode 使用字符编码对字符进行编码以进行存储。两种常用的编码是UTF-8和UTF-16。您将在本教程中看到 Java 对 Unicode 的支持如何影响您的源代码和编译。

标识符:在 Java 代码中命名类、方法等

在任何编程语言中,开发人员必须能够命名实体以便在代码中引用它们。为此,Java 提供了标识符功能。标识符只是源代码实体的名称。

标识符由字母(AZ、az 或任何字母表中的等效大写/小写字母)组成;数字(0-9 或任何数字系统中的等效数字);标点符号(例如下划线);和货币符号(例如美元符号)。标识符名称必须以字母、货币符号或标点符号开头。此外,它不能从一行换到下一行。

以下是一些有效标识符的示例:

  • i
  • count2
  • loanAmount$
  • last_name
  • $balance
  • π (希腊字母 Pi – 3.14159)

许多字符序列不是有效的标识符。考虑以下示例:

  • 5points,因为它以数字开头
  • your@email_address,因为它包含一个@符号
  • last name,因为它包含一个空格

Java 中的大小写问题

Java 是一种区分大小写的语言,这意味着大小写不同的标识符被视为单独的标识符。例如,age和Age是单独的标识符。

保留字

几乎可以选择任何有效标识符来命名类、方法或其他源代码实体。但是,Java 为特殊目的保留了一些标识符;这些被称为保留字。Java 保留以下标识符:

当编译器检测到这些保留字中的任何一个在其使用上下文之外使用时,它会输出一条错误消息;例如,作为类或方法的名称。Java 也保留但不使用const和goto。

关键字与文字

Java 的大部分保留字也称为关键字。三个例外是false、null和true,它们是文字的示例。您很快就会了解更多关于文字的知识。

Java 9 和 Java 10 中的保留字更改

每次 Java 更新都会对该语言进行更改和改进。最近的更新包括对 Java 保留字的更改。

从 Java SE 9 开始,下划线 ( _) 被保留并被视为关键字。使用单个下划线来命名任何东西都是错误的。(可以使用多个下划线命名,但您可能不应该这样做。)

Java SE 9 还引入了modules以及 10 个受限关键字:

  • open
  • module
  • requires
  • transitive
  • exports
  • opens
  • to
  • uses
  • provides
  • with

Java 编译器仅将这些标识符视为module-info.java文件上下文中的关键字。在此文件之外,它们是可用于命名任意项目的普通标识符。(您将在本系列的后面了解有关模块的更多信息。)

Java SE 10var作为局部变量声明和 lambda 形式参数的类型引入。编译器将其var视为具有特殊含义的标识符,但不被视为保留字。你不能var用来命名一个类,但你可以用它来命名一个方法(尽管你可能不应该这样做)。我们稍后再谈var。

类型:对 Java 代码中的值进行分类

Java 应用程序处理字符、整数、浮点数、字符串和其他类型的值。所有同类价值观都具有某些特征。例如,整数没有分数,而字符串是具有长度概念的字符序列。

Java 提供了用于对值进行分类的类型功能。类型是一组值,它们在内存中的表示,以及一组操作这些值的操作,通常将它们转换为其他值。例如,整数类型描述了一组没有小数部分的数字、二进制补码表示(我将很快解释二进制补码)以及产生新整数的加法和减法等运算。

Java 是一种强类型语言

在像 Java 这样的强类型语言中,每个变量、表达式等都有一个编译器已知的类型。此功能可帮助编译器在编译时检测与类型相关的错误,而不是在运行时出现这些错误,因为在运行时很难找到源点。(您将在本教程后面了解有关变量的更多信息,本系列的下一个教程将介绍表达式。)

Java 支持原始类型、引用类型和数组类型。

原始类型

甲基本类型是可以被该语言,并且其值不对象定义的类型。Java 支持一些原始类型:

  • 布尔值
  • 特点
  • 字节整数
  • 短整数
  • 整数
  • 长整数
  • 浮点
  • 双精度浮点数

您将在 Java 程序中频繁使用原始类型,因此让我们花一点时间来考虑它们中的每一个。

原语的问题

一些开发人员希望 Java 不支持原始类型,而另一些开发人员则认为原始类型具有独特的特殊用途。了解更多关于原始类型以及在 Java 语言中保留原始类型的案例。

布尔值

在布尔类型描述了真/假值。的JVM规范表示存储在一个阵列(后面讨论)的布尔值被表示为8位(二进制数字)的整数存储器中的值。此外,当它们出现在表达式中时,这些值表示为 32 位整数。Java 提供 AND、OR 和 NOT 操作来处理布尔值。此外,它的boolean保留字标识源代码中的布尔类型。

请注意,JVM 对布尔值的支持很少。Java 编译器将它们转换为 32 位值,其中 1 表示真,0 表示假。

特点

所述字符类型描述字符的值(例如,大写字母A时,位7,星号[*]符号)在它们的分配的Unicode数量而言。(例如,65 是大写字母 A 的 Unicode 编号。)字符值在内存中表示为 16 位无符号整数值。对字符执行的操作包括分类,例如对给定字符是否为数字进行分类。

将 Unicode 标准从 16 位扩展到 32 位(以适应更多的书写系统,例如埃及象形文字)使字符类型有些复杂。现在介绍基本多语言平面 (BMP) 代码点,包括代理代码点或 UTF-16 编码的代码单元。如果您想了解 BMP、代码点和代码单元,请研究Character该类的Java API 文档。但是,在大多数情况下,您可以简单地将字符类型视为容纳字符值。

整数类型

由于空间和精度原因,Java 支持四种整数类型:字节整数、短整数、整数和长整数。基于较短整数的数组不会占用太多空间。涉及更长整数的计算可为您提供更高的精度。与无符号字符类型不同,整数类型是有符号的。

字节的整数类型描述了在8个比特表示的整数; 它可以容纳从 -128 到 127 的整数值。与其他整数类型一样,字节整数存储为二进制补码值。在二进制补码中,所有位都被翻转,从 1 到 0,从 0 到 1,然后将数字 1 添加到结果中。最左边的位被称为符号位,所有其他位是指数字的大小。这种表示如图 2 所示。


图 2. 正负 8 位整数的内部表示由符号和大小组成

字节整数对于在数组中存储小值最有用。编译器生成字节码,在执行加法等数学运算之前将字节整数值转换为整数值。Java 的byte保留字标识源代码中的字节整数类型。

短整数类型描述了在16位表示的整数; 它可以容纳从 -32,768 到 32,767 的整数值。它具有与字节整数相同的内部表示,但具有更多位以适应其更大的幅度。在执行数学运算之前,编译器生成字节码以将短整数值转换为整数值。Java 的short保留字标识源代码中的短整数类型。

整数类型描述了在32位表示的整数; 它可以容纳从 -2,147,483,648 到 2,147,483,647 的整数值。它具有与字节整数和短整数相同的内部表示,但具有更多位以适应其更大的幅度。Java 的int保留字标识源代码中的整数类型。

长整型类型描述了在64位表示的整数; 它可以容纳从 -2 63到 2 63 -1 的整数值。它拥有与字节整数、短整数和整数相同的内部表示,但具有更多位以适应其更大的幅度。Java 的long保留字标识源代码中的长整数类型。

浮点类型

出于空间和精度原因,Java 支持两种浮点类型。较小的类型在数组上下文中很有用,但不能容纳如此大的值范围。虽然它在数组上下文中占据更多的空间,但更大的类型可以容纳更大的范围。

的浮点类型描述了在32位表示的浮点值; 它可以适应范围从大约 +/-1.18x10 -38到大约 +/-3.4x10 38 的浮点值。它以IEEE 754格式表示,其中最左边的位是符号位(0为正,1为负),接下来的8位保存指数,最后23位保存尾数,结果大约是6-9个十进制精度的数字。Java 的float保留字标识源代码中的浮点类型。

在双精度浮点型描述了在64位表示的浮点值; 它可以适应范围从大约 +/-2.23x10 -308到大约 +/- 1.8x10 308 的浮点值。它以 IEEE 754 格式表示,其中最左边的位是符号位(0 为正,1 为负),接下来的 11 位保存指数,最后 52 位保存尾数,结果约为十进制 15-17精度的数字。Java 的double保留字标识源代码中的双精度浮点类型。

引用类型

甲引用类型是从中创建或引用的对象的类型时,其中一个参考是某种指针的到该对象。(引用可以是实际内存地址、内存地址表的索引或其他内容。)引用类型也称为用户定义类型,因为它们通常由语言用户创建。

Java 开发人员使用类特性来创建引用类型。甲类是无论是对一个应用程序的一个占位符main()的方法(参见HelloWorld在应用“从地面学习Java ”)或各种static方法,或它在用于制造对象的模板,如下面所示。

class Cat
{
   String name; // String is a special reference type for describing strings

   Cat(String catName)
   {
      name = catName;
   }

   String name()
   {
      return name;
   }
}

这个类声明引入了一个Cat用于描述猫科动物的类。它的name字段将猫的名字存储为一个字符串,它的构造函数将这个数据成员初始化为一个猫的名字,它的name()方法返回猫的名字。以下代码片段位于main()方法中,展示了如何制造一只猫并获得它的名字:

Cat cat = new Cat("Garfield");
System.out.println(cat.name()); // Output: Garfield

使用接口引用对象

Java 的接口特性使您可以引用一个对象而不必关心对象的类类型。只要对象的类实现了接口,对象也被认为是接口类型的成员。

下面的例子声明了一个Shape接口Circle和Rectangle类:

interface Shape
{
   void draw();
}

class Circle implements Shape
{
   void draw()
   {
      System.out.println("I am a circle.");
   }
}

class Rectangle implements Shape
{
   void draw()
   {
      System.out.println("I am a rectangle.");
   }
}

不能编译?检查能见度

如果你尝试编译上述代码,你将收到一条错误消息。问题是 thatShape的draw()方法具有公共可见性,而Circle’s 和Rectangle’ 的每个draw()方法都具有包可见性。您可以通过public在Circle’s 和Rectangle’sdraw()方法标头前添加来解决此问题,如public void draw().

下一个示例实例化Circleand Rectangle,将它们的引用分配给Shape变量,并要求它们绘制自己:

Shape shape = new Circle();
shape.draw(); // Output: I am a circle.

shape = new Rectangle();
shape.draw(); // Output: I am a rectangle.

可以使用接口从一组不同的类中抽象出共性。作为一个例子,一个Inventory接口将提取的共同性Goldfish,Car和Hammer类,因为每个这些项目可以被清点。当与数组和循环结合使用时,接口可提供相当大的功能,将在本系列的后面部分了解这些内容。

字符串中的语法糖

String描述字符串 的类是 Java 唯一包含特殊语言支持的类型。例如,考虑如何创建一个String包含Java字符串的对象,然后将其引用分配给变量language。如果String像其他类型一样,您需要指定String language = new String(“Java”);. 因为String是特殊的,您可以改为指定:String language = “Java”;。

这是语法糖的一个例子——一种使语言“甜”的结构规则。字符串连接也受益于语法糖。例如,您可以指定,甚至更短的:,而不是指定language = language.concat(" rules!");produce 。 Java rules!language = language + " rules!";language += " rules!";

数组类型

Array 是我们三种类型中的最后一种。一个数组类型是表示一个特殊的引用类型阵列,其是存储器的区域,在这是大小相等,并且是(通常)的连续时隙存储值。这些值通常称为元素。数组类型由元素类型(基本类型或引用类型)和一对或多对表示维数的方括号组成(extents) 被数组占用。一对括号表示一维数组(向量);两对括号表示一个二维数组(一个表格);三对括号表示二维数组的一维数组(表格向量);等等。例如,int[]表示一维数组(以int元素类型),String[][]表示二维数组(以String元素类型)。

空的类型

除了基本类型、引用类型和数组类型之外,Java 还支持void 类型,它由保留字 表示void。void 类型用于方法头上下文中,它表示该方法不返回值。例如,public static void main(String[] args)标头指定void为其返回类型,因为该main()方法从不向其调用者返回值(尽管您可以通过方法调用返回整数退出代码)。 System.exit(integer);

文字:在 Java 代码中指定值

Java 提供了用于在源代码中嵌入值的文字语言功能。一个文字是一个值的字符表示。每个原始类型都与它自己的一组文字相关联,如下所示。

布尔基元类型与文字trueor相关联false。

字符原始类型与字符文字相关联,通常由放置在单引号之间的单个值组成,如大写字母 A ( ‘A’)。或者,您可以指定转义序列或 Unicode 转义序列。考虑以下选项:

  • 一个转义序列是针对不能在字符文字或文字字符串字面上表示的字符的表示。转义序列以反斜杠字符 ( )开头,后跟, ‘, ", b, f, n, r, 或t. 您必须始终转义要按字面表示的反斜杠,以通知编译器它没有引入转义序列。您必须始终转义以字符文字字面表示的单引号,以通知编译器单引号不是以字符文字结尾。同样,您必须始终转义以字面量表示的双引号,以通知编译器双引号不是以字符串字面量结尾。其他转义序列用于没有符号表示的字符:\\b表示退格、\\f表示换页、\\n表示换行、\\r表示回车和\\t表示水平制表符。转义序列出现在字符文字上下文中的单引号之间(例如,’\\n’)。

  • 甲Unicode转义序列为任意的Unicode字符的表示。它由一个\\u前缀紧跟四个十六进制数字组成。例如,\\u0041代表大写字母A,\\u3043代表平假名字母。Unicode 转义序列出现在字符文本上下文中的单引号之间(例如,’\\u3043’)。

整数类型与由数字序列组成的文字相关联,可以选择嵌入下划线字符。默认情况下,整数文字被分配整数 ( int) 类型。您必须使用大写字母L(或小写字母l,可能与 digit 混淆1)为文字后缀以表示长整数值。整数文字可以用二进制、十进制、十六进制和八进制格式指定:

  • 二进制由数字 0 和 1 组成,并以0b或为前缀0B。例子:0b01111010。
  • 十进制由数字 0 到 9 组成,没有前缀。例子:2200。
  • 十六进制由数字 0 到 9、小写字母a到f和大写字母A到F 组成。此文字以0xor为前缀0X。例子:0xAF。
  • 八进制由数字 0 到 7 组成,并以0.为前缀。例子:077。

为了提高可读性,您可以在数字之间插入下划线字符;例如,1234_5678_9012_3456L。不能指定前导下划线,如_1234,因为编译器会假定指定了标识符。您也不能指定尾随下划线。

浮点类型与由非小数部分、小数点、小数部分、可选指数和可选双精度浮点类型字母Dord或浮点类型字母For 组成的文字相关联f。浮点面值的例子包括2.7818,0.8D,-57.2E+31,和3.14159f。如果没有D,d,F,也不f存在时,类型默认为双精度浮点。如果D或d存在,则类型也是双精度浮点数。但是,如果指定了F或f,则类型为浮点型。

对于浮点类型,您可以在数字之间插入下划线字符;例如,1.234_567e+56。您不能指定前导下划线(例如,1.234),因为编译器会假定指定了标识符。您也不能指定尾随下划线(例如1.5)、小数点两侧的下划线(例如2_.3或2._3)、存在指数时的e或E字符之前或之后的下划线(例如1.2_e3或1.2E_3)以及下划线跟在or 之后的任何+or-字符的任一侧(例如,or )。 eE2.8e_+23.1E-_5

引用类型文字

每个引用类型都与一个特殊的null文字相关联,以表示没有引用。的String引用类型与一组字符串文字相关联。这些以双引号开头;继续使用文字字符、转义序列和 Unicode 转义序列;并以双引号结束。一个例子是:“Hello, “Java””。

变量:在 Java 代码中存储值

应用程序操作存储在内存中的值。Java 的变量特性在源代码中象征性地表示内存。甲变量是存储某些类型的值命名的存储单元。对于原始类型,值直接存储在变量中。对于引用类型的变量,引用存储在变量中,引用所引用的对象存储在其他地方。存储引用的变量通常称为引用变量。

您必须在使用之前声明一个变量。变量声明至少包含一个类型名称,可选后跟一系列方括号对,后跟一个名称,可选后跟一系列方括号对,并以分号字符 (😉 结尾。考虑以下示例:

int age;             // Declare integer variable age.
float interest_rate; // Declare floating-point variable interest_rate.
String name;         // Declare String variable name.
Car car;             // Declare Car variable car.
char[] text;         // Declare one-dimensional character array variable text.
double[][] temps;    // Declare two-dimensional floating-point array variable temps.

变量在使用之前需要进行初始化,有两种方法可以做到这一点。一种方法是初始化一个变量作为其声明的一部分:

int age = 25;
float interest_rate = 4.0F;
String name = "Java";
Car car = new Car();
char[] text = { 'J', 'a', 'v', 'a' };
double[][] temps = { { 25.0, 96.2, -32.5 }, { 0.0, 212.0, -41.0 }};

每个初始化都需要=跟一个文字、一个以 开头的对象创建表达式new或一个数组初始值设定项(仅适用于数组类型)。数组初始值设定项由大括号分隔和逗号分隔的文字列表和(对于多维数组)嵌套数组初始值设定项组成。

请注意,该text示例创建了一个由四个元素组成的一维字符数组。该temps示例创建一个由双精度浮点值组成的两行三列二维数组。数组初始值设定项指定两个行数组,每个行数组包含三个列值。

如果您愿意,可以在声明后省略类型来初始化变量:

age = 25;
interest_rate = 4.0F;
name = "Java";
car = new Car();
text = { 'J', 'a', 'v', 'a' };
temps = { { 25.0, 96.2, -32.5 }, { 0.0, 212.0, -41.0 }};

使用 var 声明局部变量

从 Java SE 10 开始,有一个简单的替代方法来声明和初始化变量。在某些情况下,您可以用var关键字替换变量的类型名称,如下所示:

var age = 25;
var interest_rate = 4.0F;
var name = "Java";
var car = new Car();

使用有很多限制var。例如,您不能var在数组上下文中使用。请参阅“最后,Java 10 必须var声明局部变量”以了解有关var.

使用 jshell 声明和初始化变量

Java Shell 使变量声明和初始化的练习变得容易,正如您在下面的示例中所见(请注意,分号终止符不是必需的)。

jshell> int age
age ==> 0

jshell> float interest_rate = 4.0F
interest_rate ==> 4.0

jshell> var name = "Java"
name ==> "Java"

jshell>

声明变量后,jshell输出变量名称及其值的描述。如果您尝试声明一个没有类型(或不使用var)的变量,您将看到一条错误消息:

jshell> foo = 5
|  Error:
|  cannot find symbol
|    symbol:   variable foo
|  foo = 5
|  ^_^

jshell>

Java Shell 允许您重新声明具有不同类型的变量。例如,让我们重新声明age为 typeString和nametype int:

jshell> String age
age ==> null

jshell> var name = 1
name ==> 1

访问变量的值

要访问变量的值,请指定变量的名称(对于原始类型和String),取消引用对象并访问成员,或使用数组索引符号来标识要访问其值的元素:

System.out.println(age);           // Output: 25
System.out.println(interest_rate); // Output: 4.0
System.out.println(name);          // Output: Java
System.out.println(cat.name());    // Output: Garfield
System.out.println(text[0]);       // Output: J
System.out.println(temps[0][1]);   // Output: 96.2

为了取消引用对象,您必须在引用变量 ( cat) 和成员 ( name())之间放置一个句点字符。在这种情况下,name()调用该方法并输出其返回值。

数组访问需要为每个维度指定一个从零开始的整数索引。对于text,只需要一个索引:0 标识此一维数组中的第一个元素。对于temps,需要两个索引:0 标识第一行,1 标识此二维数组中第一行的第二列。

您可以通过用逗号将每个变量与其前任变量分隔开来在一个声明中声明多个变量,如以下示例所示:

int a, b[], c;

这个例子声明了一个名为三个变量a,b和c。每个变量共享相同的类型,恰好是整数。与每个存储一个整数值的aand不同c,b[]表示一个一维数组,其中每个元素存储一个整数。还没有与 关联的数组b。

请注意,当数组在与其他变量相同的声明中声明时,方括号必须出现在变量名称之后。如果将方括号放在变量名称之前,如int a, []b, c;,编译器会报告错误。如果将方括号放在类型名称之后,如在 中int[] a, b, c;,则所有三个变量都表示一维整数数组。

方括号去哪里了?

方括号可以出现在类型名称之后或变量名称之后,但通常不会同时出现在这两个位置。例如,您可以指定int[] x;或int x[];。但是,通常的做法是将方括号放在元素类型名称之后(例如,int)。如果要指定int[] x[];,则必须声明一个二维数组变量,就好像已指定int[][] x;.

编译 Unicode

您已经看到了字符编码如何在 Java 程序中工作的各种示例。了解 Unicode 如何影响 Java 编译也很重要。

Java 程序列表通常存储在文件中,并根据本机平台的字符编码对其进行编码。例如,我的 Windows 8.1 平台使用Cp1252作为其字符编码。当 JVM 开始运行时,例如当您通过该javac工具启动基于 Java 的 Java 编译器时,它会尝试获取此编码。如果 JVM 无法获取,则 JVM 会选择 UTF-8 作为默认字符编码。

Cp1252 不支持传统 ASCII 字符集之外的许多字符,这可能会导致问题。例如,如果您尝试使用 Windowsnotepad编辑器来保存清单 1,编辑器会抱怨 Unicode 格式的字符将丢失。你能弄清楚为什么吗?

清单 1. 以符号方式命名标识符(版本 1)

class PrintPi
{
   public static void main(String[] args)
   {
      double π = 3.14159;
      System.out.println(π);
   }
}

问题是上述来源包含希腊字母 Pi ( π) 作为变量名称,这导致编辑器犹豫不决。幸运的是,我们可以解决这个问题。

首先,尝试将清单 1 保存到一个名为 的文件中PrintPi.java:

  • 从notepad的另存为对话框中,输入PrintPi.java文件名。
  • 从编码选项的编码下拉列表中选择对应于 UTF-16 的 Unicode 。
  • 按 保存。

接下来,尝试编译PrintPi.java,如下:

javac PrintPi.java

作为响应,您将收到许多错误消息,因为文本文件的内容被编码为 UTF-16,但javac假设(在我的平台上)内容被编码为 Cp1252。为了解决这个问题,我们必须知道javac内容被编码为 UTF-16。我们通过将-encoding Unicode选项传递给这个程序来做到这一点,如下所示:

javac -encoding Unicode PrintPi.java

这一次,代码编译没有错误。当您执行PrintPi.classvia 时java PrintPi,您将观察到以下输出:

3.14159

您还可以通过指定不带引号的 Unicode 转义序列来嵌入来自其他字母表的符号。这样,您在保存列表或编译保存的文本时不必指定编码,因为文本是根据本机平台的编码(例如,Cp1252)进行编码的。例如,清单 2 替换为该符号π的\\u03c0Unicode 转义序列。

清单 2. 以符号方式命名标识符(版本 2)

class PrintPi
{
   public static void main(String[] args)
   {
      double \\u03c0 = 3.14159;
      System.out.println(\\u03c0);
   }
}

编译不带-encoding unicode选项 ( javac PrintPi.java)的源代码并像以前一样运行应用程序 ( java PrintPi)。您将观察到相同的输出。

综上所述

GitHub 星标 115k+的 Java开发教程,超级硬核!

Java 有许多基本的语言特性,在了解该语言更有趣的部分之前,必须先了解这些特性。在本教程中,您学习了如何在 Java 程序中使用标识符、类型、文字和变量。您还快速介绍了编写代码的文档,并探索了编译 Unicode 的一个常见(但可以解决)的挑战。

以上是关于坚持原创 绝不注水爆肝万字长文Java 语言的基本特性(喂饭式教程)的主要内容,如果未能解决你的问题,请参考以下文章

中秋节爆肝万字,带你熟悉Linux进程的基本操作!!!

(大厂必备)厂长熬夜爆肝万字之多线程高并发JUC编程⭐学妹已收藏

(大厂必备)厂长熬夜爆肝万字之多线程高并发JUC编程⭐学妹已收藏

熬夜爆肝万字C#基础入门大总结建议收藏

熬夜爆肝万字C#基础入门大总结建议收藏

深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)