1.基本数据类型与变量

1.1 基本数据类型

Java属于强类型语言,强类型语言必须为每一个变量声明一种类型。

Java中基本数据类型也称做简单数据类型,包括以下八种

1、整型

byte 、short 、int 、long

2、浮点型

float 、 double

3、字符型

char

4、布尔型

boolean

1.1.1 整型

整型(byte、short、int、long)

整型数据有四种,它们的取值范围不同

byte 的取值范围:-128~127(-2的7次方到2的7次方-1)

short 的取值范围:-32768~32767(-2的15次方到2的15次方-1)

int 的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1)

long 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)

1.1.2 浮点型

浮点型包括float和double两种,区别在与精度,float是单精度、32位、符合IEEE 754标准的浮点数;double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数。

float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45

double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324

java对于浮点型数据默认会使用double。

1.1.3 字符类型

char 类型是一个单一的 16 位 Unicode 字符;

最小值是 \u0000(十进制等效值为 0);

最大值是 \uffff(即为 65535);

char 数据类型可以储存任何字符;

1.1.4 布尔类型

布尔类型只有两个取值,分别是true 、false 。

java默认是false。

1.2 变量

1.2.1 变量类型

java属于强类型语言,所以变量在使用前必须进行声明,以下是几个声明与赋值的示例:

  1. int a, b, c; // 声明三个int型整数:a、 b、c
  2. int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
  3. byte z = 22; // 声明并初始化 z
  4. String s = "runoob"; // 声明并初始化字符串 s
  5. double pi = 3.14159; // 声明了双精度浮点型变量 pi
  6. char x = 'x'; // 声明变量 x 的值是字符 'x'。

java有三类变量,分别是:

  • 类变量:独立于方法之外的变量,用 static 修饰。
  • 实例变量:独立于方法之外的变量,不过没有 static 修饰。
  • 局部变量:类的方法中的变量。
  1. public class var{
  2. static int lei_var; // 类变量
  3. String str="hello world"; // 实例变量
  4. public void test(){
  5. int local_var =0; // 局部变量
  6. }
  7. }

局部变量

如果在成员方法中定义一个变量,那么这个变量就被称为局部变量。

局部变量在方法实行时被创建,在方法执行结束的时候被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则出现编译错误。

例如,我们创建一个类文件,在该类中定义getName()方法,在getName()方法中声明int型的局部变量id,并赋值为0,代码如下:

  1. public class BookText(){
  2. public String getName(){
  3. int id = 0; //局部变量,如果我们把初始值去掉,会报错
  4. setName("Java"); //调用类中的其他方法(此类中省略定义方法)
  5. return i + this.name;
  6. }
  7. }

注意: 类成员变量和成员方法可以统称为类成员。如果一个方法中含有与成员变量同名的局部变量,则方法中对这个变量的访问以局部变量的值为基准。例如,变量id在 getName()方法中值为0,而不是成员变量中id的值。

局部变量的作用域,即局部变量的有效范围,下图描述了局部变量的作用范围。

  1. public void doString(String name){
  2. int id = 0;
  3. for(int i = 0; i< 10; i++)
  4. System.out.println(name + String.valueOf(i));
  5. }

在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量,如下图

  1. public void doString(String name){
  2. int id = 0;
  3. for(int i= 0; i<10; i++){
  4. System.out.println(name String.valueOf(i));
  5. }
  6. for (int i= 0; i <3; i++)
  7. System.out.println(i);
  8. }

但是在相互嵌套的区域中不可以这样声明,如果将局部变量id在方法体的for循环中再次定义,编译器将会报错,如图所示。

  1. public void doString(String name){
  2. int id = 0;
  3. for(int i= 0; i<10; i++)
  4. System.out.println(name + String.valueOf(i));
  5. for(int i = 0; i<3; i++)
  6. System.out.println(i); int id = 7;
  7. }

注意: 在作用范围外使用局部变量是一个常见的错误,因为在作用范围外没有声明局部变量的代码。

实例变量

也叫类成员变量,声明在一个类当中,方法、构造方法和语句块之外。实例变量的生命周期与对象一致。

类变量/静态变量

类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。生命周期与类一致。

1.2.2 类型转换

  1. 在平时编程的时候,经常需要将一种数值类型转换为另一种数值类型。

2. 初始Java语言基础 - 图1

  • 若两个操作数中有一个是double类型,另一个操作数就会转换为double类型;
  • 若其中一个操作数是float类型,另一个操作数也会转换为float类型;
  • 若其中一个操作数为long类型,另一个操作数也会转换为long类型;
  • 否则两个操作数都会转换为int类型。

    数值类型的转换可能会发生精度的丢失,例如:123456789是一个大整组,它所包含的位数比float类型所能表达的位数还要多。当它由整型数值转换为float类型时,将会得到同样大小的结果,但却丢失一定的精度。

  1. int n = 123456789;
  2. float f = n;
  3. System.out.println(f);

输出:1.23456792E8

强制类型转换

  1. 由上方可看出,在必要时候int类型会自动转换为double类型,而也会有将double类型转换为int类型的需要。这时,就需要通过_强制类型转换_来实现这个操作。
  2. 强制类型转换的语法格式是在**圆括号中给出想要转换的目标类型,后面紧跟着待转换的变量名**。
  1. double x = 9.997;
  2. int nx = (int)x;
  1. 在这里,变量nx的值就会变成9。强制类型转换通过截断小数部分将浮点值转换为整型。
  2. 若想要对浮点数进行舍入运算,以便得到最接近的整数,就需要用Math.round方法:
  1. double x = 9.997;
  2. int nx = (int) Math.round(x);
  1. 现在变量nx的值为10

1.2.3 常量

常量在程序运行时是不能被修改的。

在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:

  1. final double PI = 3.1415927;

虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。

字面量可以赋给任何内置类型的变量。例如:

  1. byte a = 68;
  2. char a = 'A'

byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。

当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制, 例如:

  1. int decimal = 100;
  2. int octal = 0144;
  3. int hexa = 0x64;

和其他语言一样,Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:

  1. "Hello World"
  2. "two\nlines"
  3. "\"This is in quotes\""

字符串常量和字符常量都可以包含任何Unicode字符。例如:

  1. char a = '\u0001';
  2. String a = "\u0001";

1.3 枚举类型

  1. 有时候,变量的取值只在一个有限的集合内,这个变量中很可能保存错误的值。针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。

例如:

销售服装的尺寸有小、中、大和超大四种尺寸。

Size类型的变量只能存储这个类型声明中给定的某个枚举值,或null值。null表示这个变量没有设置任何值。

  1. enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
  2. //声明这种类型的变量
  3. Size s = Size.MEDIUM;

2. 运算符和表达式

  1. Java中,使用算术运算符`+、-、*、/`表示加、减、乘、除运算。
  2. 当参与`/`运算时,两个操作数都是整数时,表示整除法;否则表示浮点除法。
  3. 整数的求余操作(取模)用`%`表示。例如:15/2=715%2=115.0/2=7.5
  4. 值得注意,**整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN的结果**。
算数运算符 说明
* 乘×
/ 除÷
% 取余数

2.1 数学函数与常量

  1. Math类中,包含了各种各样的数学函数,在编写不同类别的程序时,可能需要的函数也不同。

想计算一个数值的平方根,可以使用sqrt方法:

输出为:2.0

  1. double x = 4;
  2. double y = Math.sqrt(x);
  3. System.out.println(y);
  1. Java中,没有幂运算,因此需要借助于Math类的pow方法:
  1. double y = Math.pow(x, a);
  1. y的值设为xa次幂(![](https://g.yuque.com/gr/latex?x%5Ea#card=math&code=x%5Ea&id=JZ2vH))。
  2. pow方法有两个double类型的参数,其返回结果也为double类型。
  • Math类还提供了常用的三角函数:
    • Math.sin;
    • Math.cos;
    • Math.tan;
    • Math.atan;
    • Math.atan2;
  • 指数函数以及它的反函数,自然对数以及10为底的对数:
    • Math.exp;
    • Math.log;
    • Math.log10;
  • 两个用于表示2. 初始Java语言基础 - 图2常量的近似值:
    • Math.PI
    • Math.E
  1. 如果不想再数学方法名和常量名前添加前缀"Math",只需要在源文件的顶部添加代码:
  1. import static java.lang.Math.*;

2.2 结合赋值和运算符

  1. 可以在赋值中使用二元运算符,这是一种便捷的简写形式:
  1. x += 4;
  2. //等价于
  3. x = x + 4;

(一般地,将运算符放在=号的左边,如*=或%=)

2.3 自增与自减运算符

  1. 自增、自减运算符:n++将变量n的当前值加1n--将n的值减1
  1. int n = 12;
  2. n++; //自增后,n=13
  1. 这些运算符只会改变变量的值,它们的操作数不能是数值。例如:4++是个非法语句。
  2. 自增与自减运算符还有一种“前缀”形式:++n,--n;后缀和前缀形式都会使变量值加1或减1。在表达式中,**前缀形式会先完成加1,而后缀形式会先使用变量原来的值**。
  1. int m = 7;
  2. int n = 7;
  3. int a = 2 * ++m; // a=16,m=8
  4. int b = 2 * n--; // b=14,n=8

2.4 关系和boolean运算符

  • 要检测相等性可以使用两个等号==:
  1. 3 == 7 //返回false
  • 检测不相等就使用!=:
  1. 3 != 7 //返回true
  • 经常使用的运算符还有:<小于,>大于,<=小于等于,>=大于等于;
  • 感叹号!就是逻辑运算符,运算符&&表示逻辑“与“运算符,运算符||表示逻辑”或“运算符;
  1. expression1 && expression2
  1. expression1expression2计算返回的结果都为true时,整个表达式才会返回true
  2. expression1expression2计算返回的结果其中一个为false时,整个表达式返回的结果为false
  1. expression1 || expression2
  1. expression1返回true则不计算expression2,将整个表达式的结果返回true
  2. expression1返回false,计算expression2返回true,整个表达式结果也将会返回true
  3. expression1expression2的返回结果都是false,那整个表达式结果也将返回false
  • 三目运算符x?y:z,当x返回结果为true时就返回y,当x返回结果为false时就返回z。
  1. x < y ? x : y

将会返回x和y中较小的一个。

2.5 位运算符

  1. 处理整数类型时,可以直接对组成整型数值的各个位完成操作。位运算符包括:&("and")、|("or")、^("xor")、~("not")。另外还有>>和<<运算符将位模型左移或右移。

2.6 括号与运算符级别

运算符优先级:

结合性 运算符
从左往右 ()括号
从右往左 ! ~ ++ — + 一元运算 - 一元运算 ()强制类型转换 new
从左往右 * / %
从左往右 + -
从左往右 << >> >>>
从左往右 < <= > >=
从左往右 == !=
从左往右 &
从左往右 ^
从左往右 |
从左往右 &&
从左往右 ||
从右往左 ?:
从右往左 = += -= *= /= %= &= |= ^= <<= >>= >>>=
  1. 若不适用括号,就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算(除了表中给出的右结合运算符外)。

参考资料

[1] 《Java核心技术 卷I 基础知识》 ———【美】凯S. 霍斯特曼