java入门教程 2 - 变量、数据类型、文字量

Java Tutorial 2 -Variable、Primitive Data Types、literals

Posted by xuepro on December 15, 2022

1.2.1 变量variable (youtube视频:变量

Java中的变量分为原始变量(primitive variables)引用变量(reference variables)

原始变量是保存(原始类型)数据(值)的内存块的名字,你可以认为原始变量就是这块内存块。如:

int age = 20;

这个代码语句定义了一个名字叫age的变量,其数据类型是int,int是一个整数(integer)数据类型。age变量的初始值是20。

定义变量时可以不给它初始值,随后可以用单独的赋值运算符= 给它一个值。例如,

int age;
age = 20;

注意:Java 是一种静态类型的语言。这意味着所有变量都必须在使用之前声明,即声明一个变量的数据类型。如上面声明的age变量的数据类型是int。

引用变量保存的是java的类的对象(objects) 的引用。这个引用类似于C/C++语言中的指针,即引用变量引用一个类的对象,但不是这个对象本身。

String是java中表示字符串的类,下面代码定义了一个引用变量s,表示s引用一个String类的对象,这个对象的值是字符串”Hello, World!”。

String s = "Hello, World!";

虽然,我们习惯说s的值是”Hello, World!”,但严格来说,这是不正确的。s的实际值是String类对象的一个引用(指针)而不是”Hello, World!”。但这个对象中的值是”Hello, World!”。

因此:原始变量的信息存储为该变量的值,而引用变量保存其引用对象的引用。

再看一下这个代码:

int problems = 99;
String name = "Jay-Z";

原始类型int的变量problems和类对象的引用变量name,其内存布局示意图如下:

原始变量和引用变量

修改变量的值

可以用用赋值运算符= 修改一个变量的值,

int age = 20;  //age初始值是20
age = 22;      //修改age值为22

单一定义原则

在同一个作用域里不能定义两个同名的变量。作用域今后会讨论,这里可以简单理解为左右花括号{和}包围的一个程序块。如:

int age = 16;
int age;       //错:重定义

或者

int value;
float value = 25.4;       //错:重定义

这里的float是浮点类型(表示一个实数)。

变量名的定义规则

变量的名称可以是任何合法的标识符: 一个任意长的 Unicode字母和数字序列。定义变量名有下面一些规则:

  • 变量必须以字母或下划线_ 或美元符$开头。例如:
    int age;     // 合法良好的名字
    int _age;    // 合法但不好
    int $age;    // 合法但不好
    
  • 后续字符可以是字母、数字、美元符号或下划线字符。
     int NUM_GEARS = 6
    
  • 变量名不能以数字开头。例如:
    int 3age;  // 不合法
    
  • 变量名不能使用空格。例如,
float test score ;  // 不合法
  • Java 区分大小写。因此,age和 AGE 是两个不同的变量。例如:
int age = 20;
int AGE = 22;

System.out.println(age);  // prints 20
System.out.println(AGE);  // prints 22
  • 创建变量时,选择一个有意义的名称。例如,score、name、age 比 s、n 和 a 等变量名更有意义。
  • 有时可以用多个单词表示一个变量,除第一个单词外,其他单词的首字母通常大写,如myScore、serverSocket。

根据变量的作用范围,变量还分为:Instance Variables (Non-Static Fields)(实例变量或非静态变量)、Class Variables (Static Fields) (类变量或静态变量)、Local Variables(局部变量)、Parameters(参数)。 如下面的main()方法内定义的都是局部变量,而args是main()方法的参数。参数本质上也是局部变量。

class MyClass {
  public static void main(String[] args) {
    	
    double myDouble = 3.4;
    float myFloat = 3.4F;
 
    // 3.445*10^2
    double myDoubleScientific = 3.445e2;

    System.out.println(myDouble);  // prints 3.4
    System.out.println(myFloat);    // prints 3.4
    System.out.println(myDoubleScientific);   // prints 344.5
  }
}

1.2.2 数据类型(Data Types)、原始类型(Primitive Data Types) (youtube视频:原始数据类型

Java是一个静态类型语言,任何变量的定义都必须说明其数据类型。Java的数据类型(Data Types)分为原始类型(Primitive Data Types)类(class) 类型。如String是一个表示字符串的类类型,而int是表示整数的原始类型。

本节介绍原始数据类型,Java一共有8种原始数据类型:byte、short、int、long、float、double、boolean 和 char。不同数据类型占据内存的大小不一样,表示的值及其范围也不一样。

如下面main()方法中的不同类型的变量:

class TestDataType{
  public static void main(String[] args) {
    String name = "hwdong.net";          // String类型
    byte age = 5;                        // byte类型
    short schoolStudentNum = 16913;      // short短整型
    int collegeStudentNum  = 36913 ;     // int整型
    long atomicNum = 12345678910L;      // long长整型
    float height = 172.5f;              // 单精度浮点数类型
    double profit =  234.5d;            // 双精度浮点数类型
    boolean passed = true;             // 布尔类型
    char grade = 'B';                   // 字符类型
    char ch = '\u0051';
    
    System.out.println(name);  // 打印 hwdong.net
    System.out.println(age);  // 打印 5
    //...
    System.out.println(grade);  // 打印 B
    System.out.println(ch);  // 打印 Q
  }
}

8个原始类型

  1. boolean 类型 boolean(布尔)数据类型有两个可能的值,true 或 false。boolean类型变量如果没有初始化,其默认值是false。boolean类型变量通过用来表示某个条件的真假(true/false)。

  2. byte 类型: byte(字节)数据类型的值可以从 -128 到 127(8 位有符号二进制补码整数)。如果确定一个变量的值在-128到127之间,那么就用它代替int来节省内存。byte类型变量的默认值是0。

  3. short 类型: short(短整型) 数据类型的值可以从 -32768 到 32767(16 位有符号二进制补码整数)。如果确定变量的值将在 -32768 和 32767 之间,则使用它代替其他整数数据类型(int、long)以便节省内存。

  4. int 类型: int(整型)数据类型可以取值从$-2^{31}$到$-2^{31}-$(32位有符号二进制补码整数)。默认值是:0。

  5. long 类型: long(长整型)数据类型的值可以从$-2^{63}$ 到 $-2^{63}-1$ (64 位有符号二进制补码整数)。默认值是:0。

  6. double 类型: double双精度数据类型是双精度 64 位浮点数。

  7. float 类型: float 数据类型是单精度 32 位浮点数。

  8. char 类型: char(字符类型)表示一个 16 位 Unicode字符。char数据类型的最小值为’\u0000’ (0),最大值为’\uffff’。默认值: ‘\u0000’。 字符’\u0000’并不是表示字符’0’,字符’0’的Unicode字符的值并不等于0。

下表总结了java的基本类型数据占用内存大小、取值情况和默认值。

数据类型 内存大小 取值 默认值
byte 1个字节 -128到127之间的整数 0
short 2个字节 -32,768到32,767之间的整数 0
int 4个字节 -2,147,483,648 到2,147,483,647之间的整数 0
long 8个字节 -9,223,372,036,854,775,808到9,223,372,036,854,775,807之间的整数 0
float 4个字节 单精度32位 IEEE 754 浮点数 ,小数位可达7位 0.0f
double 8个字节 双精度 64 位 IEEE 754 浮点数,小数位可达15位 0.0d
boolean 1个字节 只有2个值:true和false false
char 2个字节 表示单个字符 ‘\u0000’

1.2.3 文字量 literals

youtube视频:文字量

文字量是用于表示固定值的数据。它们可以直接在代码中使用。例如,

int age = 20;
float score = 80.5;

代码中的20、80.5都是文字量。

1. Boolean(布尔)文字量: 用于初始化布尔数据类型。它们只有两个值:true 和 false。

2. Integer(整数)文字量: 整型文字量是没有任何小数或指数部分的数字文字量,用于表示一个整数值。整型文字量可以表示为不同进制(二进制、八进制、十进制、十六进制)形式。如0b1101110、0156、110、0x6E分别是整数110的二进制、八进制、十进制和十六进制表示。

class TestLiterals{
    public static void main(String[] args没有任何小数或指数部分) {
      int binaryNumber = 0b1101110;  //0b开头的二进制整数
      int octalNumber = 0156;       //0开头的八进制整数
      int decNumber = 110;           //十进制整数
      int hexNumber = 0x6E; // 0x开头的十六进制整数

      System.out.println(binaryNumber); 
      System.out.println(octalNumber); 
      System.out.println(decNumber); 
      System.out.println(hexNumber); 
  }
}

3. Floating-point(浮点)文字量: 浮点文字量是具有小数形式或指数形式的数字文字量。浮点文字量有3种形式:

  • 简单的小数形式: 浮点字面量的最简单形式由一个或多个十进制数字和一个小数点 (.) 以及一个可选的后缀(f、F、d 或 D)组成。可选后缀允许您指定文字是浮点数(f 或 F)或双精度值(d 或 D)。默认值(未指定后缀时)为双精度。
1.0F     //float类型文字量
1.0D     //doule类型文字量
1.0      //doule类型文字量

0.0      // doule类型的浮点数
 .0      // doule类型的浮点数
 0.      // doule类型的浮点数
 0f      // float类型的浮点数
 1F      // float类型的浮点数 
  • 比例小数形式: 比例小数形式由简单小数和一个以E或e开头的指数部分构成。E或e后面是一个有符号的整数。指数部分是小数形式乘以十的幂的简写形式。最后面有一个可选的后缀来区分是float 和 double 文字量。
 1.0E1    // 表示 1.0 x 10^1 或者说 10.0 (double类型)
 1E-1D    // 表示 1.0 x 10^(-1) 或者说 0.1 (double类型)
 1.0e10f  // 表示 1.0 x 10^(10) 或者说 10000000000.0 (float类型)
  • 十六进制形式:十六进制形式与简单和缩放的十进制形式具有类似的语法,但以0x或0X开头、小数和指数部分都以十六进制表示。但指数部分以字母p或P开头而不是以e或E开头。指数表示比例因子,它是2的幂而不是10的幂。如:
0x1.0p1f      // 表示1.0 x 2^1
0xff.0p13     // 表示255.0 x 2^13

4. 字符文字量:字符文字量是用单引号括起来的 unicode 字符。 如:

char grade = 'A';
char doubleQuote = '"';

如何表示一些特殊的字符,如单引号字符'本身?用’'’表示显然不行。为此可以用反斜杠\字符引入的转义序列来表示这些特殊字符,如\'表示单引号字符'\n表示换行符、\r表示回车符、\t表示制表符。

char doubleQuote = '\'';
char newLine = '\n';
char returnCh = '\r';
char tab = '\t';

5. 字符串文字量: 是包含在双引号内的字符序列。如:

"Hello world"   // 包含11个字符的字符串
""              // 长度为0的空字符串
"\""            // 只有一个双引号字符的字符串               
"a\tb\t3\n"     // 包含转移字符序列的字符串
"https://hwdong.net"   

作为练习,请编写完整的程序输出这些字符串的值。


支付宝打赏 微信打赏

您的打赏是对我最大的鼓励!