2.JAVA语法基础
java基本代码规范,以及类的定义,基本的关键字和属性的用法,基本数据格式以及数据转换,运算符的操作
一、类的基本结构
类是组成Java程序的最小结构单元。
基本语法:
public class SyntaxBasic{
}
一个类的组成
花括号前的部分称为类头。用来修饰一个类的特征。
-
public称为访问修饰符
-
class称为类关键字
-
SyntaxBasic是类的名称,名称的命名要求要见名知意。
花括号内的部分称为类体,也就是类的主体部分。
二、 main方法的结构
main方法也成主方法,作为代码执行的入口,只要main方法体内存在有效代码,运行时便会输出结果。
基本语法:
public static void main(String[] args){
}
main方法的主要存在的一些特性
-
public称为访问修饰符
-
static表示静态方法
-
void表示无参数返回值
-
圆括号内表示是方法能够获取到的参数也称资源。String[]表示参数类型为字串符数组类型,args为参数变量的名称
-
花括号称为方法体,包含代码的部分
三、注释、标识符、关键字、变量和常量
1.注释
便于给代码注释其含义的辅助文本,供编写者查看。
注释分为单行注释、多行注释和注释文档
注释的用法及规范
-
单行注释,一种是写在单行代码的后面,若内容过多,可以写在代码的上面。另一种是写在一行代码的前面,使这段代码编译被忽略但也不会消失
-
多行注释,对于代码中较为复杂的操作的解释,例如用在if,for循环的注释
-
注释文档,用于生成程序的相关信息。在实际工作中一般写在类头和方法头的上面,注解文档中可以用*号开头也可以不用
规范演示
/** * @author Wavesboker //作者名 * @version //版本号 * @since //开发用的Java版本 * @param //参数名 * @return //返回值 * @throws //异常抛出情况 */ public class Test{ /** 这是文档注释 支持多行 */ public static void main(String[] args){ int num = 10;//这是单行注释 //包含在注释中的代码编译时被忽略int score = 15; System.out.println("显示的值" + num); } }
2.标识符
给一个类、一个方法或者是变量定义的名称称为标识符。这些名称都是由程序员自定义的。
标识符的命名规则
-
A~Z和a~z的英文字母表示(推荐使用规则)
-
0~9的数字(不能用来作为开头)
-
_下划线(一般用在常量名两个单词之间的连接)
-
$美元符号(只用在给类中类定义变量名字的特殊情况)
-
不能以关键字做为标识符,例如:public,class,void等
标识符的应用范围
-
类名:由英文字母命名,首字母大写。多个单词组成,单词首字母都要大写(帕斯卡命名)
-
方法名:由英文字母命名,首字母小写。多个单词组成,第二个单词首字母大写(驼峰命名)
-
变量名:由英文字母命名,方法名规则一样(驼峰命名)
-
常量名:英文字母全大写,多个单词之间用下划线_连接
实例:
定义类
public class Note{
}
定义变量
int number = 1;
定义方法
public void method(){
}
定义常量
final int MAX_VALUE = 100;
3.关键字-----
在某种语言当中表示特殊语义的特殊符号。由语言开发者定义,不能被程序员修改
关键字的种类以及作用
-
访问修饰符 Java中用来保护类、方法、变量和构造方法访问权限的修饰符
-
public 即公共的,访问权限最高,所有的类都可见。可以用在类、方法、变量和接口
-
default 默认的(可以不用写),在同一包当中可见。可以用在类、方法、变量和接口
-
protected
-
private
-
类修饰符
-
class 仅用来修饰类
4.变量
在Java中,变量用于对内存数据进行存储,获取。并且可以进行修改的标识符
变量的声明与定义
变量的声明,格式为数据类型+变量名。声明变量中没有数据
int number;
变量的赋值,格式为变量名+等号+变量值。前提先给变量声明之后,一般是将等号右边的值存放在左边的变量中
number = 10;
变量的声明并赋值,声明和赋值一起执行。一行代码完成变量声明和定义,给变量赋初始值
int age = 10;
变量的作用域
作用:为了避免在复杂的系统中代码发生冲突,划分变量的使用范围。
public class Variable{
//全局变量
int quantity;
int height;
public static void main(String[] args){
//局部变量
int num = 10;
int power = 100;
System.out.println("数量为" + num);
}
}
按照结构划分为全局变量和局部变量
-
全局变量:全局变量可以在整个类中使用
-
局部变量:只能在方法内使用,使用范围就是整个方法的花括号内
注意点:由于案例当中的main方法为静态方法,所以也无法使用全局变量
5.常量
常量的数据是固定不变的,初始值后不能被修改
常量的类型
分为普通常量(常数)和标志性常量
-
普通常量体现在变量值、字串符、字符和布尔常量
int a = 12;
char b = 'z';
String name = "张三";
boolean result = true;
-
标志性常量是由final关键字修饰的变量
final double PI = 3.1415926;
注意:被final修饰的变量必须要赋予初始值,而且不能进行二次修改
四、数据类型
变量是来申请内存存储数值的。
内存管理系统通过变量的类型来匹配相同类型的储存空间,储存空间用来储存该类型数据。
Java中数据类型的分类
数据类型分为基本数据类型和引用数据类型
基本数据类型分为整型、浮点型、字符型和布尔型
1.整型的种类以及属性
-
byte 在JVM内存占1个字节,一个字节等于8位,数据有效范围-128~127
-
short 占16位,范围-32768~32767
-
int 最常用的整型存储类型 占32位 范围-2147483648~2147483647
-
long 占64位 范围-9223372036854775808~9223372036854775807
byte numA = 127;
short numB = 32767;
int numC = 2100000;
long numD = 920000
2.浮点型的种类以及属性
-
float 单精度类型 占32位 范围在1.4E-45~3.4028235E38
-
double 双精度 占64位 范围在4.9E-324~1.7976931348623157E308
float height = 12.5f;
double width = 5.567342;
注意点:float类型的常数需要加上f的后缀才能存放在float类型的内存中
浮点数据保留小数的处理
DecimalFormat 路径:Java.text.DecimalFormat
使用DecimalFormat类可以实现保留浮点数据小数点后几位数字的个数
DecimalFormat.format()方法可以将目标数据转换成字串符的格式
案例演示
import java.text.DecimalFormat;//从java中导入工具类
public class Test{
public static void main(String[] args){
DecimalFormat object = new DecimalFormat("0.000");//创建对象,特性是保留小数点后三位
double num = 2.744866952;
String numStr = object.format(num);//将浮点类型数据转换成字符串类型
System.out.println(numStr);
}
}
经过处理的浮点数据会采用四舍五入的方式保留
科学计数法的表示
在Java中若出现浮点数据过长,系统会自动将其转换为科学计数法的形式,仅用于浮点型的数据
转换规则:
double number = 4E2.8;
4E2等于4乘以10的二次方,转换结果为400.8
3.字符型的定义以及属性
字符数据类型用来储存单个字符的数据,用单引号包围。JVM对字符采用unicode无符号进行编码。
char 在JVM中占用16位 范围为0~65535 默认值为\u0000
char name = '张';
char类型兼容int类型,可以直接将字符型数据转换成整数
转义字符
特殊的单个字符,不能直接显示的字符要用转义字符表示
下列为常见转义字符表
4.布尔型的定义以及属性
boolean型数据类型只有两种表示方式true和false,一般应用于逻辑判断。
boolean 按JVM标准占4个字节 默认值为false
boolean result = false;
五、数据类型转换
1.数据类型转换的种类
-
自然转换,低精度数据类型向高精度数据转换
数据类型精度从小到大排序
byte<<<short<<<int<<<long<<<float<<<double
案例
byte small = 15;
int bigger = byte;
低精度的数据可以任意的存放在高精度数据类型的内存中,只用于相兼容的数据类型,如char型不能和boolean型进行转换
-
强制转换,高精度类型数据存放在低精度类型内存中,会丢失数据精度
转换格式:
低精度数据类型变量 = (低精度数据类型关键字)高精度常量/变量;
案例
int num = (int)18.67;//double类型转int类型
double money = 1756.4457;
long bank = (long)double;
括号内的强制转换的数据类型要与低精度数据类型变量相兼容
扩展:源码、反码和补码
-
原码
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
例如:用8位二进制表示一个数,+9的原码为0000 1001,-9的原码就是1000 1001
-
反码
反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。反码的表示方法是:正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1。
例如:+11的反码为0000 1011,-11的反码为1111 0100
-
补码
正数:正数的补码和原码相同。负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
例如:+7的补码为0000 0111,-7的补码为1111 1001
当数据类型从高转低发生溢出时,最终输出的结果会发生改变
案例
public class Test{
public static void main(String[] args){
int num = 130;
byte result = (byte)num;//当int型转换byte型内存溢出后 结果会变成负数
System.out.println("转换内存溢出结果:"+result);
}
}
从案例中得出最终转换结果为-126,因为数据的溢出,导致结果变成了负数
原理解析:
由于计算机底层是以数字二进制的源码、反码和补码来进行表示
根据原理分析
由于int类型的130强制转换为byte类型,byte类型数值位是8位,130转换成二进制为1000 0010,最高位是“1”
所以是一个负数为000 0010。在通过补码表示负数,转换成反码为111 1101,再+1等于111 1110
111 1110转换成十进制结果就是-126
各进制的表示方式和换算
1.进制的前缀表示
-
二进制:前缀为0b,范围:0和1
-
八进制:前缀为0o或者0,范围:0-7
-
十进制:没有前缀,所有表示的数字都是十进制,范围:0-9
-
十六进制:前缀为0x,后缀为H,范围:0-9,A-F,a为10
2.各进制的运算机制
二进制转十进制
int t = 0b1111;
System.out.println(t);
运算过程:
t变量赋值的是一个二进制的数值
输出的值运算方法:
是从0开始右往左数2的0次方乘以第一位数加上2的1次方乘以第二位数加上2的2次方乘以第三位数……以此类推
每一位数运算的结果从右往左排再相加1+2+4+8=15
八进制转十进制
int i = 012;
System.out.println(i);
运算过程:i变量赋值的是一个八进制的数值
输出的值运算方法:
同样从右往左数8的0次方乘以2加上8的1次方乘以1加上8的2次方乘以0
每一位数运算的结果从右往左排再相加2+8+0=10
十六进制转十进制
int y = 0xc8;
System.out.println(y);
运算过程:y变量为十六进制
输出的值运算方法:
16的0次方乘以8加上16的1次方乘以12
结果为8+192=200
二进制转八进制
例:0b110101
由于2的3次方为8,可以将二进制代码从右往左每三个数字分成一组,每组按照4 2 1法则组合,110=6,101=5,组合起来是65
例:0b1011
若遇到不能每三个分成一组的,从右往左数,最后一个不能三个数分成一组的补0,001011,001=1,011=3,组合起来是13
二进制转十六进制类似于二进制转八进制,但是2的4次方为16,所以需要将二进制代码每四个组成一个数,每组按照8 4 2 1法则组合
六、运算符
运算符按照功能大致分为算数运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符和特殊运算符
1.算数运算符
通常使用1个或2个操作数进行数学运算来得出结果。按照操作数个数分为双目运算符和单目运算符。
双目运算符
+加 -减 *乘 /除 %取余
public class DataCount {
//双目运算符
public static void main(String[] args) {
int a = 20;
int b = 5;
System.out.println("已知a等于20,b等于5");
System.out.println("相加运算:" + (a + b));
System.out.println("相减运算:" + (a - b));
System.out.println("相乘运算:" + (a * b));
System.out.println("相除运算:" + (a / b));
System.out.println("取余运算:" + (a % b));
}
}
单目运算符
++自增 --自减
public class DataCount {
//单目运算符 自增和自减特性相同
public static void main(String[] args) {
int a = 1;
int b = a++;
System.out.println("++在后先赋值后自增 a =" + a + " b = " + b);
b = ++a;
System.out.println("++在前先自增后赋值 a =" + a + " b = " + b);
}
}
2.赋值运算符
用来将一个数据赋值给一个变量
=赋值 +=加赋值 -=减赋值 *=乘赋值 /=除赋值 %=取余赋值
测试
=赋值
int num = 10;//将10赋值给变量num
+=加赋值
int a = 1;
a += 1;//分解公式为a=a+1
-=减赋值
int b = 2;
b -= 1;//b=b-1
*=乘赋值
int c = 2;
c *= 2;//c=c*2
/=除赋值
int d = 10;
d /= 5;//d=d/5
%=取余赋值
int e = 9;
e %= 2;//e=e%2
3.关系运算符
用来对2个操作数进行比较运算,并得出布尔数据类型的结果。
-
(a > b) 表示a是否大于b 如果大于为真
-
(a < b)表示a是否小于b 如果小于为真
-
(a <= b)表示a是否小于等于b 如果是为真
-
(a >= b)表示a是否大于等于b 如果是为真
-
(a == b)表示a是否等于b 如果等于为真
-
(a != b)表示a是否不等于b 如果不等于为真
案例演示
//关系运算符 返回值为true false
int a = 30;
int b = 50;
System.out.println("输出结果为:" + (a > b));
System.out.println("输出结果为:" + (a < b));
System.out.println("输出结果为:" + (a == b));
System.out.println("输出结果为:" + (a != b));
int c = 5;
int e = ++c;
System.out.println("输出结果为:" + (e == c));
4.逻辑运算符
对操作数使用逻辑运算,只能返回true和false 所以只能用Boolean类型
-
&& 与逻辑 两个操作数都为真 则为true 否则为false
-
|| 或逻辑 两个操作数有一个为真 则会true 否则为false
-
! 非逻辑 将最后表达的结果取反
短路逻辑运算现象:
使用与逻辑时 当第一个操作数结果为false,不用第二个操作数判断,则最终结果就为false
使用或逻辑时 当第一个操作数结果为true直接判断最终结果就为true
案例演示
//逻辑运算符 &与 |或 !非 应用于Boolean值 返回值为true false
boolean a = true;
boolean b = false;
System.out.println("a && b ="+(a && b));
System.out.println("a || b ="+(a || b));
System.out.println("a && b="+!(a && b));
System.out.println("!(a || b)="+!(a || b));
/*短路逻辑运算
当进行与逻辑运算时,若第一个值为false 不管后面的值是否为true 判定为false
当进行或逻辑运算时,若第一个值为true 不管后面的值是否为false 判定为true
*/
int c = 100;
System.out.println("输出结果为:" + ((c > 100) && (c == 100)));
System.out.println("输出结果为:" + ((c == 100) || (c < 100)));
5.位运算符
位运算符是针对二进制代码的运算,不能对浮点型操作。
案例演示
/*
位运算符
& | ^ ~ 位与 位或 位异或 位非 << >> 左移 右移
例 有两个二进制数据
A = 0010 0110
B = 1010 0001
==========================================
& = 0010 0000 两个都是1 才为1 否则为0
| = 1010 0111 两个都是0 为0 否则为1
^ = 1000 0111 相同为0 否则为1
~ B = 0101 1110 取反
<< 左移多少位 就是乘以2的几次方
>> 右移多少位 就是除以2的几次方
*/
int a = 63; //a = 0011 1111
System.out.println("a << 2 = "+ (a << 2));//a = 252
6.条件运算符
对三个操作数进行条件判断的运算 第一个操作数是条件,第二个操作数是结果为true所返回的值,第三个操作数是结果为false所返回的值,一般用于简单的两种比较结果,使用条件运算符会更加简洁并且提高阅读性。
案例演示
/* 条件运算符 也称三目运算符
例 a ? b : c
当a的结果为true 执行b 结果为false 执行c
*/
int a = 10;
int b = 20;
int c = 30;
boolean g = (a > 10);//设置条件a > 10
System.out.println("输出结果为:" + (g ? b : c));//结果为true输出b的值 结果为false输出c的值
7.特殊运算符
-
new 创建某个引用类型的对象
-
. 用于访问类或者是方法
-
() 所包围的内容为优先被运算的表达式或者是方法内的参数
-
[] 表示为数组的类型
-
instanceof 用于判断某个对象是否属于某个类,结果为布尔值
综合案例:
//new运算符
Scanner scan = new Scanner(System.in);//创建Scanner类型的对象
System.out.println("请输入文本");
//.访问对象的方法
int num = scan.nextInt();//此括号内表示无参数
//[]表示数组的类型
int [] arr = {1,2,3};
//intanceof判断并储存boolean值 格式:对象 instanceof 类
boolean result = scan instanceof Scanner;
System.out.println("结果为" +result);