Java基础语法
变量的命名
帕斯卡命名法:一个变量由多个单词构成时,每个单词首字母都大写【类名、接口名、枚举名】
驼峰命名法:一个变量由多个单词组成时,第一个首字母小写,其余单词首字母都大写【变量名、方法名】
1、标识符
什么是标识符?
就是程序中起名字的地方。
用在哪?
类/接口、变量、方法、包、参数
有什么讲究?【静态方法不能访问静态变量】
语法规范:违反规范会发生编译错误。
-
标识符区分大小写,理论上没有长度限制
-
由字母、数字、下划线或美元符号组成
疑惑:中文行不行?经测试,可以,字母不单纯指英文字母,还代表其它语言字母
中文符号 ¥ 可以吗? 经测试,可以,
但是一般按规范都是用英文符号和字母来书写代码的
-
标识符的首字母由字母、下划线或美元符号开头,不能以数字开头
-
标识符的命名不能使用关键字(全是小写的)、布尔值(true、false)和 null
怎么保证不和关键字冲突?
不要纯小写就解决了啊!
默认的编程规范来指导标识符命名:
-
类/接口:
- 类名首字母大写
- 使用多个单词时每个单词首字母都大写
- 实体类一般一个单词命名(用来存储数据的类)
/‘;;
- 多数情况下,多个单词的第一个大多是名词来表达操作的对象
【e.g:StudentDao、StudentImpl等】
-
变量:
- 变量首字母小写
- 一个字母:循环变量
for (i=1; i<10; i++){...}
- 一个单词:局部变量或者实体性的成员变量
类名:Student--》变量名:student
- 多个单词:
-
方法:
- 首字母小写,方法名
- 动词 + 宾语的结构
e.g:addStudent()
-
包:
-
为啥要有包?包是干啥的?
- 包装类和接口
- 给类分组的(给类价格前缀)
-
纯小写,类似于倒置的域名,用点隔开
e.g:com.kfm.bean 【公司.名字全拼.功能】指实体类包
-
-
参数:
- 纯小写
- 参照局部变量命名规则
扩展:阿里编程规范(为什么这么规定?我不用会怎么样?挑挑毛病?)
-
命名分格
- 代码中命名均不能以下划线和美元符开始以及结束(代码看起来不够优雅,可读性差)
- 命名严禁使用拼音与英文混合的方式,不允许直接使用中文(英文拼写和语法让阅读者易于理解,避免歧义,通用的拼音国际名称可以【
taobao \ alibaba
】) - 类名使用驼峰命名【
UpperCamelCase
】 - 方法名、参数名、成员变量、局部变量统一使用帕斯卡命名【
getHttpMessage() \ inputUserId
】 - 常量命名全部大写,单词间用下划线隔开,语义表达完整,不嫌名字长【
MAX_STOCK_COUNT
】 - 抽象类命名使用Abstract或者Base开头;异常类命名使用Exception结尾;测试类以测试的类开头,Test结尾。【见其明知其意】
- 中括号是数组类型的一部分:【
String[] args;
反对String args[];
】 - 包名统一使用小写,点分隔符之间有且只有一个自然语义英语单词。包名统一使用单数形式,如果类名有复数含义,类名可以使用复数。【
com.kfm.open.util
MessageUtils
】
-
常量定义
- 不允许任何未经定义的常量直接出现在代码中
- long或者Long初始赋值时,必须大写L,小写的容易和数字1混了
-
代码风格
-
大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则:
1) 左大括号前不换行。
2) 左大括号后换行。
3) 右大括号前换行。
4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
-
左右小括号与括号内的字符之间不加空格
-
任何二目、三目运算符的左右两边都需要加一个空格
-
缩进采用 4 个空格,禁止使用 tab 字符
public static void main(String[] args) { //缩进四个空格 String say = "Hello"; // 运算符的左右必须有一个空格 int flag = 0; // 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格 if (flag == 0) { System.out.println(say); } // 左大括号前加空格且不换行;左大括号后换行 if (flag == 1) { System.out.println("world"); // 右大括号前换行,右大括号后有 else,不用换行 } else { System.out.println("ok"); // 在右大括号后直接结束,则必须换行 } }
-
2、关键字
全部都是小写
Java注释
1、单行注释
//书写在一行的注释 用 ‘//’ 在Eclipse中快捷键 Ctrl+/
2、多行注释
/*
* 多行注释
* 在Eclipse中 鼠标选中需要注释的代码 Ctrl+Shift+/
*/
3、文档注释
概念:
如果想为程序生成像官方的JDK文档一样的文件,可以使用文档注释对代码进行注释,并通过 javadoc
命令生成注释文件。
/**
*测试文档的注释
*@author 作者
*@paramete 参数及其意义
*@return 返回值
*@version 版本
*/
案例:生成一个java文档
1.一个java文件
public class Introduce{
/**
*文档注释
*@author bigdata7
*@version 1.0
*@param args :字符串数组参数名[]
*String是指参数类型 中括号可以在args后面也可以在String后面
*/
public static void main(String[] args){ //java运行入口函数
System.out.println("Hello World!");
}
}
2.生成java文档【一个文件夹里面有许多文件,会生成一个网页式的】
D:\kaifamiao\java se\coding\0825>javadoc Introduce.java
正在加载源文件Introduce.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 11.0.2
正在构建所有程序包和类的树...
正在生成.\Introduce.html...
正在生成.\package-summary.html...
正在生成.\package-tree.html...
正在生成.\constant-values.html...
正在构建所有程序包和类的索引...
正在生成.\overview-tree.html...
正在生成.\index-all.html...
正在构建所有类的索引...
正在生成.\allclasses-index.html...
正在生成.\allpackages-index.html...
正在生成.\deprecated-list.html...
正在构建所有类的索引...
正在生成.\allclasses.html...
正在生成.\allclasses.html...
正在生成.\index.html...
正在生成.\help-doc.html...
D:\kaifamiao\java se\coding\0825>
数据类型
为什么分这么多类信息:计算机的内存空间有限,所在在使用数据类型时 量入为出
为什么1byte是8个字节 (2的8次方 256 分开加符号位 ) -128((-2)^7) ~ 127((2^7)-1)范围
1byte = 8bit
E是9位
原码、反码、补码:
机器数:
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
3 :我们很清楚,3 的二进制数是 0000 0011
+3 :最高位标识正负 +是0,-是1,所以 +3 的机器数是 :0000 0011 【第一个符号位】
-3 :机器数:1000 0011 【最高位第一位标识符号,负为1】
真值:
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131
)。
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
0000 0001的真值 = +000 0001 = +1
1000 0001的真值 = –000 0001 = –1
对于一个数, 计算机要使用一定的编码方式进行存储,原码, 反码, 补码是机器存储一个具体数字的编码方式。
原码:
概念:原码就是真值的符号位加上真值的绝对值,即用第一位表示符号位,其余位表示值。
理解:原码就是一个数的真值(二进制表达的最高位来表示符号位,负1,正0)
[+1]原 = 0000 0001
[-1]原 = 1000 0001
反码:
概念:正数的反码是本身;负数的反码是符号位不变,其余位取反
[+3]反 = 0000 0011
[-3]反 = [1000 0011]原 = 1111 1100
[-1]反 = [1000 0001]原 = 1111 1110
补码:
概念:正数的补码是本身;负数的符号位不变,其余位取反,再加1
理解:即正数的原码、补码、反码三码相同;负数的补码是反码基础上最后跟1
[+3]原 = 0000 0011 [-3]原 = 1000 0011
[+3]反 = 0000 0011 [-3]反 = 1111 1100
[+3]补 = 0000 0011 [-3]补 = 1111 1100 1
原因:
为了解决原码做减法的问题, 出现了反码;
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数,这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].【java补码存储】
常量:
【立即量,编译过程中就可以确定的值】
-
根据场景合理选择数据类型
类型 例子 说明 int 1234 默认整数 long 12345678901L 大小写都行 double 3.14 默认小数 float 2.14F 大小写F String “字符串” 引用类型字符串常量 boolean true\false 布尔类型 Object null 标识没有对象
基本数据类型
数值类型
默认小数类型是double,float需要后面加f;整数超过一定值是long,要在后面写l来标明是long类型,否则会报编译错误
-
精确类型
- byte【1个字节(byte),8位有符号数】
- short【】
- int【4字节,32位有符号数】
- long【8字节,64位有符号数 19位10进制】
-
浮点类型
-
float【4字节,32位有符号数 -3.4E38 ~ 3.4E38】后缀F
为什么float用4字节,表示范围大于8字节的long?
float一定是不精确的 【符号位 指数 (小数位)尾数】
-
double【8字节,64位有符号数 -1.7E308 ~ 1.7E308】后缀D
-
字符类型(char)【2字节,16位unicode字符 0~65535】
占两个字节 只能存一个字符 可以是中文 可以用数字赋值
注意区分char(单引号)和String的区别 String双引号
布尔类型(false、true)【1字节】
String转换不成布尔类型 int无法转换为布尔类型
引用数据类型
- 数组(Array)
- 类(Class)
- 接口(Interfacer)
基本数据类型的转换
7中基本数据类型之间可以互转,boolean类型无法和其余7中转换
默认转换(小转大):
-
赋值,小的数据类型会转换成大的数据类型(这里的大小指表示范围,而不是占用空间)
-
进行运算:小数据类型先转换成大数据类型,再进行计算
-
见串得串:和字符串(String)运算时,结果还是字符串
-
默认提升:比int类型小的数据类型(byte, short【2byte】,char【2byte】)在运算过程中会先转换成int再进行运算
byte byte1 = 2; short short1 = 2; byte byte2 = byte1 + short1; //它们运算是先转换成int再运算的,结果还是int //-->会报错 应该是int类型强制转换成byte byte byte2 = (byte)(byte1 + short1); char char1 = 'a'; //97 int int2 = 'a' + 1; //98 char1++; //char可以自加 char1+=1; //char可以加等
-
常量:立即量,编译过程中就可以确定的值
final x1 = 1111;//这不是常量,是不可变变量 int int1 = 12345678901;//不合适 太大超出范围 long long1 = 12345678901;//也不合适 long long2 = 12345678901L;//表示long型常量 后边L大写一般,小写和1容易混淆
-
不默认提升:
- 编译优化:
byte byte1 = 24 + 1; —>优化 byte byte1 = 25;
- 自加操作:
byte1++;
- 加等操作:
byte1+=2;
- 编译优化:
-
强制转换(大转小):
-
大小还是指表示范围
-
坑多,会损失精度
-
强转运算
补码存储
int int1 = 1; short short1 = (short)int1;
-
合理选择数据类型
- 使用场景,用户需求
- 合理的值域
- 操作的方便性
- 资源稀缺性(内存,存储,网络传输)
运算符
ctrl + 1 快速修正
运算符就是告诉程序执行特定的运算操作的符号。
Java运算符按功能可分为:赋值运算符、算数运算符、关系运算符、逻辑运算符、条件运算符(三目运算)和位运算符。
赋值运算
赋值运算符 “ = ” 用于给变量赋值。可以和算术运算符结合,组成复合赋值运算符(+=、-+、*=、/=、%=
、&=、|=、)
示例
int i=3;
int j=5;
i = i + j; //可以用 i+=j;代替 一般写作
注意(小贴士):
byte b1 = 1;
byte b2 = 2;
/*
*使用 += 时不进行类型转换 b1+=b2 b1还是byte类型
*使用 + 时需要类型转换 b1 = (byte)(b1 + b2); 才合适 byte余byte运算是int类型
*/
算术运算
概念:
许多语言中的取模运算只能用于整数型,Java对此做了扩展,它允许对浮点数进行取模操作。例如,3%2 的结果是 1, 15.2%5 的结果是 0.2。取模操作还可以用于负数,结果的符号与第一个操作数的符号相同,例如,5%-3 的结果是 2,-5%3 的结果是-2。
符號:
算术运算符包括通常的加(+)、减(-)、乘(*)、除(/)、取模(%),完成整数型和浮点型数据的算术运算。
特殊:
此外,算术运算符还有“++”和“–”两种,分别称为加1和减1运算符。这两种运算符有前缀形式和后缀形式,含有有所不同。例如,i++ 和 ++i 的执行顺序是不一样的,i++ 在 i 使用之后再 +1,++i 在 i 使用之前先 +1。i-- 和 --i 的情况于此类似。
// 加、减、乘、除、取余、自增(先执行,后自加)、自减(+、-、*、/、%、++、--)
int a = 1;
int b = 2;
System.out.println(a/b);//算术值应该是0.5 会转成int类型出来0
System.out.println(a%b);//余数0.5 出来0
System.out.println(b%a);//余数1
System.out.println(b++);//先输出b,后在使用时自加
System.out.println(++b);//先自加 后执行
System.out.println(b--);//先执行输出,后在使用时自减
System.out.println(--b);//先自减 后执行
int i=1;
i++;//i=1
i--;//此时 i=1+1 使用i则先把上次的i++运算做了 i=2 然后i--不运算 此时i为2
--i;//此时 i=2-1 使用i之前做上次的i--运算 再直接自减 不用先输出i再自减了 此时i=0
关系运算【比较运算符】
-
关系运算符都是二元(两个操作数)运算符。
比较运算符运算完返回布尔值(true或false)
- == 和 != 可以用于任何数据类型,之后的只能用于数值类型
- == 和 != 既可以判断两个数的值是否相等,也可以判断对象或数组的实例是否相等。判断实例时比较的是两个对象在内存中的引用地址是否相等。
“==” 是等于运算符 “=” 是赋值运算符
运算符 含义 示例 结果 == 等于 2==3 false != 不等于 2!=3 true > 大于 2>3 false < 小于 2<3 true >= 大于等于 2>=3 false <= 小于等于 2<=3 true
逻辑运算
符号:
逻辑与(&)、逻辑或(|)和逻辑非(!)
短路逻辑运算符(&&、||):
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。同理,左边操作数为false,则短路或的右边也是false,则右边不进行运算。
- 什么情况下使用短路逻辑运算符:【防止空指针保护】
三目运算(目是操作数)【条件运算符】
- 三个操作数,简化分支结构
- 语法:
布尔表达式 ? 表达式1 :表达式2;
x = 2 < 3?2:3;
输出x=2.
位运算
-
位运算符用来对二进制位进行操作,包括按位取反(~)、按位与(&)、按位或(|)、异或(^)、右移(>>)、左移(<<)和无符号右移(>>>)。位运算符只能对整数型和字符型数据进行操作。
1. 取反(~)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
2. 按位与(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1,结果才为“1,否则为0。
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3 & 5的值得1。
3. 按位或(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3 | 5,即 0000 0011 | 0000 0101 = 0000 0111 因此,3 | 5的值得7。
4. 异或(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
5. *左移(<<)*
运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。例如: 12345 << 1,则是将数字12345左移1位:
位移后十进制数值变成:24690,刚好是12345的二倍,所以有些人会用左位移运算符代替乘2的操作,但是这并不代表是真的就是乘以2,很多时候,我们可以这样使用,但是一定要知道,位移运算符很多时候可以代替乘2操作,但是这个并不代表两者是一样的。
6. 右*移(>>)*
同样,还是以12345这个数值为例,12345右移1位: 12345>>1。
右移后得到的值为 6172 和int 类型的数据12345除以2取整所得的值一样,所以有些时候也会被用来替代除2操作。另外,对于超过32位的位移,和左移运算符一样,,会先进行位数求余数。
-
7. 无符号右移(>>>)*
无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的。以下是-12345二进制表示:
右移运算符中,右移后补0,是由于正数 12345 符号位为0 ,如果为1,则应补1。
package com.bigdata.practice0827;
public class OptionalTestDemo {
public static void main(String[] args) {
//算术运算 + 赋值运算(=)
//test1();
//比较运算符
//test2();
//逻辑运算符
test3();
}
private static void test3() {
/*
* 逻辑运算符:用于对两个布尔值进行运算 结果还是布尔值
* &:与 理解:必须均为true才为true 【什么和什么】
* |:或 理解:必须全为false才是false 【要么什么、要么什么】
* !:非 理解:取反 !true结果为false
* &&:短路与 理解:左边全为false,则必为false右边不进行计算
* ||:短路或 理解:左边全为true,则必为true右边不进行计算
* */
//使用短路运算能够避免空指针的错误
System.out.println(true&&outBool()); //true 短路与 右边为真则真【需要右边联合判断】
System.out.println(!true&&outBool()); //短路与 一旦左边false 则结果必是false 不会运行右边的
}
private static boolean outBool() {
System.out.print("我运行了");
return true;
}
private static void test2() {
/*
* 比较运算符:==(等于),!=(不等于),>,<,>=,<=
* 注意区分 == 与 = 的区别,一个是比较运算符等于,一个是赋值运算符
* <,>,<=,>= :只能比较数值类型的 优先级高于 == 和 !=
* == , != :支持所有数据类型的比较
* 关系表达式的运算结果是 boolean类型的值 (true和false)
*
* */
System.out.println(3>=5==false); // 3>5 是 false,false与false比较结果是正确即true
}
private static void test1() {
// TODO Auto-generated method stub(待办列表的意思)
/*
* 算术运算:+、-、*、/、%、++、--
* */
int a=1; //给局部变量 a赋值为1
int b=2;
String str="字符串";
byte b1=4;
byte b2=5;
System.out.println(b1+b2); //进行 b1+b2 运算时 先转为 int 类型再运算 出来是 int 类型的数据
System.out.println(b1=(byte)(b1+b2)); //b1=b1+b2 会报错 它们值是int类型的赋给了byte类型的变量 所以需要强转
System.out.println(b1+=b2); //b1+=b2 指的就是 b1+b2 但是用 += 运算在运算时不会做转换类型操作 结果还是byte类型
//System.out.println(a/b); // 1/2=0.5 取整数位 0
//System.out.println(b/a); // 2/1=2
//System.out.println(a%b); // 1%2 余数为1
//System.out.println(b%a); // 2%1 余数为0
System.out.println(a++); // 1+1=2 先输出a 再进行自加 即输出a=1,但此时a的值已经是2
System.out.println(a); // a=2
System.out.println(++a); // a=2 的基础上 ++a 自增 即此时 a=3 ,++a表示a先自加1再输出 所以 a=3
System.out.println(a); // a=3
// 同理 --在后 输出时先输出再自减 --在前面先自减再输出
System.out.println(a--); // a=3 先输出即输出a=3 但同时a已经自减为2 下面再输出
System.out.println(a); // a=2
System.out.println(--a); // 先a=2-1再输出a 此时a=1
System.out.println(a+str); // 输出字符串 "1字符串" 加号中使用字符串 结果则是字符串的连接
}
}
运算符的优先级:
操作数越少优先级越高
优先级从高到低 同级从左到右
键盘输入:
从键盘导入数据要使用 Scanner
类的方法获取用户从键盘输入的数据。
Scanner類:
1.导入:import java.util.Scanner;
2.创建对象:Scanner scanner = new Scanner(System.in);
3.从键盘上获取用户输入的数据:
方法名称 | 说明 |
---|---|
String next() | 获得一个字符串 |
int nextInt() | 获得一个整数 |
doublenextDouble() | 获得一个双精度浮点数 |
boolean hasNext() | 判断是否有输入数据,输入则返回true,不然返回false |