Java基础语法 - Java数据类型
Posted Ju_19t.W-cheri.G
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础语法 - Java数据类型相关的知识,希望对你有一定的参考价值。
数据类型
🍎前言
哈喽大家好,我是Aaron,每一种不同的计算机语言,都会有一定标准的对数据类型的规范,Java也不例外,文本内容将详细介绍有关Java中常见的数据类型。
Java是强类型语言,所以本文将会以和弱类型语言的C语言做对比的形式阐述Java的魅力。
所有的数据类型,都是围绕着变量来阐述的,没有变量,谈论数据类型则是没有意义的,接下来我们先介绍变量的概念。
🍦变量
在计算机语言中,存在常量和变量的概念。
🐱🚀常量
在Java中,常量分为两种:
- 字面常量。
也就是我们平常说的数字或者字符/字符串常量。
一般的字面常量有:
数值 | 类型 |
---|---|
024 | int 型常量(10进制) |
024 | int 型常量(8进制) |
0x5f | int型常量(16进制) |
32L | long型常量 |
3.14f | float型常量 |
5.18lf | double型常量 |
1.2e3 | double型指数常量,表示1.2✖103 |
‘a’ | char类型字符常量 |
“abcx” | 字符串常量 |
true | boolean类型字面值常量 |
- final修饰的常变量。
这里可以类比为C语言中const修饰的常变量,本质是个变量,但只能被初始化一次,初始化之后其值不能再被修改。
如:
final int A = 10;
A = 20; // 报错,因为final修饰的变量不可被改变,它具有了常属性
常量是存放在常量区的,但以上两种不同常量也存在区别:
- 字面常量:
在编译时,字面常量会被翻译成字节码存放在字节码文件(.class文件)中。
- final修饰常量
会在堆栈中创建栈帧,为其分配空间,但也是在编译时就确定其值。
(注:变量是在运行时计算,确认其值)
🚲变量
变量分为:
- 局部变量。
- 成员变量。
而成员变量分为:
- 普通成员变量。
普通成员变量的定义介于类和方法之间,例:
public class DataType {
int a = 10;
public static void main(String[] args) {
}
}
这里的变量a就是普通成员变量。
- 静态成员变量。
静态成员变量就是用static修饰的变量,例如。
static int a = 0;
🌳生命周期及作用域
在Java中,同样存在变量的生命周期及作用域,这两个概念和C语言中相似,这里便不过多介绍,只需要注意变量的作用域在代码块( { } )内即可。
如:
public class DataType {
// int a = 10;
public static void main(String[] args) {
int a = 10;
{
a = 20;
}
{
int b = 10;
}
b = 20;
}
}
这里变量a的定义和赋值没有任何问题,但变量b就会报错,因为对b进行赋值的时候,他已经出了所处的代码块( { } )内,该变量已被销毁。
🚆变量的命名规则
变量的命名规则有两个指标:
- 硬性指标
- 变量名只能由字母,数字,下划线,美元符号($)组成。
- 变量名不能以数字开头。
- 变量名需要区分大小写,如NUM和num不是同一个变量。
- 软性指标
- 变量名需要有描述性,即见名知意。
- 变量名不要使用汉语拼音~
- 变量名推荐小驼峰命名法。
- 变量名推荐使用名词词性进行命名。
变量的命名和类的命名需要加以区别,类的命名我们习惯上使用大驼峰命名,比如本文中博主代码中常见的:
public class DataType {
}
这里的DataType采用的就是大驼峰命名法,所有的英文单词首字母都要大写。
而变量的命名则需要采用小驼峰命名法。
小驼峰命名:
- 第一个单词首字母小写,其他单词首字母大写。
- 所有字母全小写,单词之间用下划线分割。
如:
int numDigit = 0;
或者:
int num_digit = 0;
在习惯上:final修饰的常量名用大写字母表示,变量名用小写字母表示
🤳数据类型
Java提供了各种丰富的数据类型,以便不同变量可更加有效地存放数据。
数据类型又分为两大块:
- 基本数据类型。
- 引用类型。
但引用类型涉及面不同,例如数组,字符串,接口等等,每一个博主都可以专门出一篇文章详细介绍,所以这里就不过多赘述,本文只将基本数据类型详细介绍即可。
🥪基本数据类型。
数据类型如下:
数据类型 | 所占空间大小 |
---|---|
boolean | 1bit/1byte(由编译器决定,Java未给出标准大小) |
byte | 1byte |
char | 2byte(C语言中是一个字节) |
short | 2byte |
int | 4byte |
float | 4byte |
long | 8byte |
double | 8byte |
接下来逐一介绍。
布尔数据类型(boolean)
在Java中有布尔类型,其返回值只能是true/false,并且因为Java是强类型语言,所以和C语言不同,不存在0表示假,非0表示真这种说法。
所以下面这种写法就是坚决错误的。
public class DataType {
public static void main(String[] args) {
while (1) //错误写法
{
System.out.println(1);
}
}
}
这种写法编译器会给报错。
报错信息显示:int无法转换为boolean类型,是因为while循环的判断表达式必须是布尔类型的表达式,而布尔表达式的返回值只能是true/false,而不能是1。
就像上面说的,不仅仅是while循环,类似的,if语句的判断表达式也只能是布尔表达式。
并且,boolean类型是无法与其他类型之间相互转换的,不论是强制类型转换还是自动转换,都无法做到!
字节数据类型(byte)
在Java中新增了一个byte类型,其大小为1个字节,可以存放-128~127之间及其所对Unicode码字符的数据。
如果所存放的数据超过其范围,将会发生报错,如:
public class DataType {
public static void main(String[] args) {
byte a = 128;
System.out.println(a);
}
}
因为编译器认为128超过了byte的取值范围,所以认为他是int类型的数据,而Java是强类型语言,就直接报错了,如果是C语言这样的弱类型语言可能只会给个警告哦~
注意:
很多初学者会将字节类型和字符类型混为一谈,他们二者没有任何联系哦~只是简单的将一个字节大小内的数据类型叫做字节类型而已 ~ ~
字符数据类型(char)
在Java中的字符数据类型区别于C语言中的字符类型,在C语言中的字符类型只占1个字节,类似于Java中的字节类型,但在Java中的字符类型被扩展为-256~255,也就是**占两个字节
**。
并且Java中是支持中文的,例如:
char a = '张';
中文占空间大小为两个字节,当然,我们自己写代码的时候除非特殊需要的情况,尽量避免这样赋值。
加一个题外话,在Java中,甚至可以将中文作为变量名!!!
如:
public class DataType {
public static void main(String[] args) {
int 张 = 3;
System.out.println(张);
}
}
运行结果为:
当然了,我们是坚决抵制这种"别扭"的编码风格的,还有很多Java书写格式,都在阿里巴巴Java开发手册(嵩山版)中,有兴趣的小伙伴可以去看一看,该书目前没有纸质版,只有电子书,如果找不到资源可以私聊博主拿书~
回归正题,char类型赋值的数字将会被转换为字符,我们在学习C语言的时候知道,是按照ASCII码对应,但Java中不是ASCII码,而是将其进行扩展,扩展到255个数字对应字符,称为,Unicode码。
短整型数据类型(short)
短整型数据类型同样也是占2个字节,其存取范围为:-32768~32767,但这个数据类型并不常用,其范围较小,可能造成越界等等问题,所以一般情况下我们选择使用int数据类型。
简单举个小例子演示一下短整型的用法。
public class DataType {
public static void main(String[] args) {
short a = 10;
System.out.println(a);
}
}
整形数据类型(int)
int型数据类型,也就是整型数据类型,是我们写代码中最常见的一种数据类型。
但在这里需要着重讲一下,到底什么叫做Java是强类型语言。
我们知道,在C语言中,某些编译器底下会认为,32位平台机器下的int类型是占两个字节的,而64位平台机器下int类型是占4个字节的。
而Java作为强类型语言,就不存在这种模棱两可的情况,不管是在多少位的平台下,int类型永远都是4个字节。
而4个字节的范围是:-231 -> 231-1,也就是大概 -21亿~21亿。
这个范围足够大,所以我们定义整型变量时大多使用int类型。
如果有小伙伴不放心博主说的范围,可以通过代码的方式在编译器下确认:
System.out.println(Integer.MAX_VALUE); //int类型的最大值
System.out.println(Integer.MIN_VALUE); //int类型的最小值
这两行代码可以分别打印出int类型的最大值和最小值。
这里的Integer是int类型的包装类,所有的基本数据类型都有自己的包装类,在包装类中存在很多属于他们自己的一些方法,可以通过上面代码的形式进行调用。
单精度浮点型数据类型(float)
单精度浮点型变量 - float
占4个字节大小,具体数值范围可参考int类型数据变量。
基本用法:
public class DataType {
public static void main(String[] args) {
float f = 4.5f;
System.out.println(f);
}
}
这里要注意,4.5后面需要跟一个f,因为编译器会默认4.5属于双精度类型(double),而4.5f表示我明确规定这个数是属于单精度浮点型的。
如果不加上这个f,编译器则会直接报错,因为认为我们将一个双精度数据存放进一个单精度变量中,这是非法的~
示例:
public class DataType {
public static void main(String[] args) {
float f = 4.5;
System.out.println(f);
}
}
报错结果:
这里提示我们将double类型转换位float类型,属于非法操作~如果是C语言,则只会提出警告,但Java是强类型语言,所以编译器会直接报错 ~ ~
单精度浮点型数据的存取规则符合IEEE标准,详细可以看博主之前的博文:【数据类型存储原理】数据的存储 - 深度剖析数据在内存中的存储
在本文中博主详细整理了数据存储的有关知识。
长整型数据类型(long)
在生活中,总存在一些我们希望特别大的数值,比如薪水哈哈哈哈,那当然是多多益善,那如果这个值太大,超过了int类型怎么办?
所以Java中还有一种数据类型叫做长整型数据类型,所占空间大小位8个字节,这里需要再次强调,Java是强类型语言,所以不存在32位机器long类型占4个字节,64位机器占8个字节的说法,不论在多少位平台机器下,long类型数据永远都是占8个字节。
long类型用法:
public class DataType {
public static void main(String[] args) {
long a = 10L;
System.out.println(a);
}
}
这里的L并不是跟上文中的float类型中的f一样非加不可的,可以省略,但最好还是加上,以示区分~~
那么在Java的long类型下,我们的薪水上限到底是多少呢~
下面通过编译器帮我们计算一下。
public class DataType {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
}
}
我们可以看到这个数字大概也就是是9百多万万亿,估计是够我们用的了~~
双精度浮点型数据类型(double)
double类型同样是不论在多少位的平台下,都是8个字节,这里展示一下8个字节的大小~
public class DataType {
public static void main(String[] args) {
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
}
}
这里介绍两个初学者难以理解的代码:
- 代码一:
public class DataType {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a/b);
double c = 1.0;
double d = 2.0;
System.out.println(c/d);
}
}
运行结果:
可以看到,第一个结果是0,那么它为什么不是0.5呢?
原因是用int类型进行计算,得到的结果也只能是int类型的,所以小数点后面的位直接被舍去了~(不是四舍五入哦 ~)
- 代码二:
public class DataType {
public static void main(String[] args) {
double n = 1.1;
System.out.println(n*n);
}
}
运行结果:
可以看到,运行结果最后出现了个2,这并不是我们预期的结果,是这个程序出bug了嘛?
答案是否定的,因为Java规定了双精度浮点型只能精确到小数点后15位,所以小数点后15位之后的数据,并不能保证其准确性。
以上就是有关于Java当中8中基本数据类型的详解~
如果有什么问题欢迎评论区留言或者私聊博主嗷~~
💕字符串类型。
我们知道在C语言中是没有字符串类型的,但在Java中有,它不属于8大基本数据类型之一,其实它是属于引用类型(存储地址的类型被称为引用类型)。
其实我们在main函数中就可以看的出来。
public static void main(String[] args) {
}
main函数的参数中就有一个字符串类型的字符数组,其数组名位args,这里可以看到,Java中对数组的命名习惯和C语言不同。
C语言中习惯先写数组名,后写中括号,而Java中正好相反,先写中括号,再写数组名。
数组相关的知识博主将会在本专栏后期给大家专门出一期博文分享~
🔨转义字符
在Java中常用到的转义字符不多,列出以下几个:
转义字符 | 释义 |
---|---|
\\n | 换行 |
\\t | 制表符 |
’ | 将其转义为普通的字符单引号 |
" | 将其转义为普通的字符双引号 |
\\ | 将其转义为普通的字符斜杠 |
转移字符只需记住其用法即可。
给出以下几个例子:
- 打印出:‘hello’
- 打印出:"“hello”"
- 打印出:“hello”
public class DataType {
public static void main(String[] args) {
System.out.println("\\'hello\\'");
System.out.println("\\"\\"hello\\"\\"");
System.out.println("\\\\\\"hello\\\\\\"");
}
}
运行结果:
🍚类型转换
Java中的类型转换分为两种:
- 算数类型转换(又被称为数值提升)
- 强制类型转换
在了解这两种类型转换之前,应该先明白为什么要有类型转换。
🤢为什么要有类型转换
我们知道,Java是一门强类型的语言,所以绝不允许在数据类型上出现差池。
例如:
int a = 3;
float f = 3.14;
a = f; // 将单精度浮点型数据存放进整型变量a中
这种做法在Java当中是绝对不会允许的,但有的时候我们又不得不将某一些数据存放到不同的数据类型中,于是就出现了类型转换的概念。
总结一下: 出现数据类型转换的原因是为了防止将高精度数据存放进低精度变量时发生精度丢失,而如果将低精度的数据存放进高精度变量中则可以正常运行。
如:
public class DataType {
public static void main(String[] args) {
int i = 3;
long l = 0;
l = i;
System.out.println(l);
}
}
这里并没有发生报错,可见,出现类型转换的原因就是为了防止高精度数据存储进低精度变量时发生精度丢失。
🦝算数类型转换(数值提升)
算数类型转换,顾名思义,就是在计算中自动进行的类型转换,比如:
public class DataType {
public static void main(String[] args) {
int a = 10;
double d = 3.14;
System.out.println(a + d);
}
}
这就是算数类型转换。
进行算数类型转换的原因其实是为了提高运算效率,一般都是低精度类型转为高精度类型,整型数据转为浮点型数据类型。
🥛强制类型转换
强制类型转换是指我们将某一些不属于这个数据类型的数据,强行转换为该类型的数据,然后进行存储。
比如:
int a = (int)3.14;
但是注意,强制类型转换虽然好用,但它会造成一定程度上的精度丢失,比如这里的变量a,它其实存储的只是3,小数点后面的数据将会发生截断丢失。
public class DataType {
public static void main(String[] args) {
int a = (int)3.14;
System.out.println(a);
}
}
但是注意一点,布尔类型(boolean)是不能和其他类型进行计算的,哪怕经过强制转换也不可以,因为布尔类型属于逻辑的真假,而其他类型属于算数运算,怎么能把逻辑针灸啊和算数运算放在一起计算呢?
而且对于逻辑真假自己本身来说,也是无法进行计算的,
比如:
public class DataType {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
System.out.println(a+b);
}
}
运行结果:
这里给出报错,说+这个操作符的操作数不对,因为+属于算数操作符,只能对算数类型的数据进行运算,而布尔类型只能通过逻辑运算符进行计算,其结果仍然是逻辑真和逻辑假。
本文并不是主要将运算符的文章,博主预计过两天在本专栏内补上运算符的文章,有需要的小伙伴可以关注一波该专栏哦~专栏更新新文不错过 ~
🏆整型和字符串类型之间的小故事
整型和字符串类型其实是两个八竿子打不到一块儿去的两个不同的类型,但他们之中可以产生两个有意思的东西。
- 进行相互转换
- 进行拼接
🎨整型和字符串类型的相互转换
在Java中,整型数据和字符串类型数据的转换是很容易实现的,只需要在各自的类中调用valueOf方法,即可转换其数据类型。
(int没有类,但它有包装类Integer)
如:
- 整型转换为字符串类型
public class DataType {
public static void main(String[] args) {
int num = 10;
String str = String.valueOf(num);
System.out.println(str);
}
}
运行结果:
这里将整型的数据通过valueOf方法转换为了字符串类型并存放在了变量str中,完成了整型到字符串类型的转换。
- 字符串类型转换为整型
public class DataType {
public static void main(String[] args) {
String str = "10";
int a = Integer.valueOf(str);
System.out.println(a);
}
}
运行结果:
这里字符串类型变量str中存放的是一个常量字符串10,而用包装类Interger中的valueOf方法将其转换为了整型数据,这就完成了字符串类型到整型数据的转换。
😑整型和字符串类型的拼接
在字符串中,"+"号表示字符串的拼接,例如:
public class DataType {
public static void main(String[] args) {
System.out.println("abc"+"def");
}
}
运行结果:
这就通过"+"完成了字符串的拼接。
而字符串也可以和整数完成拼接:
public class DataType {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a = "+a+","+"b = "+b);
}
}
运行结果:
这就完成了整数类型和字符串类型的拼接。
当然,也可以通过不适用整型变量的形式完成拼接,
如下:
public class DataType {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a = "+10+","+"b = "+20);
}
}
运行结果:
以上两点就是整型和字符串类型之间撞出的小火花啦~
🐱🏍总结
本文的知识点偏基础,但要着重区分Java中数据类型和C语言中的差别,不能混淆。
而本文的重点在于理解Java是一门强类型的计算机语言,允许低精度数据存放在高精度变量中,但绝不允许高精度数据存放在低精度数据中 ,为了避免报错,可以使用强制类型转换的方法,但要知道强制类型转换大概率会发生精度的丢失。
以上就是本文的全部内容,希望可以对大家有帮助。
最后期待一波各位的小手指动一动~给个三连走一波吧 ~ ~
👍点赞👍 + 👀关注👀 + ✔️收藏✔️
以上是关于Java基础语法 - Java数据类型的主要内容,如果未能解决你的问题,请参考以下文章