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类型转换

不同数据类型之间可以相互转换,有两种方法,自动类型转换强制类型转换

自动类型转换

graph LR A[byte]-->B[short] B[short]-->D[int] C[char]-->D[int] D[int]-->E[long] E[long]-->F[float] F[float]-->G[double]

如图,自动转换可以按照这个箭头方向转换。
例如:

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

posted @ 2024-11-21 15:47  VellyKiey  阅读(41)  评论(0)    收藏  举报