JAVA基础语法归纳>>小白进阶~~java基础语法
>>Java概述
Java语言的发展历史
1991年出现,1995年正式发布
创始人:James Gosling
出生地:SUN 被Oracle公司在这里插入代码片
最新的JDK的版本: 2020年发布JDK14
Java体系: JavaSE 标准版 java基础,桌面应用开发JavaEE 企业版 javaweb,网站(京东,丁香医生,企业ERP)JavaME 微型版 被Android替代
Java文件运行过程
如何在cmd中运行java程序?
步骤1: win+r ,输入cmd
步骤2: 切换盘符 例如:你程序在d盘 D:回车
步骤3: 切换目录 cd 目录名称 回车
步骤4: 先编译java源文件javac 文件名.java
步骤5: 再运行字节码文件java 类名
JDK&JRE&JVM
JDK Java开发工具集,包含一系列用于操作java程序,字节码文件的工具,比如编译工具,文档工具,打包
工具等
JRE Java运行时环境,主要包含的用于支持java程序运行的类库,Java虚拟机(JVM)
JVM Java虚拟机
GC 垃圾回收机制
【面试题】为什么Java可以跨平台?因为Java有JVM,JVM运行的是与平台无关的字节码文件可以一次编译处处运行,不同的平台都会安装JDK,JDK中包含虚拟机。
环境变量配置
环境变量,为了告诉其他需要基于java环境运行的软件,jdk所在的路径;以及可以快捷的通过cmd操作java相关的
工具
环境变量配置分为两步:
1. 配置 JAVA_HOME:JDK所在的安装路径(默认位置:C:\Program Files\Java\jdk1.8.0_101)
2. 配置 Path:JDK所在的安装路径的bin目录(默认位置:%JAVA_HOME%\bin)
3. 配置Classpath:配置字节码文件所在地址(JDK5之后,会自动寻找当前目录下的字节码文件,因此不再需要
配置)
Java程序运行原理
java是一门高级语言;是一门跨平台的语言(一次编写,运行在任何支持JVM的操作系统中windows,mac,linux),
集编译和解释为一体,任何一个java文件在执行前都需要经过一个编译的过程,然后再通过JVM执行.
- 先将Java源文件(.java)编译为字节码文件(.class)
javac HelloWorld.java
- 通过jvm运行字节码文件(*.class)
java HelloWorld
常见的windows命令
1. 进入指定盘符(进入d盘)d:
2. 进入当前盘符的根目录cd \
3. 列出当前目录下所有资源dir
4. 进入指定目录cd 目录名
. 表示当前目录
.. 表示上一级目录
Java程序编写与执行
类的定义{入口的声明(){//程序的入口,main函数,main方法public static void main(String[] args) {//系统输出,在命令窗口(控制台)打印一行文本//执行体}
}
代码编写基本规范
1. Java程序的最基本单元是class
2. 一个java文件中只能存在一个public class
3. 文件名称必须和公共的类名称保持一致(包括大小写)
4. 括号成对出现
5. 开始花括号之前保留一个空格
6. 左大括号开始之后的代码,保持缩进(一般4个空格)
7. 一行语句结束之后使用 ; (英文半角)
>>Java基础语法
注释
// 单行注释 ctrl+/
/* 多行注释 ctrl+shift+/ 取消多行注释 ctrl+shift+\ */
/** 文档注释,可以使用javadoc.exe工具生成帮助文档 */
设置类上的注释模板 Code Template
关键字&标识符
关键字(keyword)
Java中有50个关键字
关键字:赋予特殊作用的小写单词
Java中包含一系列用作于特殊用途的英文单词,比如,定义一个类使用: class ;声明一个方法没有返回值类型使
用: void ;定义一个软件包使用: package ;所有的英文单词都是小写的;以上这些在Java中都称之为关键
字。Java中包含的所有关键字如下:
null,true,false:严格意义上属于值,不包含在关键字范畴
goto和const在Java中作为保留关键字,不允许使用
分隔符&标识符
分隔符
一条语句是以分号(;)结尾的一行代码
一个语句块是以一对花括号({})为边界的语句的集合
Java中允许有任意多的空格 ,包括换行;
标识符
概念:给变量,类,方法,包 取名字
要求:
符合阿里编程规约
1. 标识符命名必须遵循见名知意
2. 尽量使用英文单词(拼音)作为标识符名称
3. 标识符严格区分大小写
4. 包名称建议全部使用小写英文单词
5. 类名称使用驼峰式(大驼峰)写法,首字符大写,如果是多个单词组合而成,每个单词的首字符都大写,中间不
能留空格
6. 变量名和方法名使用驼峰式(小驼峰)写法,首字符小写,如果由多个单词组合而成,除第一个单词外,其余的
每个单词首字符大写
注意事项
1. 标识符中不能出现除“_”和“$”之外的其他任何特殊符号("$","_"可以出现在标识符的任意位置)
2. 数字只能出现在中间和末尾,不能出现在代码的开头处
3. 空格不能出现在标识符之间
4. 关键字不能作为标识符名称
5. 不要使用JDK中内置的类名称作为标识符名称,可能会导致不可预料的后果
6. 不要使用中文作为标识符名称,可能会导致乱码
安装阿里巴巴编程规约插件
变量(variables)
1. 常量(不可改变的数据值)常量在Java中一般用于表示某一个特定值,而且该值一旦使用则无法改变,因此称之为常量1.直接量2.自定义常量
2. 变量(可以更改的数据)能储存计算结果或能表示值抽象概念。变量可以通过变量名访问编程语言中用于描述数据的最基本的单元称之为变量;变量的定义实际就是在向JVM申请内存空间;变量的定义语法:数据类型 变量名称 [= 初始值]
三要素
变量类型 变量名 = 值;
拆分为2个步骤://声明数据类型 变量名; //赋值变量名 = 值;
解释: 1.变量名必须符合标识符命名规范,阿里编程规约变量名采用小驼峰命名法2.基本数据类型 和 引用数据类型8个(byte short int long float double char boolean)其他都是引用数据类型(数组,类,接口,枚举)3. 值必须匹配数据类型4. 变量通常是可变的,可以重复赋值
变量的使用位置
在同一个范围内,变量名不能相同
变量的定义可以在一个Java程序的多个位置出现:
1. 类结构中直接定义
2. 方法的参数中定义
3. 方法结构体中定义
4. 其他语句块(分支,循环,游离快,构造器)
根据变量的定义位置不同,称呼也存在区别,Java中的变量分为两种:
1. 全局变量
类结构中直接定义的变量称之为全局变量
2. 局部变量
除类结构之外,其他任何地方定义的变量都称之为局部变量
局部变量 和 成员变量 区别
数据类型
在java开发中,大多数时间都是在对数据进行操作,比如:登录,注册,搜索商品,下订单,转账等。既然是数据,
就有类型之分;不同的数据类型也不同。
java是一门强类型(弱类型:JavaScript、python)语言,任何的变量在声明之前都必须显式的指定其数据类型,并
且,在使用过程中数据类型不能够改变。Java中的数据类型分为两个大类:第一类称之为基本数据类型;第二类称
之引用数据类型(面向对象)。
数据类型分类
基本数据类型(8个)
基本类型数据也称之为简单类型,通常用于描述一个基本值,比如说:一个整数,一个字符,一个小数,一个
true、false值等;java中的基本类型数据分为以下四类八种:
整数类型(byte short int long)
浮点类型(float double)
字符类型(char)
布尔类型(boolean)
整数类型
整数类型一般用于表示一个整数(包含正负数),整数类型主要包含4个:
byte(文件操作时常用)
short
int(推荐)
long(时间毫秒数,文件字节数)
注意事项:
1. java中默认的整数类型是int
2. 任何整数类型的运算结果都会转换为int类型
3. 声明long类型变量时,数据值必须在末尾跟上“L”
计算机基础知识:
1字节(byte) = 8位(bits) 计算机底层能够识别的只能是0和1
0000 0000 ~ 1111 1111
十进制和二进制之间转换
// 若给long类型的变量赋值,值超过了int的取值范围
// 添加L或者l拓展:
// byte a2 = (byte) 128; 请问 a2的值为多少?
byte a2 = (byte) 128;
System.out.println(a2); // -128
byte a3 = (byte) 129;
System.out.println(a3); // -127
// 因为值最终都会转换成2进制数
// 十进制数中: 128 = 127 + 1
// 二进制: 127 (0111 1111)
// 1 (0000 0001)
// 1000 0000 如何转换成十进制数?
// 求一个负数的二进制数?
// -7
// 步骤1:先求7的二进制数
// 0000 0111 (原码)
// 步骤2:取反(0的变成1,1的变成0)
// 1111 1000 (反码)
// 步骤3:+1
// 1111 1001 (补码)
// 1000 0000 转换成 十进制
// 步骤1:减1
// 0111 1111
// 步骤2:取反
// 1000 0000
// 步骤3:计算结果128,前面加一个负号
// -128
浮点类型
java中对于小数类型的表示称之为浮点类型,浮点类型包含两种:
-
float float 保留8位有效的小数
-
double double保留 16位有效的小数
注意事项;浮点类型的默认值为 0.0
1. java中默认的浮点数类型为double
2. 表示一个float类型的数据必须在数值末尾追加“f”或“F”
3. 浮点类型一般用于对精度要求不高的运算中0
浮点类型的概念源之于科学计数法,比如表示一个大数值(10045.6)可以按如下方式表示:
1.00456 * 10^4
10.0456 * 10^3
0.100456 * 10^5
BigDecimal解决精度丢失问题
float与double精度丢失问题所有的整数转变为二进制数的算法会不会无限循环下去呢?绝对不会,整数永远可以用二进
制精确表示 ,但小数就不一定了。*2永远不可能消灭小数部分,这样算法将无限下去。
很显然,小数的二进制表示有时是不可能精确的BigDecimal
/ divide
* multiply
- subtract
+ add
x的n次方 pow(int n)
字符类型
Java中对于单个字符提供了一个char类型表述,区别于String类型(String用于表示一个字符串)
char类型是一个单一的 16 位 Unicode 字符;
最小值是 \u0000(即为0);
最大值是 \uffff(即为65,535);
char 数据类型可以储存任何字符;
注意事项:
String不是基本类型数据,是JDK中提供一个引用类型数据
char类型一般用于字符转码(编码转换);String的内部实现原理基于char类型(String本质上就是一个char数
组)
String类型用于表示一个字符串,值必须包含在双引号之间;而char类型用于表示一个字符,并
且字符包含在单引号之间。char类型除了可以表示单个英文字符外,还能表示中文字符,特殊符号等:关于转义符号“\”,java中对于特殊的符号可以使用“\”转义:
\b \t \n \f \r \" \' \\
\n 换行(LF) ,将当前位置移到下一行开头
\r回车(CR) ,将当前位置移到本行开头
\t水平制表(HT) (跳到下一个TAB位置)
\\代表一个反斜线字符\
\' 代表一个单引号(撇号)字符
布尔类型
布尔类型通常用于表示true或者false值,只占一个二进制位;因此布尔的取值只能是0和1;但是Java中只允许用
true和false表示boolean的值。布尔类型一般用于一些逻辑判断中,比如条件分支,循环的判断。
数据类型转换
在实际的项目经常会涉及到许多不同的基本类型数据的交替使用,因此,不同的基本数据类型之间会涉及到一些转
换需求;java中基本类型数据的转换遵循以下原则:
小转大,直接转 自动类型转换byte -> intchar -> intint -> double
大转小,需强转 强制类型转换int -> chardouble -> longlong -> byte
//强制类型转换(在需要被转换的变量或者值之前使用小括号,括号中写入需要转换成为的目标数据类型的类型名
称)
引用数据类型(自定义类型)
之前所有的基本类型数据都是用于表示一个简单的值,比如:一个整数,一个字符,一个小数,一个true、false
值;如果需要表示一个人,一只狗或者一条订单信息;对于以上复杂的数据来说,单纯使用一个基本类型的数据无
法全面表示;
所以,对于以上的需求无法通过一个基本类型数据来表示,因此,java中针对一些复杂的数据还提供了一种特殊的
数据类型-----引用数据类型
引用类型的呈现方式通常以一个类的形式存在,这里就涉及到了java中面向对象程序设计。java中的引用类型包含
以下三类:
1. 类的引用
2. 数组的引用
3. 接口的引用
数据类型强化问题
1、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?回答: 前面表达式有错误,s1+1中1是int类型,右边的结果为intint赋值给s1,s1为short,需要强制类型转换s1 = (short)(s1+1);后面的表达式没有错误,因为+=这种扩展赋值运算符会自动类型转换
2、char类型变量能不能储存一个中文的汉子,为什么?回答: char是2个字节16位,所以可以使用unicode编码表示只要是在unicode编码中文范围的汉字都可以存储4E00-9FA5但是也有特殊情况生僻字不能存储
3、Integer和int的区别回答: int 基本数据类型,只能用于算术运算,位运算Integer引用数据类型,类提供很多方法去便捷操作一些int值例如:10进制数转2进制数的方法
4、能否在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量?回答:不可以,虽然double 和 long 都是8个字节(64位),但是底层的存储结构不一样,double表示的范围 > long表示的范围所以把double值赋值给long需要强制类型转换
5、java 中 3*0.1 == 0.3 将会返回什么?true 还是 false?回答:java中float和double,在做运算的时候,会有精度丢失所以这个表达式的值为false
6、java 中 float f = 3.4; 是否正确?回答:3.4默认为double类型,若需要强制将3.4赋值给float需要强制类型转换也有其他解决方案。解决方案1: 3.4后面添加小f或者大F float f = 3.4F;解决方案2: 变量f的数据类型,改为 double double f= 3.4;解决方案3: 使用造型符号,强制类型转换 float f = (float) 3.4;
运算符
Java中提供了大量的用于操作数据的运算符号,这些运算符号分为以下几类:
算术运算符
关系运算
布尔逻辑运算
位运算符
三目运算
其他(扩展赋值,字符串拼接,赋值,造型)
算术运算符
算术运算符主要用于对基本类型的数据(整数,小数)进行类似加减乘除等算术运算;二元运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ph3CUxWi-1607152233139)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\1607150720349.png)]
+ 加法 ― 减法 * 乘法 / 除法 % 求余数 ++ 自增 ―― 自减
++a 和 a++的区别
++a 先+1,再给表达式(++a)赋值
a++ 先给表达式(a++)赋值,再+1不论a++还是++a,都是对a进行+1操作算术运算注意事项:
1. 任何整数类型进行算术运算都会将结果转换为int类型
2. 任何数值类型跟浮点进行算术运算都会转换为double类型
关系运算符
关系运算一般用于对于基本类型数据的大小比较,等于比较,另外也可以对两个引用类型对象的地址进行比较,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBdgzcRT-1607152233140)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\1607150849421.png)]
1. 关系运算符,结果为boolean类型
2. > 大于 < 小于 >= 大于等于 <= 小于等于 == 等于 != 不等于==和!=可以用于对引用类型对象的地址比较
布尔逻辑运算符
1. 布尔逻辑运算符,结果为boolean类型
2. !逻辑非 &逻辑与 |逻辑或 ^ 逻辑异或 &&短路与 ||短路或
3. 特点 ! 取反& 和 && 一假即假| 和 || 一真即真^ 同假异真
注意事项:
1. 布尔逻辑运算的操作数都是boolean类型变量
&和&&区别?
&:逻辑与,在进行运算时不论运算符左侧的表达式结果是否为true,右侧的表达式始终会执行;
&&:短路与,在进行运算时一旦运算符左侧的表达式结果为false,则右侧表达式不再执行
位运算
计算机底层最终只能够识别0和1,不论多么复杂的表达式,到计算机底层都会进行二进制加法运算,java中对于位
运算包含以下运算符号:
& 按位与 | 按位或 ^ 按位异或 ~ 按位取反
>> 右移运算符 << 左移运算符 >>> 无符号右移运算符
1. 需要将值,转换成二进制数再运算
2. 特点, ~ 1变0 0变1& 有0则为0| 有1则为1^ 相同为0 不同为1
3. 运算符优先级从高到低 ~ & ^ |m>>n m向右移动n位
步骤:先将m转换成二进制数,二进制数向右移动n位,等价于除以n个2m<<n m向左移动n位
步骤:先将m转换成二进制数,二进制向左移动n位,等价于乘以n个2
赋值运算符
= 赋值运算符
扩展赋值运算符:+=,-=,*=,/=,%=,^=,&=,|=,>>=,<<=,>>>=
三目运算
三目运算符也称之三元运算,运算符具备逻辑判断的功能,语法:
数据类型 变量名 = 逻辑表达式?值1:值2;解释: 逻辑表达式的值为true,则把值1赋值给变量否则把值2赋值给变量复杂的三目运算使用:
//输入一个分数(0~100),根据该分数所在的区间显示分数对应的等级(ABCDE)
// <60 E
// <70 D
// <80 C
// <90 B
// >=90 A
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int s = sc.nextInt();char c = s < 60 ? 'E' :s < 70 ? 'D' :s < 80 ? 'C' :s < 90 ? 'B' : 'A';System.out.println(c);
}
拓展 a>b?a:c>d ?c:d;运算顺序?
三目运算符嵌套使用,规律运行:从左往右结合律:从右往左 (如何加括号)a>b ? a :(c>d ?c:d);先执行 a>b情况1: true, 直接输出 a 结束情况2: false,再执行 c>d ,true输出c,否则输出d
其他运算符
扩展赋值运算(+= -= *= /=)
赋值运算(=)
字符串拼接运算(+)
造型运算((type))
运算符的优先级
不同的运算符计算顺序也不同,比如数学中:先乘除出后加减;Java中的运算符优先级如下:
标准输入和随机数
Scanner基本使用
Scanner是JDK中内置的一个类,可以用于对系统输入内容扫描,读取控制台输入的数据,具体使用方式如下:
public static void main(String[] args){Scanner sc = new Scanner(System.in);//获取控制台输入的整数int i = sc.nextInt();
}
Math类与随机数使用
java中提供了一个Math类,是一个工具类,内部主要包含的是一些工具方法,比如,求两数的最大值,最小值,
绝对值,四舍五入,随机数;这些所有的方法都可以直接通过类名称调用。
//随机获取从0.0~1.0(不包含)之间浮点数
//0.000000~0.999999
//0~9.999999 + 1
double d = Math.random();
System.out.println(d);
//随机1~10之间的整数?
int i = (int)(Math.random() * 10) + 1;
System.out.println(i);
//随机从[0,10]之间的整数 开闭区间 0.99 * 11
i = (int)(Math.random() * 11);
System.out.println(i);
//随机获取从[5,10]之间的值?
i = (int)(Math.random() * 6) + 5;
System.out.println(i);
main(String[] args){
Scanner sc = new Scanner(System.in);
//获取控制台输入的整数
int i = sc.nextInt();
}
#### Math类与随机数使用java中提供了一个Math类,是一个工具类,内部主要包含的是一些工具方法,比如,求两数的最大值,最小值,
绝对值,四舍五入,随机数;这些所有的方法都可以直接通过类名称调用。```java
//随机获取从0.0~1.0(不包含)之间浮点数
//0.000000~0.999999
//0~9.999999 + 1
double d = Math.random();
System.out.println(d);
//随机1~10之间的整数?
int i = (int)(Math.random() * 10) + 1;
System.out.println(i);
//随机从[0,10]之间的整数 开闭区间 0.99 * 11
i = (int)(Math.random() * 11);
System.out.println(i);
//随机获取从[5,10]之间的值?
i = (int)(Math.random() * 6) + 5;
System.out.println(i);