初识Java【2】——入门与数据类型
前言
本节将介绍Java的入门知识及数据类型相关知识,内容比较基础,但是细节颇多,部分数据类型在使用上容易跟C语言混淆,导致一些不应该的错误,各位读者需小心谨慎。
一、入门知识
在正式介绍数据类型之前,需要对一些零基础的读者进行扫盲。请各位读者自行阅读下方这段代码。
public class MyFirstJava {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
//-----------------------------------------------
// 输出结果为:Hello World!
Hello World!
逐行解析
(1)第一行代码public class MyFirstJava {
这行代码由三个部分组成。
首先,public
是访问修饰符,这个修饰符表示的意思:在工程中任意位置都可以对类进行访问。(关于访问修饰符 和 类,各位读者暂时别深究,笔者之后的文章将慢慢介绍到。)
其次,class
这个关键字就代表将定义一个类。
最后,也是目前最值得我们注意的就是:MyFirstJava
。这是Java文件的类名,类名一般以大驼峰的形式书写,通常来讲一个Java文件中最好只放一个类。而一个Java文件只能有一个public class
,且其类名必须与Java文件相同。
(2)第二行代码public static void main(String[] args) {
这行代码由五个部分组成。其中public
已经在上方简单介绍过了。
static
这个关键字,表示静态的。如果被static
修饰则表示其生命周期将延长至整个类结束,而被它修饰的数据会被放在方法区。
void
是一种特殊的数据类型,表示返回值为空,也就是无返回。
main
是表示方法是主方法,是整个程序最先开始运行的地方。
String[] args
是:运行时命令行参数。
(3)第三行代码System.out.println("Hello World!");
这一行代码就是Java的输出,其作用跟C语言中的printf
一样,不过println
会自动换行。
如果不想换行直接把println
替换成print
即可;如果想要像C语言那样格式化输出就把println
替换换成printf
,然后在括号中进行格式化内容的编写。
System.out.println(a); // 打印且换行
System.out.print(a); // 打印但不换行
System.out.printf("%d\n",a); // 以格式化的形式输出内容
关于输出内容:如果是常量则需要用" "
引起来。当我们想同时打印多个数据时,可以使用+
的方式。关于+
我们需要注意的是:一旦拼接内容中有字符串,那么数据最后的输出类型就会变成字符串类型,哪怕引号中内容为空!
public class MyFirstJava {
public static void main(String[] args) {
int a = 5201314; // 定义并初始化整型变量 a 为 5201314
System.out.println("Hello World! " + a);
// 请各位读者自行对比一下两种方式的区别
int b = 1;
System.out.println("Hello World! " + a + b);
System.out.println("Hello World! " + (a + b) ); // 如果不想直接凭借就用()
}
}
//-----------------------------------------------
// 输出结果为:Hello World! 5201314 (这是一个字符串)
// 输出结果为:Hello World! 52013141 (这是一个字符串)
// 输出结果为:Hello World! 5201315 (这是一个字符串)
上方代码中出现的a
和b
就属于变量,我们接下来要讨论的数据类型也是针对变量的。变量名可以由:字母、数字、下划线、$ 组成,其中变量名不能以 数字 开头命名。通常来讲:变量需要以字母为开头且以小驼峰的形式命名。形如:dataType
二、数据分类
1.数据分类
由上图可知,Java分成两个大类:基本类型和引用类型。在Java面试中经常被问到的问题:Java中的八大数据类型是什么?(答案就在上图)这里最容易漏掉的就是byte类型,没错,Java有字节类型的数据。
受篇幅限制,本文将不会对引用类型进行介绍,笔者后期将专门介绍各个引用类型,欢迎各位读者关注。
2.关于默认值
与C语言不同,Java中的数据存放在堆区。而堆区上的数据是设有默认值的。其中以下两个类型的数据默认值值得注意:
(1)字符型
Java采用Unicode的字符编码方案。跟C语言采用的只包含128个字符的ASCII码不同,Unicode编码占用2个字节,8个比特位,其访问范围更大,其内容甚至包含了大多数的中文、日文、韩文…而此处默认值\u0000意思是空格。
(2)引用类型
各位读者看到的null,跟C语言中的null是有所不同的。C语言中的null代表指向了系统中不可用的0号地址(一个受保护的地址),而Java中的 null 跟 0号地址没有任何关联。
三、基本类型细节要点
关于数据类型,读者需要了解的内容包括:各个类型的含义、字节大小 以及 包装类。
1.整型
整型数据其实就是数学中的整数。之所以分成四个不同的类型,是因为不同类型所能表示的数值范围大小不一样。但是这并不意味着数值表示范围越大的数据类型越好,因为表示范围大也意味着:可能浪费的空间多。
public class DataType {
public static void main (String[] args) {
int num1 = 1;
short num2 = 2;
long num3 = 3L;
byte num4 = 128
}
}
这里先统一介绍包装类的两个简单用法,下方就不再赘述了。
包装类.MAX_VALUE : 可以表示这个类的【最大值】
包装类.MIN_VALUE : 可以表示这个类的【最小值】
对于第五行的long
类型变量,赋值时需要注意数字末尾必须加上L,这样才能被指定为长整型。
(1)int
类型
1)字节大小:4byte
2)包装类:Integer
public class DataType {
public static void main (String[] args) {
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648
int num1 = Integer.MAX_VALUE + 1;
System.out.println(num1); // -2147483648
int num2 = 2147483647 + 1;
System.out.println(num2); // -2147483648
}
}
不知各位读者对num1
和num2
的打印结果有没有一点惊讶。正常来讲,num1
和num2
在+1
之后就超范围了,而结果是 -2147483648。原因就是:数据是以二进制形式进行+
和-
的操作的。因此,数据就会成一个⚪来排列,如下图所示。
下方的short
类型、long
类型、byte
类型同理,下面就不再画图了。
(2)short
类型
1)字节大小:2byte
2)包装类:Short
public class DataType {
public static void main (String[] args) {
System.out.println(Short.MAX_VALUE); // 32767
System.out.println(Short.MIN_VALUE); // -32768
short num = (short)(Short.MAX_VALUE + 1);
System.out.println(num); // -32768
}
}
(3)long
类型
1)字节大小:4byte
2)包装类:Long
public class DataType {
public static void main (String[] args) {
System.out.println(Long.MAX_VALUE); // 9223372036854775807
System.out.println(Long.MIN_VALUE); // -9223372036854775808
long num = Long.MAX_VALUE + 1;
System.out.println(num); // -9223372036854775808
}
}
(4)byte
类型
1)字节大小:1byte [-128,128)
2)包装类:Byte
public class DataType {
public static void main (String[] args) {
System.out.println(Byte.MAX_VALUE); // 127
System.out.println(Byte.MIN_VALUE); // -128
byte num = (Byte)(Byte.MAX_VALUE + 1);
System.out.println(num); // -128
}
}
对整型的介绍大致如上,但还有一个小细节不知各位读者关注到了没有。只short
类型、byte
类型的num
变量被强制类型转换了。原因是:不同类型的数据之间混合运算时,数据类型小的会被提升到数据类型大。
在对 short
类型 及 byte
类型 的num
变量进行计算时,+1
被当成int
类型处理,因此Short.MAX_VALUE
和Byte.MAX_VALUE
会进行整型提升后,再跟+1
进行混合运算。最后得到的结果当然也是int
类型,如果不进行强制类型转换就直接将结果赋给 short
类型 或 byte
类型 编译器就会报错。
那么对于long
类型计算时的+1
又是如何处理的呢?这里的+1
属于int
类型,明显不如long
类型那么大,此时+1
就会被强制类型转换成long
类型计算。最后结果赋给long
类型的num
当然就不需要强制类型转换了。
2.浮点型
(1)double
类型
1)字节大小:8byte
2)包装类:Double
public class DataType {
public static void main (String[] args) {
double num = 12.5;
System.out.println(num);
System.out.println(Double.MAX_VALUE); // 1.7976931348623157E308
System.out.println(Double.MIN_VALUE); // 4.9E-324
int a = 1;
int b = 2;
System.out.println(a / b); // 0
double c = 1.1;
System.out.println(c * c); // 1.2100000000000002
}
}
Java中的double
类型有3点值得注意:
A.只要是小数,就会默认是双精度类型
B.两个数必须有一个是小数才能保存小数
C.小数在内存的存储是有精度限制的!
(2)float
类型
1)字节大小:4byte
2)包装类:Float
public class DataType {
public static void main (String[] args) {
float f = 12.3F;
System.out.println(f);
}
}
Java中的float
类型有2点值得注意:
A.如果是float
类型的小数就必须在数字后面 +F
B.如果double
类型强制转换成float
类型可能会造成精度丢失,编译器会直接报错。
部分读者注意到:int
类型和 float
类型本质上都是4byte,但为什么float
类型的宽度更大。能够存储小数呢?原因是:存储方法不一样造成的。float
类型是根据IEEE的标准存储。
3.字符类型
1)字节大小:2byte [0,65535]
2)包装类: Character
字符是没有负数的,因此char
类型是从0
开始计算的。
public class DataType {
public static void main (String[] args) {
char ch1 = 'a';
System.out.println(ch1);
char ch2 = '高';
System.out.println(ch2);
// Unicode字符集,包含的比 ASCII码 更多
char ch3 = 97;
System.out.println(ch3)
}
}
4.布尔类型
1)字节大小:无明确大小
2)包装类:Boolean
3)取值:真为true
; 假为false
public class DataType {
public static void main (String[] args) {
boolean flg = true;
System.out.println(flg);
// if(1) -- 报错!
//-----------------------------------
// 输出结果:true
}
}
Java的boolean
类型跟C语言中的不同。Java只能用true
和false
来表示真假,而0
和 !0
不再能表示真假。
四、强制类型转换
只有两条规则需要特别注意:
1.不相干的类型不能进行强制类型转换 (主要指:不要把其他类型转成boolean
类型)
2.发生混合运算过程时,小字节会自动转成大字节。
结语
将各个数据类型梳理清楚之后就发现内容也不算很多。总结一下需要注意的点:
1. long
类型数值需要+L
,float
类型数值需要+F
2. 当数值超出数据类型最大范围时,就会回到其最小值,同类超出最小值时,就会回到0。
3. 发生混合运算时,注意某些数据会强制类型转换,结果可能也需要强制类型转换
4. 浮点型在计算时要注意变量是否需要 (*1.0)
,使结果呈现出小数。