第二章 Java的基础数据类型
2.1基本数据类型
Java的基础数据类型(Primitive Data Types)包括以下几种:
-
整数类型:
-
byte:1个字节,范围为-128到127。
-
short:2个字节,范围为-32,768到32,767。
-
int:4个字节,范围为-2,147,483,648到2,147,483,647。
-
long:8个字节,范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
-
-
浮点数类型:
-
float:4个字节,范围为1.4E-45到3.4028235E+38,带有6到7位有效数字。
-
double:8个字节,范围为4.9E-324到1.7976931348623157E+308,带有15位有效数字。
-
-
字符类型:
-
char:2个字节,表示Unicode字符,范围为0到65535。
-
-
布尔类型:
-
boolean:表示布尔值,只有两个取值:true和false。
-
这些基础数据类型用于存储数据,每种类型都有固定的大小和表示范围。
注意:Java还有一种特殊的基础数据类型是void,它表示没有值的特殊类型,通常用于方法返回类型或标识方法不返回任何值。
除了基础数据类型,Java还提供了包装类(Wrapper Classes),用于将基础数据类型封装成对象,以便于在面向对象的环境中操作。例如,int对应的包装类是Integer,boolean对应的包装类是Boolean,等等。
尽管Java提供了包装类,但直接使用基础数据类型更高效,而包装类通常用于特定的需求或与集合框架等一起使用。
(1)常量
常量是指在程序运行过程中值不能改变的量
(2)变量
变量是指在程序运行过程中可以改变的量。定义变量的目的是为了在程序运行期间存储数据。定义变量的本质是向JVM申请内存空间,以临时存储数据。定义变量的格式如下
当在Java中定义变量时,可以使用以下格式:
访问修饰符 数据类型 变量名 = 初始化值;
其中:
-
访问修饰符(Access Modifier)是可选项,用于控制变量的访问范围。常见的访问修饰符有:public、private、protected,默认为包内可见(package-private)。
-
数据类型(Data Type)表示变量的类型,可以是基本数据类型(如int、double等)或引用数据类型(如String、自定义的类等)。
-
变量名(Variable Name)是给变量起的标识符,遵循命名规则,具有描述性,以便代码可读性。
-
初始化值(Initial Value)是可选项,表示变量的初始值。可以在定义变量时指定初始值,也可以之后通过赋值语句给变量赋值。
例如,定义一个私有的整数类型变量age并初始化为20:
private int age = 20;
定义一个公共的字符串类型变量name并初始化为"John":
public String name = "John";
对于未初始化的变量,可以只声明变量,不进行赋值:
int count;
需要注意的是,未初始化的局部变量在使用之前必须先进行赋值,否则编译器会报错。
此外,还有一些特殊情况,例如在类中定义常量时,使用final
关键字来声明常量并赋予初始值。常量在声明时必须初始化,并且后续不可更改。
public static final int MAX_COUNT = 100;
2.1.1引用数据类型
引用数据类型包括类,接口,数组,枚举。字符串属于引用数据类型。下面是一个简单的例子
public static void main(String[] args) { String name = "张三" ; int age = 50; String school = "ABC"; System.out.println("***********信息表************"); System.out.println("姓名:" + name); System.out.println("年龄:" + age); System.out.println("***********信息表************"); }
运行结果如下
2.2基本数据类型的转换
不同的基本数据类型之间进行运算时需要进行类型的转换。除了boolean类型以外,所有的基本数据类型进行运算时都需要考虑数据类型转换问题,主要是在算数运算时和赋值运算时。
(1)算数运算时
在不同类型的操作数,首先自动转换为表达式中更加高级别的数据类型,然后进行计算,运算的结果是最高级别的数据类型,简称为低级别向高级别自动转换。
(2)赋值运算时
数据类型的转换有自动类型转换和强制类型转换
自动类型转换是指当把一个表达式赋给一个类型范围更大的变量时,Java会自动进行类型转换。这个过程是隐式的,不需要我们明确地声明。自动类型转换是安全的,因为较小的数据类型可以容纳较大的数据类型的值。
int numInt = 10; double numDouble = numInt; // 自动将int类型转换为double类型
强制类型转换是指当我们需要把一个范围更大的数据类型赋给一个范围更小的数据类型时,需要使用强制类型转换。强制类型转换是显式的,需要在代码中明确地进行标记,并且可能会导致数据的溢出或精度丢失。
double numDouble = 3.14; int numInt = (int) numDouble; // 强制将double类型转换为int类型
3表达式
3.1Scanner类介绍
Scanner类是Java.util包中的一个类,用于从控制台或其他输入流(如文件)中获取用户的输入。它提供了一种简单方便的方法来读取不同类型的输入数据。
要使用Scanner类,需要先创建Scanner对象,然后使用它的方法来读取输入数据。下面介绍一些Scanner类的常用方法:
-
构造方法:
-
Scanner(System.in)
: 从标准输入(键盘)读取输入数据。 -
Scanner(File file)
: 从文件读取输入数据。 -
Scanner(String source)
: 从字符串读取输入数据。
-
-
读取不同类型的输入数据:
-
nextInt()
: 读取下一个整数。 -
nextDouble()
: 读取下一个双精度浮点数。 -
nextLine()
: 读取下一行文本。 -
next()
: 读取下一个单词(以空格分隔)。 -
nextBoolean()
: 读取下一个布尔值(true或false)。
-
示例代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入您的姓名:"); String name = scanner.nextLine(); System.out.println("您的姓名是:" + name); System.out.print("请输入您的年龄:"); int age = scanner.nextInt(); System.out.println("您的年龄是:" + age); System.out.print("请输入您的体重:"); double weight = scanner.nextDouble(); System.out.println("您的体重是:" + weight); scanner.close(); } }
在上面的示例中,我们先创建了一个Scanner对象并传入System.in,以便从标准输入中读取数据。然后使用不同的方法来读取用户输入的姓名、年龄和体重,并将它们输出到控制台。
需要注意的是,在读取完数据后,应该调用scanner.close()
来关闭Scanner对象,以释放资源。
3.2常用运算符
在Java中,有许多常用的运算符,用于执行各种操作。下面是一些常用的运算符的介绍:
-
算术运算符:
-
+
:相加 -
-
:相减 -
*
:相乘 -
/
:相除 -
%
:取余
-
-
赋值运算符:
-
=
:将右侧的值赋给左侧的变量 -
+=
:加后赋值,相当于a = a + b
的简化形式(适用于其他算术运算符) -
-=
:减后赋值,相当于a = a - b
的简化形式 -
*=
:乘后赋值,相当于a = a * b
的简化形式 -
/=
:除后赋值,相当于a = a / b
的简化形式 -
%=
:取余后赋值,相当于a = a % b
的简化形式
-
-
比较运算符:
-
==
:检查相等性 -
!=
:检查不相等性 -
>
:大于 -
<
:小于 -
>=
:大于等于 -
<=
:小于等于
-
-
逻辑运算符:
-
&&
:逻辑与(并且) -
||
:逻辑或(或者) -
!
:逻辑非(取反)
-
-
位运算符:
-
&
:按位与 -
|
:按位或 -
^
:按位异或 -
~
:按位取反 -
<<
:左移 -
>>
:右移 -
>>>
:无符号右移
-
-
三元运算符:
-
条件 ? 表达式1 : 表达式2
:根据条件的结果选择表达式1或表达式2进行求值
-
int num = 5; String result = (num % 2 != 0) ? "奇数" : "偶数"; System.out.println(result);
当进行三元运算时:结果为true将执行表达式 1 在这里是“奇数”而判断结果为false时将执行表达式2在这里为“偶数”
7.位运算符:
位运算符是一类在计算机中进行二进制位级操作的运算符。它们直接作用于整数的二进制表示形式,并对位进行操作。在许多情况下,位运算符提供了一种高效且紧凑的方式来执行特定的数值操作。
下面是一些常用的位运算符及其用途:
-
与运算(&):将两个操作数的对应位进行逻辑与运算,对于每一位都是1的情况,结果为1,否则为0。常用于清除特定位的值、判断某些特定位是否同时满足等操作。
-
或运算(|):将两个操作数的对应位进行逻辑或运算,对于任意一位存在1的情况,结果为1,否则为0。常用于设置特定位的值、合并或添加标志等操作。
-
异或运算(^):将两个操作数的对应位进行逻辑异或运算,对于不同位为1的情况,结果为1,否则为0。常用于交换变量值、判断奇偶性等操作。
-
非运算(~):对操作数的每一位进行取反操作,即0变为1,1变为0。常用于取反某些特定位的值。
-
左移运算(<<):将操作数的所有位向左移动指定的位数,右侧补0。左移n位相当于乘以2的n次方。常用于进行数值的乘法运算。
-
右移运算(>>):将操作数的所有位向右移动指定的位数,左侧用符号位的值(正数用0,负数用1)填充。右移n位相当于除以2的n次方。常用于进行数值的除法运算。
-
无符号右移运算(>>>):将操作数的所有位向右移动指定的位数,左侧补0。对于正数,无符号右移与右移结果相同;对于负数,无符号右移得到的是按位取反再右移的结果。常用于无符号数值的位运算。
通过使用位运算符,可以高效地执行位级操作,如按位掩码、位值交换、位集操作等。然而,需要谨慎使用位运算符,因为它们对原始数据进行直接操作,可能导致意外的结果或难以理解的代码。正确理解位运算符的行为和使用场景是编写高效而且正确的程序的关键。