我们需要了解一些基础的Java 语法来进行java的学习,这里我做了一些小小的总结,具体涉及以下内容:标识符和关键字,数据类型(基本数据类型、基本数据类型的转换、引用数据类型),常量和变量,运算符,语句,方法。这部分是Java后续的基石,可以这么理解:标识符和关键字用来给接下来的各种内容起名字,数据类型用于给变量和常量设置类型,变量需要进行运算有各种运算符,这些运算可以归结为语句,循环或者判断,而语句放在方法里执行,这样我们一个整体语法基石就构建完成了。
是通过看视频,看书了解的,现在拿出来与大家分享,这部分的学习大概从2015年10月开始。首发于CSDN,于2021年1月21日二次更新和补充。
标识符和关键字
标识符和关键字就是我们在Java代码中填写的一些命名,只不过标识符是我们自己能定义的,关键字则有其特殊含义。
标识符
标识符就是一切可以起名字的地方:包名、类名、接口名、方法名,常量名、变量名等,标识符有以下的命名规则
- 标识符由字母、数字、
_(下划线)、$符 组成 - 不能以数字开头
- 不允许单独使用下划线作为分隔符(Java9)
- 不能用Java中的保留字(关键字)
- 对大小写敏感,长度没有限制
标识符采用有意义的简单命名,一般我们用一个英文单词去命名,并且遵循如下命名规范(驼峰命名法):
- 包名:包名一般采用全小写的格式
- 类名和接口名:每个单词的首字母大写,其余为小写。(大驼峰即帕斯卡命名法)
- 方法名和变量名:第二个单词起的首字母为大写,其余全为小写。(小驼峰)
- 常量名:基本数据类型的常量名使用全部大写字母,字与字之间用下划线分隔。
以上就是一些简单的标识符命名规范。
关键字
什么是关键字呢?关键字就是在java语言中赋予特殊含义的单词,它有两个特点:1.组成的关键字的单词全是小写,2.常见的代码编辑器中,对关键字都有特殊的颜色标记,共计48个关键字:
- 用于包的关键字[2]:import(导入这个类所存在的包);package(定义包的关键字,将有关类放在一个包中)
- 定义类、接口、抽象类[3]:class(声明一个类);interface(声明一个接口);abstract(表明类或者成员方法具有抽象属性)
- 用于建立类与类之间关系[2]:implements(implements 表明一个类实现了给定的接口类);extends (表明一个类型是另一个类型的子类型,常见的类型有类和接口)
- 用于定义访问权限修饰符[4],Java分别定义了四种访问级别:private、protected(当前包不一定为子类以及跨包子类均可)、default(默认访问限制)、public
- 用于定义建立实例及引用实例、判断实例[4]:new(用来创建新的实例对象),this(指向当前实例对象的引用),super(表明当前对象的父类型的引用或者父类型的构造方法),instanceof(用来测试一个对象是否是指定类型的实例对象)
- 用于定义类、函数、变量修饰符【4】:final(终结器,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量); static(表示具有静态属性);synchronized(线程同步,修饰一段代码表示多个线程都能同步执行) ,volatile (原子操作,表明两个或者多个变量必须同步地发生变化),native(本地用来声明一个方法是由计算机相关语言实现的(如C/C++语言等))
- 用于异常处理【5】:try(尝试一个可能抛出异常的程序块);catch(用在异常处理中,用来捕捉异常);finally(用于异常处理情况,用来声明一个基本肯定会被执行到的语句块(有没有异常都执行));throw(通常用在方法体中,并且抛出一个异常对象,程序在执行到throw语句时立即停止,它后面的语句都不执行);throws(如果一个方法可以引发异常,本身不对异常进行处理,将异常抛给调用者使程序可以继续执行下去)
- 程序控制语句【11】:break(跳出循环); continue (继续);return (返回);do (运行);while(循环);if (如果);else(反之);for (循环);switch (开关);case (返回开关里的结果); default (返回默认结果)
- 数据类型关键字【11】:boolean(布尔型);byte( 字节型);char (字符型);double (双精度);float( 浮点);int (整型);long (长整型);short (短整型);string(字符串);enum(枚举类型);strictfp(strict float point 精确浮点)。
- 用于特殊用途【2】:assert (断言,用来进行程序调试); transient(表示一个成员变量不是该对象序列化的一部分)
除了48个关键字之外,还有2个保留关键字
- 保留关键字【2】:goto(跳转到)、const(常量)。(现在没用以后可能用到作为关键字)
剩下的都是保留字,Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用:
- 特殊直接量【3】:true(正确);false(错误);null(空值)
- 其它保留字【9】: byValue, cast,future, generic, inner,operator, outer, rest, var
也就是说,Java中48个关键字、2个保留关键字以及12个保留字,都不能作为标识符来使用,这点需要注意,其中除了9个其它关键字,以上关键字与保留关键字以及特殊直接量会编译错误,而9个其它关键字不会,但仍然不建议使用,防止以后作为关键字使用导致的历史代码无法正确运行。
java的关键字与保留字
还有要注意true,false,null,不是java的关键字,但是你不能把它们作为java标识符用。
标识符和关键字了解后可以看一个简单示例:
Java数据类型
在上文保留字中我们提到了Java涉及的一些数据类型,这些类型在常量和变量中的定义中也会用到,我们先来梳理下:
Java 语言是一种强类型语言。通俗点说,在 Java 中存储的数据都是有类型的,而且必须在编译时就确定其类型。 Java 中有两类数据类型:
- 基本数据类型变量:存的是数据本身,基本数据类型变量里存储的是直接放在抽屉里的东西
- 引用类型变量:存的是保存数据的空间地址,引用数据类型变量里存储的是这个抽屉的钥匙,钥匙和抽屉一一对应
需要注意的是String 是一种常见的引用数据类型,用来表示字符串。
基本数据类型
我们知道基本数据类型有8种,name接下来对基本数据类型涉及内容及转换过程做详细介绍。
基本数据类型特性
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。Java中所有的数据类型在所有的操作系统上占的位数都一样,所以可以跨平台。 各个基本类型如下所示:
- byte【1字节】:byte 数据类型是8位、有符号的,以二进制补码表示的整数;最小值是 -128(-2^7);最大值是 127(2^7-1);默认值是 0;byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;例子:byte a = 100,byte b = -50。
- short【2字节】:short 数据类型是 16 位、有符号的以二进制补码表示的整数最小值是 -32768(-2^15);最大值是 32767(2^15 - 1);Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是 0;例子:short s = 1000,short r = -20000。
- int【4字节】:int 数据类型是32位、有符号的以二进制补码表示的整数;最小值是 -2,147,483,648(-2^31);最大值是 2,147,483,647(2^31 - 1);一般地整型变量默认为 int 类型;默认值是 0 ;例子:int a = 100000, int b = -200000。
- long【8字节】:long 数据类型是 64 位、有符号的以二进制补码表示的整数;最小值是
-9,223,372,036,854,775,808(-2^63);最大值是9,223,372,036,854,775,807(2^63 -1);这种类型主要使用在需要比较大整数的系统上;默认值是 0L;例子: long a = 100000L,Long b = -200000L。"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。 - float【4字节】:float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;float 在储存大型浮点数组的时候可节省内存空间;默认值是 0.0f;浮点数不能用来表示精确的值,如货币;例子:float f1 = 234.5f。
- double【8字节】:double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;浮点数的默认类型为double类型;double类型同样不能表示精确的值,如货币;默认值是 0.0d;例子:double d1 = 123.4。
- boolean【1字节】:boolean数据类型表示一位的信息;只有两个取值:true 和 false;这种类型只作为一种标志来记录 true/false 情况;默认值是 false;例子:boolean one = true。
- char【2字节】:char类型是一个单一的 16 位 Unicode 字符;最小值是 \u0000(即为 0);最大值是 \uffff(即为65、535);char 数据类型可以储存任何字符;例子:char letter = ‘A’;。
了解了8大基本数据类型和注意事项后我们再看看它们是怎么相互转换的。
基本数据类型转换
基本数据类型之间满足以下条件可以实现互相转换:
- 布尔类型和其他类型不可以互相转换
- byte,short,char不能互相转换,在做运算之前会自动转换为int类型。
- 容量小的类型可以自动转换为容量大的数据类型【byte,short,char—》int—》long—》float—》double】
- 特殊情况: Java语言整型默认为int型,声明long型常量时候需要后边加’L’或者‘l’,
long l=1232323L,当赋值给long变量没有加‘ l ’或‘ L ’ ,仍旧默认成int类型。如果赋值的时候没有超出int表述范围没关系,即使超出了int的表述范围,也不用担心,不会报错但会导致数值计算错误
- 容量大的转换为容量小的需要强制转化,可能会丢失精度,特殊情况:
- 赋值的时候只要int类型的数没有超出(byte,short,char)的表述范围,可以直接byte a=23,
- Java语言默认浮点型常量为double型,如果要声明一个常量float型,则需要在后边加f或者F, 直接转不过去,直接转会导致溢出现象,
float l=1232323.45F
- 多种混合计算时,自动将所有数据类型转换为容量最大的一种数据类型。
以下为一些转换的代码示例:
public static void main(String[] args) { boolean b=true; System.out.println(b); byte b1=67; //byte类型直接后边赋值即可,int类型可以自动赋值到byte上,只要不超过127,但是float f=0.1就不行,必须加f,虽然没超出范围。总结起来就是整型之间虽然不是int但是只要没超过int范围就没必要加强制转换或者是末尾加l,但是浮点型的不行,一定得加强制转换或者是末尾加f。 byte b2=99; byte b3= (byte)(b1+b2); //在计算之前(byte,short,char会自动转换为int,所以需要强制转换为byte) System.out.println(b3); //如果直接超过127 ,不会有溢出错误,直接砍掉多余位数 char c1='t'; int b4=b3+c1; System.out.println(b4); //char,byte,short不可以互相转,但是可以进行混合运算 int i1=123; int i2=456; double d1=(i1+i2)*1.2; //系统将会自动把int型的转为double型的计算,因为浮点型的1.2是默认double型的,混合运算中又要取最大范围 System.out.println(d1); float f1=(float)d1; //因为d1是double型的,所以要强制转换为float型的。 System.out.println(f1); double d2=1e200; float f2=(float)d2; System.out.println(f2); //因为d2超出了float能承受的范围,所以会溢出 float f3=12.344343f; //后边必须加f long l1=1234l; long l2=3455l; float f4=f3+l1+l2; System.out.println(f4); //混合运算自动都变为float型的 long l3=(long)f4; System.out.println(l3); //强行把浮点数类型的转化为整型的会导致没有小数位,不是四舍五入,而是彻底没有小数部分。 }
转换过程预期和纠错:
public static void main(String[] args) { int i=1,j=12; //对i,j赋初始值 float f1=(float)0.1; //0.1f与这里的写法是有区别的,0.1f表示内存分配就分配了4个字节,而这种写法意思是8字节的double类型然后强制转换 float f2=123; //123默认是int类型的,可以自动转为float long l1 = 12345678,l2=8888888888L; //l1这里没有超出int的范围,所以不用加l,而l2显然超过啦,所以必须加l double d1 = 2e20,d2=124; //int类型自动转为double byte b1 = 1,b2 = 2,b3 = 127; //只要没超过int的表述范围,赋值不需要加强制转化 j = j+10; i = i/10; i=(int)(i*0.1); //这里虽然与上边相同的计算结果,过程不一样,首先计算后为double,必须加强制转化 System.out.println(i); //i是int型,10是int型,所以计算结果为0,也必须是int型 i = (int)(i*0.1); //i是int型的,乘0.1后变为double型,必须强制转化为int型 char c1='a',c2=125; byte b = (byte)(b1-b2); char c = (char)(c1+c2-1); //混合运算,统统转为int,运算结束后再转为char型的 float f3 = f1+f2; float f4 = (float)(f1+f2*0.1); double d = d1*i+j; float f = (float)(d1*5+d2); }



