Java入门--变量与数据类型
1、变量与常量
变量:会根据不同环境产生不同值的数据。
常量:不会根据环境而改变的数据。
变量
定义变量:变量类型 空格 变量名 = 变量值。
例如,定义一个整数(int),它(number1)的值为1:
int number1 = 1;
假如李华家养了一只猫,他给猫起了一个名字叫Neco,而且这个猫的类型是英国短毛猫。
那么用Java定义变量的思维来看,我们可以这样描述:
英国短毛 Neco = 李华的这只猫;
英国短毛是数据类型,Neco是变量名,变量值:李华的这一只猫。
李华的这只猫不是独一无二的吗?为什么能算变量呢?
并不是,变量是Neco,而不是李华的这只猫,假如李华的这只猫送给了自己的好朋友(某英语考试学生),然后自己又养了一只英短,起名也可以是Neco,这样Neco这个变量就从之前的猫变为了现在的猫。
也就是说,变量的值是可以改变的。
在Java中,变量类型有很多种,在之前的关键字中就有不少,同时也有其他封装的数据类型。
例如数值类:短整型(short),整型(int),长整型(long),单精度浮点数(float),双精度浮点数(double)。
非数值类:字符型(char),字符串(String),布尔型(boolean)。
变量的命名规则和标识符一致,由字母、数字、下划线和美元符号,不能使用数字开头,同时对大小写敏感。
接下来让我们定义一个变量,Donald Trump的选举人票数。
票数是一个整数,因此我们可以使用整型(int)这个数据类型,在2024年美国大选时,川普获得了312张选举人票,用Java表示为:
public class UnitedStatesPresidentialElection{
public static void main(String[] args){
int votes = 312;//定义川普得票的数量
System.out.println(votes);//打印输出川普的得票数
}
}
编译运行之后,结果会输出312。
然而我们只打印了票数,但没说得票的人是谁,接下来让我们定义另一个变量,用来描述得票的人是川普。
川普的名字是Donald Trump,是一串字符,我们需要用到非数值类型的字符串(String):
public class UnitedStatesPresidentialElection{
public static void main(String[] args){
int votes = 312;//定义川普得票的数量
//System.out.println(votes);//打印输出川普的得票数
String candidate_name = "Donald Trump";
//打印“Donald Trump获得的选举人票数是:312”
System.out.println(candidate_name + "获得的选举人票数是:" + votes);
}
}
在上述代码中,我们成功定义了川普的名字和他获得的票数并且打印。
接下来是要点:
1、使用//注释可以取消一行代码的运行,我们取消了之前对于votes的输出。
2、在定义字符串时,变量的值需要用 "我是双引号" 将值包住,如果不这样做,编译器会认为Donald Trump是变量名,然而我们并没有定义这个变量,而且变量名不能带空格。
3、不能使用字符型(char),字符型只能定义为一个字母、数字等,而川普同学的名字有足足11个字母和1个空格,总共12个字符,字符型(char)装不下,所以我们选择使用字符串(String),故名思意,一串字符。
4、对于System.out.println(),他用于将括号内部的内容输出,在括号中,从左至右先输出candidate_name,然后输出字符串"获得的选举人票数是:",最后输出votes。这几个数据的输出需要使用加号:+来连接,不能直接:candidate_name"获得的选举人票数是:"votes,因为编译器不认识这一串字符。
变量是可以改变值的,我们不仅可以输出川普的得票,同样可以输出他的对手哈里斯的票数:
public class UnitedStatesPresidentialElection{
public static void main(String[] args){
int votes = 312;//定义川普得票的数量
//System.out.println(votes);//打印输出川普的得票数
String candidate_name = "Donald Trump";
//打印“Donald Trump获得的选举人票数是:312”
System.out.println(candidate_name + "获得的选举人票数是:" + votes);
candidate_name = "Kamala Harris";
votes = 226;
System.out.println(candidate_name + "获得的选举人票数是:" + votes);
}
}
这样我们就对变量做了更改,candidate不再表示川普,而是表示哈里斯,votes不再表示312,而是226。两次的输出结果是不同的:
Donald Trump获得的选举人票数是:312
Kamala Harris获得的选举人票数是:226
常量
定义常量:const 常量类型 常量名 = 常量值
其实,在定义变量的前方加上关键字const,变量就被固定为常量。
常量在定义后不能被代码修改,并不代表现实生活中亘古不变的东西才能定义为常量。
例如500毫升塑料瓶装可口可乐的价格为3元,并且很长时间不会被更改价格,为了避免误操作和程序员的不小心,在之后的代码将价格错误更改。我们可以使用const来固定它的值:
public class ILikeCola{
public static void main(String[] args){
const int cocaColaPrice = 3;
}
}
让我们尝试更改这个价格:
public class ILikeCola{
public static void main(String[] args){
const int cocaColaPrice = 3;
cocaColaPrice = 30;//报错
}
}
如果是在Visual Studio Code等代码编辑器中,编辑器会直接提示这是无法修改的左值,并且编译运行会失败,如果使用命令javac ILikeCola.java也会编译失败。
可乐30元一瓶我的美好日子就要到头了......
Java数据类型
Java中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。
实际上,Java中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
8 种类型表示范围如下:
1、byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
2、short:16位,最大数据存储量是65536,数据范围是-32768 ~ 32767之间。
3、int:32位,最大数据存储容量是\(2^{32}-1\),数据范围是\(-2^{31}\sim2^{31}-1\)。
4、long:64位,最大数据存储容量是\(2^{64}-1\),数据范围为\(-2^{63}\sim2^{63}-1\)。
5、float:32位,数据范围在\(3.4\times 10^{-45}\sim 1.4\times 10^{38}\),直接赋值时必须在数字后加上f或F。
6、double:64位,数据范围在\(4.9\times 10^{-324}\sim 1.8\times 10^{308}\),赋值时可以加d或D也可以不加。
7、boolean:只有true和false两个取值。
8、char:16位,存储Unicode码,用单引号赋值。
以上随便看看即可,记住这八个基本类型。我们在上面已经学过定义变量,试着定义一遍这8个基本类型。
public class Define{
public static void main(String[] args){
byte b = 127;
short s = 32767;
int i = 2147483647;
long l = 9879678567564l;//长整型数据后加上l
float f = 1.23f;//单精度浮点型后加f
double d = 1.23;
boolean bool = true;
char c = '猫';//使用单引号
}
}
Java类型转换
不同数据类型之间可以相互转换,有两种方法,自动类型转换和强制类型转换。
自动类型转换
如图,自动转换可以按照这个箭头方向转换。
例如:
public class AutoChange{
public static void main(String[] args){
short s = 12;
int i = s;
}
}
这样就完成了short向int的转换。
但以下转换是错误的:
public class AutoChange{
public static void main(String[] args){
long l = 122357612347l;
int i = l;
}
}
查看之前的数据类型范围可以得知,范围较小的数据类型可以转向范围较大的数据类型,反之不行,数据会因为溢出而丢失和错误。
小水杯的水能倒入大水桶,大水桶的水倒入小水杯会溢出。
你可以无限投喂八见奈杏菜,但是不能无限投喂温水和彦。
强制类型转换
诶~↗,你要是非要转也不是不行,只要你不介意有水溢出,也不介意把温水撑死。
在要强制转换的数据前方添加括号:(),在括号中写上你想要转换到的类型,这里从long强制转换为int:
public class ForceChange{
public static void main(String[] args){
long l = 122357612347l;
int i = (int)l;
}
}
数据输入(Scanner)
我们每次使用的数据不一定由自己提供,有时候需要程序的用户灵活输入,我们如何从键盘读取输入呢?
Scanner,作为一个扫描仪,它可以帮助读取键盘输入的数据。
让我们尝试写一个Scanner:
import java.util.Scanner;
public class useScanner{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String FGOCharacter = input.nextLine();
System.out.println(FGOCharacter);
}
}
编译运行程序后,会进行键盘的读取,我们直接输入数据:
妖精騎士ランスロット
运行输出结果:
妖精騎士ランスロット
要点:
1、引入Scanner,它包含在java.util.Scanner中,需要引入再使用。
2、和定义别的数据类型相似,Scanner是数据类型,input是变量名,不过它的值是一个对象,通过关键字new来创建一个Scanner对象,这个对象通过System.in来初始化,并且被命名为input。
3、使用Scanner封装的成员函数,比如:nextLine(),这个函数用来读取接下来的一行数据,直到读入换行符,我们在输入妖精騎士ランスロット之后按下回车(Enter),便会结束读取,将读取内容放入字符串FGOCharacter中,最终输出结果。
4、不同的数据类型使用的成员函数是不一样的,int类型的变量使用nextInt(),double类型的变量使用nextDouble(),等等。
这里是int类型和double类型读取的例子:
import java.util.Scanner;
public class useScanner{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int Goldenglow_age = input.nextInt();
double her_cash_remains = input.nextDouble();
System.out.println("Magic_cat's age:" + Goldenglow_age);
System.out.println("Magic_cat's bank balance:" + her_cash_remains);
}
}
输入:
25 1.7
输出:
Magic_cat's age:25
Magic_cat's bank balance:1.7
5、拓展一个输入会出现的问题,在使用nextInt()等成员函数后立即调用nextLine()读取输入,会导致nextLine()看起来读取为空,无法将正确的数值放入String中。
解析原因:
nextInt()这类成员函数只读取下一个数据,当读到空格或者换行符时停止读取,但并不会读入空格和换行符,不会消费换行符。
nextLine()会读取到换行符停止读取,但读取到空格不会停止,一整行的内容都会被读入。
当调用nextInt()后,会在输入流中留下没被消费的换行符,立即使用nextLine(),会立即读取到没被消费的换行符,然后结束读取,这便导致了读入空数据,实际上也不为空,读取到了换行符。
解决办法:
在调用nextLine()之前添加一个额外的nextLine()来消费掉残留的换行符。
例如:
import java.util.Scanner;
public class useScanner{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int Goldenglow_age = input.nextInt();
input.nextLine();//消耗换行符
Sting Goldenglow_RealName = input.nextLine();
System.out.println("Magic_cat's age:" + Goldenglow_age);
System.out.println("Magic_cat's real name:" + Goldenglow_RealName);
}
}
输入:
25
Susie Grit
输出:
Magic_cat's age:25
Magic_cat's real name:Susie Grit

浙公网安备 33010602011771号