JavaSE基础——基础语法1:数据类型
文章目录
一、注释、标识符、关键字
注释不会被执行,用于理解代码。
Java中注释有三种:
- 单行注释:以
//
开头 - 多行注释:以
/*
开头,以*/
结尾,中间为多行注释内容。不能嵌套使用。 - 文档注释:以
/**
开头,以*/
结尾,配合Java.Doc
使用,一般应用较少。
注释示例:
/*
程序:Hello World
日期:2021.02.17
作者:SHILIKNG
*/
//class类的名称要和文件名称一致,这里都是Hello
public class Hello {
//public class static void 都是Java关键字
public static void main(String[] args) {
//输出一个hello world
System.out.println("Hello World !");
/*
这是多行注释
多行注释内容
多行注释结尾
*/
}
}
/**
* 文档注释
* 文档注释与Java.Doc配合使用,使用较少
* @Author:带功能的,可以被识别
* @Description
*/
Java的所有组成部分都需要名字,类名、变量名以及方法名都被称为标识符。
-
不能用Java的关键字命名
-
所有的标识符都应该以字母(A-Z 或 a-z)、美元符($)或者下划线(_)开头。
-
首字符过后可以是大小写字母、美元符、下划线或数字等任何字符的组合
-
标识符是大小写敏感的。
-
可以使用中文或拼音命名,但不建议使用,可读性和通用性较差。
-
非法标识符举例:
123abc(以数字开头)、-salary(以-开头)、#abc(以#开头)都是非法的
Java的关键字有:
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final(最终值、不可改变的) | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
二、数据类型
- 强类型语言
强类型定义语言,要求变量的使用要严格符合规定,所有变量必须先定义后使用。
Java、.Net和C++等一些语言都是强制类型定义的,也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。
- 弱类型语言
弱类型定义语言,与强类型定义相反,是一种变量类型可以被忽略的语言。
像VB,PHP等一些语言就属于弱类型语言。
//弱类型语言示例:
//VBScript是一种弱类型语言
a = '12' + 3
//将字符串'12'和整数3进行连接,可以得到字符串'123',也可以将a看作整数123,不用进行显式类型转换
//其实a的类型没有变,VB的编译器智能地在白能量前加上了(int)或(clong)等类型转换关键字
- 强类型语言和弱类型语言比较
强类型语言在速度上可能略逊色于弱类型语言,但是强类型语言带来的严谨性可以有效地帮助避免许多错误。
Java属于强类型语言。Java的数据类型分为基本类型和引用类型。基本类型包括整型、浮点型、字符类型、布尔类型四种。引用类型包括类、接口、数组等。
基本类型包括整型、浮点型、字符类型、布尔类型四种。
2.1 整型
Java中整型的范围与运行Java的平台无关,是固定的。这与C++是不同的。
Java也没有无符号类型。
- byte:在内存里占8位,1个字节。表示范围为-128~127;
- short:在内存里占16位,2个字节。表示范围-32 768~32 767;
- int:在内存里占32位,4个字节。表示范围-2 147 483 648~2 147 483 647
- long:在内存里占64位,8个字节。表示范围-9 223 372 036 854 775 808~9 223 372 036 854 775 807
2.2 浮点型
- float:在内存里占32位,4个字节。
- double:在内存里占64位,8个字节。
2.3 字符类型
- char:在内存里占16位,2个字节。
2.4 布尔类型
- boolean: 占1位,其值只有true和false两个值。
public class Demo01 {
public static void main(String[] args) {
//基本数据类型
//整型
int num1 = 10; //最常用
byte num2 = 10;
short num3 = 30;
long num4 = 30L; //long类型的数字要在数值后面加上L
//浮点型
float num5 = 50F; //float类型的数字要在数值后面加上F
double num6 = 3.141592653589793238462643; //浮点数默认是double型,因此float型需要在值的最后加F
//字符型
char name = 'A';
char name2 = '中';
//char name3 = '中国'; 字符类型变量的值只能是一个字符
//若需要多个字符一起,应该使用String,但String不是关键字,是类
//布尔值
boolean flag = true;
//boolean flag = false;
//一键格式化代码:Ctrl + Alt + L
}
}
3.1 类
3.2 接口
3.3 数组
整型、浮点型、字符型数据可以混合运算,在运算中,不同类型的数据先转换位同一类型,然后进行运行算。因此,需要将一种数值类型转换为另一种数值类型。
各数值类型的级别如下:
低--------------------------------------------->高byte, short, char -> int -> long -> float -> double
转换说明:
- 不能对
boolean
类型的数据进行转换 - 不能把一种类的对象类型转换成不相关类的对象
- 由低级别到高级别的转换是可以自动进行的
- 由高级别到低级别的转换需要强制转换,强制转换语法为
(目标类型)现有类型数据
- 转换过程中可能存在溢出(容量大的类型转为容量小的类型可能出现溢出)或精度丢失(比如
int
转向float
或者浮点数转为整数) - 由浮点数到整数的转换是通过舍弃小数得到的,而不是四舍五入。
//数值类型转换
public class Demo02 {
public static void main(String[] args) {
int num1 = 130;
float num2 = 21;
double num3 = 3.7;
//强制转换后内存溢出
byte num4 = (byte) num1; //由高级转向低级,使用强制类型转换
System.out.println(num4);//由于byte的范围是-128~127,转换后将出现溢出
System.out.println("------------------");
//自动转换
double num5 = num1; //由低级转向高级,自动转换
System.out.println(num5);
System.out.println("------------------");
//由浮点数向整数的转换
System.out.println(num3);
int num6 = (int) num3;
System.out.println(num6);
System.out.println((int)-3.2F); //浮点数转向整数,采用的方式是去掉小数部分。不是四舍五入
System.out.println((int)-45.8);
System.out.println("------------------");
//char类型的转换
char c = 'a';
System.out.println(c + 1); //变量c的类型由char自动转换位int型
System.out.println((char) (c + 1)); //由int转向char,强制转换
System.out.println("------------------");
//整数、浮点数的混合运算
System.out.println(21.0 / 3); //当有一个操作数为double类型,另一个数就会转换为double类型
System.out.println(21f / 3); //否则,当有一个操作数时float类型,另一个就会被转为float类型
System.out.println(21L / 3); //否则,当有一个操作数为long类型,另一个操作数就会被转为long类型
System.out.println(21 / 3); //否则,两个操作数都将被转为int型
System.out.println("------------------");
//操作比较大的数时的溢出问题
int money = 10_0000_0000; //java7的新特性,使用_作为数字的分割符,不影响数字的值
int years = 20;
int total1 = money * years; //money和 years都是 int 型,结果也是int型
System.out.println(total1); //结果超出int表示范围,出现溢出
long total2 = money * years; //若仅是对结果选择long类型存储,结果还是溢出
System.out.println(total2); //原因在于两个int型计算结果仍是int,已经溢出了,然后才进行的类型转换
long total3 = money * ((long)years); //当有一个操作数为long时,结果就为long型
System.out.println(total3);
}
}
-------------------------
运行结果:
-126
------------------
130.0
------------------
3.7
3
-3
-45
------------------
98
b
------------------
7.0
7.0
7
7
------------------
-1474836480
-1474836480
20000000000
5.1 字节
- 位(bit):计算机内部数据存储的最小单位,11001100是一个八位二进制数。
- 字节(byte):是计算机中数据处理的基本单位,习惯上用大写的B来表示。
- 1 B(byte,字节) = 8bit(位)
- 字符:指计算机中使用的字母、数字、字和符号。
- 1 bit = 1 位;1 B = 8 bit;1 KB = 1024 B; 1 MB = 1024 KB; 1 GB = 1024 MB; 1TB = 1024 GB.
5.2 整数的进制
整数在计算机中有四种表示方式:二进制、八进制、十进制、十六进制。
一般为示区分,二进制表示时以0b
或0B
开头,八进制以0
开头,十进制最常用,正常书写。十六进制以0x
或0X
开头。
public class Demo02 {
public static void main(String[] args) {
//整数扩展——进制
//二进制以0b或0B开头标识;八进制以0开头标识;十进制正常书写;十六进制以0x或0X标识
int i = 10; //正常书写,默认十进制
int i1 = 010; //以0开头,八进制书写
int i2 = 0b10; //以0b开头,二进制书写
int i3 = 0x10; //以0x开头,十六进制书写
int i4 = 0x1a; //十六进制中,0~9,10~15用a~f标识
System.out.println(i); //输出结果默认是十进值输出
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
}
}
-----------------------------
运行结果:
10
8
2
16
26
5.3 浮点数的精度
浮点数存在舍入误差,不能精确地表示数值。如果需要准确地表示数值,避免误差,应该使用Java
的BigDecimal
类。
最好完全避免使用浮点数进行比较!
public class Demo02 {
public static void main(String[] args) {
//浮点数扩展——精度丢失
float f = 0.1F; //浮点数f为0.1
double d = 1 / 10.0; //浮点数d为0.1
System.out.println(f ** d); //实际相等,但输出false,表示结果不想等
float d1 = 2222222222222222222f;//浮点数d1
float d2 = d1 + 1; //浮点数d1 + 1
System.out.println(d1 ** d2); //实际不相等,但输出结果为true,表示结果相等
//浮点数存在舍入误差,不能精确地表示数值
//如果需要准确地表示数值,避免误差,应该使用Java的BigDecimal类
//最好完全避免使用浮点数进行比较!
//最好完全避免使用浮点数进行比较!
//最好完全避免使用浮点数进行比较!
}
}
5.4 字符与字符编码
char
类型用于表示单个字符。
对于字符的存储,计算机是采用字符的数值编码来实现的。不同系统有不同的数值编码集,比如美国的ASCII编码集、表示中文字符的GB118030编码等等。为了编码集的统一,出现了Unicode字集。
Unicode字符集
最开始是使用两个字节的数字来对字符进行编码,即有65536个字符的对应编码。Java
采用的就是16位的Unicode字符集
来表示字符。比如U+0041
就是字母A
的编码值。在JAVA
中,char
类型用UTF-16
编码描述一个代码单元。
public class Demo02 {
public static void main(String[] args) {
//字符与字符编码
//所有字符本质还是数字,Java使用Unicode字符集,每个字符编码使用2个字节(16)位存储
char c1 = 'A'; //'A'表示一个字符,单引号括起表示字符,双引号括起表示字符串
char c2 = '中'; //单引号和双引号是字符和字符串的书写形式
System.out.println(c1); //输出字符
System.out.println((int)c1);//这里用到了类型转换,即将char类型转为int型输出,即得到了字符的编码值
System.out.println(c2);
System.out.println((int)c2);
char c3 = '\u0061'; //\u0061表示是Unicode的编码值,这里以十六进制方式书写,和‘a’的含义等价
//单引号的书写方式是字符编码值书写的简化,实际上是等价的
//这里还用到了转义字符
System.out.println(c3); //输出字符
System.out.println((int)c3);//输出字符的编码值
}
}
-----------------------
运行结果:
A
65
中
20013 //20013即中的字符编码值
a
97
对于上面程序中使用\u
表示unicode
代码单元的编码之外,还有一些不能通过键盘直接输入到程序中的字符。比如说直接敲击回车键并不能使字符串中包含一个换行符;比如要在字符串中使用单引号或者双引号(由于Java中已经定义了字符或字符串的书面书写用单引号或双引号,则字符串中的引号就会产生歧义)……
对于上述情况,可以使用转义字符。当使用到这些特殊字符时可以用对应的转义字符代替:
转义字符 | 名称 | Unicode编码值 |
---|---|---|
\b | 退格 | \u0008 |
\t | 制表符 | \u0009 |
\n | 换行符 | \u000a |
\r | 回车 | \u000d |
\“ | 双引号 | \u0022 |
\‘ | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
\f | 换页符 | \u000c |
\u | 16进制Unicode字符 |
随着字符的扩展,现在的Unicode
字符已经超过了655536个。16位的char类型
已经不能满足需要。
Unicode
的字符编码值(又称位代码点)分为17个级别,第一个代码级别是基本的多语言级别,代码点从U+0000~U+FFFF
。其余十六个代码级别的代码点从U+10000~U+10FFFF
,主要表示一些辅助字符。
UTF-16
采用不同长度的编码来表示所有的Unicode
代码点。对于基本的多语言级别,每个字符用16位表示,这16位通常被称为代码单元。对于辅助字符则采用一对连续的代码单元进行编码。