Java - Language Basics - Variables

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html

Language Basics

Variables

int a = 1; 这里的a是字段,也可以说是变量
变量(字段)分几种:实例变量,静态变量,局部变量,参数

实例变量就是没被static修饰的
静态变量由static修饰,无论你实例化它多少次,它在内存中都只有一个
局部变量就是被{}括号包含的

变量命名规则/规范
规则:以字母、美元符号“$”或下划线“_”开头的Unicode字母和数字组成的不限长度的序列
规范:age,userName,userCurrentAddress,NUM_GEARS

Primitive Data Types

首先java是一种静态语言,静态语言是在编译时变量的数据类型即可确定的语言这意味着所有变量在使用之前都必须先声明。这涉及到声明变量的类型和名称,例如:int gear = 1;
这样做告诉程序存在一个名为“gear”的字段,它保存数值数据,初始值为“1”。

变量的数据类型决定了它可能包含的值,以及可能对它执行的操作。除了int, Java编程语言还支持其他7种基本数据类型。原始类型由语言预定义,并由保留关键字命名原始值不与其他原始值共享状态。Java编程语言支持的八种基本数据类型是:

  • byte:byte由8位bit(一个字节,1kb有1024字节)组成,每个bit只能是0或者1,所以byte一共有2的8次方种可能,也就是256,最小值为-128,最大值为127(包括)。

  • short:16位。最小值为-32,768,最大值为32,767(含)

  • int:32位,其最小值为-2的31次方,最大值为2的31次方-1。在Java SE 8和更高版本中,可以使用int数据类型来表示无符号32位整数,它的最小值为0,最大值为232-1。

  • long:64位,当需要的值范围比int所提供的值范围大时,请使用此数据类型

  • float:如果想在一个 big arrays 中节省内存空间,就用float;不应用于精确值例如货币;取值范围暂不讨论

  • double:对于小数,这种类型通常是默认选择;不应用于精确值例如货币;取值范围暂不讨论

  • boolean:只有两个可能的值:true和false,double的大小没有精确的定义

  • char:单个16位Unicode字符,最小值是'\u0000'(字符编码)或者0,最大值是'\uffff'或者 65,535

String

除了以上八种基本类型外,Java编程语言还通过Java.lang.string类提供了对字符串的特殊支持。
将字符串括在双引号内将自动创建一个新的string对象;例如,String s = "this is a String ";
字符串对象是不可变的,这意味着一旦创建,它们的值就不能更改。
从技术上讲,String类不是一个基本数据类型,但是考虑到该语言对它的特殊支持,您可能会倾向于这样看待它。您将在 Numbers and Strings 中了解更多关于String类的知识

Default Values

在声明字段时,并不总是需要赋值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,根据数据类型的不同,此默认值将为零或null。然而,依赖这些默认值通常被认为是糟糕的编程风格(为什么?)。

下图总结了上述数据类型的默认值。
image

局部变量略有不同;编译器从不给未初始化的局部变量赋值。如果您不能在声明局部变量的地方初始化它,请确保在尝试使用它之前给它赋值。访问未初始化的局部变量将导致编译时错误。

Literals

您可能已经注意到,在初始化基本类型的变量时,没有使用new关键字。基本类型是语言中内置的特殊数据类型;它们不是从类创建的对象。

基本类型的值取决与等号后面的字面值,我们称为Literals,如int a = 1,1就是Literals;
不同的基本类型对Literals的格式要求不一样

如在使用int的时候,我们可以使用不同前缀的Literals来使用不同的数字体系:

// The number 26, in decimal 十进制
int decVal = 26;
//  The number 26, in hexadecimal 十六进制
int hexVal = 0x1a;
// The number 26, in binary 二进制
int binVal = 0b11010;

在使用float的时候,Literals需要为f
在使用double时候,可以使Literals后缀为e2,表示用科学符号表示:

double d1 = 123.4;
// same value as d1, but in scientific notation
double d2 = 1.234e2;
float f1  = 123.4f;

在Java SE 7和以后的版本中,任何数量的下划线字符(_)都可以出现在数字字面值中数字之间的任何位置。例如,该特性使您能够。将数字字面值中的数字分组分开,这可以提高代码的可读性。
例如,如果代码包含多个数字,则可以使用下划线字符来分隔三组数字,类似于使用逗号或空格等标点符号作为分隔符。

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

Arrays

数组是一种 container object ,它保存固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,它的长度是固定的。

image

数组中的每一项都称为element(元素),每个元素都通过其数值索引访问。如上图所示,编号从0开始。例如,第9个元素将在索引8处被访问。

Declaring a Variable to Refer to an Array

// declares an array of integers
int[] anArray;

与其他类型变量的声明一样,数组声明有两个组成部分:数组类型和数组名称。
数组的类型写为type[],其中type是包含元素的数据类型;括号是特殊符号,表示该变量控制一个数组。
数组的大小不是它的类型的一部分(这就是为什么括号是空的)。
数组的名称可以是您想要的任何名称,只要它遵守前面在命名部分中讨论的规则和约定。
与其他类型的变量一样,声明并不实际创建一个数组;它只是告诉编译器这个变量将保存指定类型的数组。

类似地,你可以声明其他类型的数组:byte[] anArrayOfBytes;

short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;

你也可以把方括号放在数组的名字后面(虽然不鼓励这样写):

// this form is discouraged
float anArrayOfFloats[];

Creating, Initializing, and Accessing an Array

创建数组的一种方法是使用new操作符。ArrayDemo程序中的下一条语句分配了一个数组,该数组有足够的内存容纳10个整数元素,并将该数组分配给anArray变量。

// create an array of integers
anArray = new int[10];

如果缺少这条语句,编译器会输出编译失败。

或者,你可以使用快捷语法来创建和初始化一个数组:

int[] anArray = { 
    100, 200, 300,
    400, 500, 600, 
    700, 800, 900, 1000
};

这样做的话,数组的长度由大括号和逗号分隔的值的数量决定。

还可以使用两组或多组方括号声明数组的数组(也称为多维数组),例如String[][]名称。因此,每个元素必须由相应数量的索引值访问。

在Java编程语言中,多维数组是其组件本身就是数组的数组,也就是说String[][]就是一个String数组里面包含了多个String 数组

//String数组里面包含了多个String 数组,这只是我想表达的意思,实际不能这样写
String[] multidimensionaLarray = {
 String[],String[]...,String[]
}

//实际写法
class MultiDimArrayDemo {
    public static void main(String[] args) {
        String[][] names = {
            {"Mr. ", "Mrs. ", "Ms. "},
            {"Smith", "Jones"}
        };
        // Mr. Smith
        System.out.println(names[0][0] + names[1][0]);
        // Ms. Jones
        System.out.println(names[0][2] + names[1][1]);
    }
}

最后,您可以使用内置的length属性来确定任何数组的大小。

 System.out.println(anArray.length);

Copying Arrays

System类有提供了一个arraycopy方法,可以有效地将数据从一个数组复制到另一个数组:

class ArrayCopyDemo {
    public static void main(String[] args) {
        String[] copyFrom = {
            "Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
            "Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
            "Marocchino", "Ristretto" };

        String[] copyTo = new String[7];
		//三个int参数分别代表源数组的起始位置、目标数组的起始位置以及要复制的数组元素数量
        System.arraycopy(copyFrom, 2, copyTo, 0, 7);
        for (String coffee : copyTo) {
            System.out.print(coffee + " ");
        }
    }
}

数组是编程中使用的一个强大而有用的概念。Java SE提供了一些方法来执行一些最常见的与数组相关的操作。例如,ArrayCopyDemo示例使用System类的arraycopy方法,而不是手动遍历源数组的元素并将每个元素放入目标数组。这是在幕后执行的,使开发人员只需使用一行代码就可以调用该方法。

为了方便起见,Java SE在Java .util. arrays类中提供了一些方法来执行数组操作(常见任务,如复制、排序和搜索数组)。例如,前面的示例可以修改为使用java.util.Arrays类的copyOfRange方法,正如您在ArrayCopyOfDemo示例中所看到的那样。

java.util.Arrays提供的一些有用的方法:

  • 在数组中搜索特定的值,以获得它所在的索引(binarySearch方法)。
  • 比较两个数组以确定它们是否相等(equals方法)。
  • 填充数组以在每个索引处放置特定的值(fill方法)。
  • 对数组进行升序排序。
  • 创建一个使用数组作为源的流(stream方法)。
    有关流的更多信息,请参阅Aggregate Operations
  • 将数组转换为字符串。toString方法将数组的每个元素转换为一个字符串,用逗号分隔它们,然后用括号括起来
System.out.println(java.util.Arrays.toString(copyTo));
//This statement prints the following:
[Cappuccino, Corretto, Cortado, Doppio, Espresso, Frappucino, Freddo] 

Summary(总结) of Variables

Java编程语言使用“字段”和“变量”作为其术语的一部分。
实例变量(非静态字段)对于一个类的每个实例是唯一的。
类变量(静态字段)是用静态修饰符声明的字段;一个类变量只有一个副本,不管这个类被实例化了多少次。局部变量在方法中存储临时状态。
参数是为方法提供额外信息的变量;
局部变量和参数总是被归类为“变量”(而不是“字段”)。当命名你的字段或变量时,有一些规则和约定你应该(或必须)遵守。

八种基本数据类型是:byte、short、int、long、float、double、boolean和char。string类表示字符串。编译器将为上述类型的字段分配一个合理的默认值;
对于局部变量,从不指定默认值。
literal是固定值的源代码表示。
数组是一种容器对象,它保存固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,它的长度是固定的。

posted @ 2022-05-11 15:53  Pril  阅读(49)  评论(0)    收藏  举报