Java基础(一)
基本概念:
位(bit):一个数字0或者一个数字1,代表一位
字节(byte):每逢8位是一个字节,这是数据存储的最小单位。
1 byte = 8 bit
1 KB = 1024 Byte…
Java虚拟机————JVM(Java Virtual Machine)
跨平台性————Java程序跨平台,JVM是各自的,不跨平台
JRE和JDK
JRE:Java程序运行时的环境包含JVM和运行时所需的核心类库。
JDK:Java程序开发工具包,包含JRE和开发人员使用的工具。
运行Java程序只需JRE即可,开发则需JDK。
%SystemBoot%————两个%中间包含的是地址,本例指代C:Windows…
又如%Java_Home%,Java_Home存放放Java的JDK的地址,使用%%包起来达到多次循环使用。
Java源程序->编译器编译->字节码—>JVM运行
.java->编译->.class
注释————单行注释( //注释内容 ),多行注释,也称区块注释( /* 注释内容 */ )。
第一个Java程序
//第一行的最后一个单词必须和所在文件名称完全相同,区分大小写。
//public class后面定义的是一个类名,类是Java当中所有代码的基本组织单位。
public class HelloWorld {
//第二行的内容是万年不变的固定写法,代表main方法
//这一行是程序执行的起点
public static void main(String[] args){
//第三行是打印输出语句(其实就是屏幕显示)
//希望显示什么内容就在小括号中写什么内容
System.out.println("hello world!");
}
}
关键字:完全小写的字母,在增强版的记事本当中有特殊颜色
例如:public void
标识符——自己定义的内容,比如类名、方法名和变量名等。
命名规则 (硬性要求)
标识符可以包含26个字母,数字,美元符号和下划线
不能以数字开头
标识符不能是关键字
命名规范 (软性要求)
类名规范:首字母大写,后面每个单词首字母大写。(大驼峰式)HelloWorld
变量名规范:首字母小写,后面每个首字母大写。(小驼峰式)helloWorld
方法名规范:同变量名。
常量
程序运行期间,固定不变的量
字符串常量:凡是双引号引起来风部分
整数常量:直接写上的数字,没有小数点。
浮点数常量:直接写上数字,有小数点。
字符常量:凡是用单引号引起来的单个字符,就叫做字符常量//‘’中间不能没有且只能有一个。
布尔常量:只有true、false
空常量:代表没有任何数据。//不能直接打印
基本数据类型
整数型
- byte 1字节
- short 2字节
- int 4字节
- long 8字节(1字节=8位)
浮点型
float 4字节(3.4E+38,表示3.4乘10的38次方,科学计数法)单精度。
double(默认)8字节
字符型 char 2字节
布尔型 boolean 1字节 true false
( 科学技术法省空间,范围和内存占用不一定相关 )
引用数据类型
- 类
- 数组
- 接口
- lambda
注意:
字符串是引用类型
浮点型可能只是一个近似值,并非精确值
数据的范围与字节数不一定相关,例如float数据范围更加广泛,但是float是4个字节,long是8字节
浮点数中默认类型是double,如果一定要使用float类型,需要加上一个后缀F
如果是整数默认是int类型,如果一定要使用long类型,需要加上一个后缀L,推荐使用大写字母后缀。
变量
程序运行期间,内容能够改变的量
创建一个变量并且使用的格式
数据类型 变量名称//创建一个变量
变量名称 = 数据值//赋值
数据类型 变量名称 = 数据值//创建一个变量的同时,立即赋值
注意:右侧的值不能超过类型所表示的数据范围
变量的使用的注意事项:
1、如果创建多个变量,那么变量之间的名称不能重复
2、对于float和long类型的变量,字母后缀的F和L不能丢掉
3、如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的范围
4、没有进行赋值的变量,不能直接使用,一定要复制之后才能使用
5、变量使用不能超过作用域的范围
【作用域】从定义变量的第一行开始,直到所属的大括号结束为止。
6、可以通过一个语句来创建多个变量,一般情况不推荐这么写。
小结:
数据类型->基本数据类型,引用数据类型
基本数据类型:四类八种
引用数据类型
数据类型转换
当数据类型不一样时,会发生数据类型转换
自动类型转换(隐式)
- 特点:代码不需要进行特殊处理,自动完成
- 规则:数据范围从大到小。(与字节数不一定相关)
强制类型转换(显式)
- 特点:代码需要进行特殊的格式处理,不能自动完成。
- 格式:范围小的类型 范围小的变量名 = (范围小的类型)原本范围大的数据
例如:int num = (int)100L;
注意事项:
- 强制类型转换一般不建议使用,因为可能发生精度损失、数据溢出。
- byte/short/char 这三种类型都可以发生数学运算,例如加法“+”。
- byte/short/char 这三种类型在运算时,都会被首先提升成为int类型,然后再计算。
例如:byte num1 = 30;
byte num2 = 40;
int result = num1 + num2;//类型为int,如果之前的类型为其他类型则会报错 - boolean不能发生类型转换。
编译器的常量优化:
对于byte/short/char三种数据类型来说,如果右边赋值的数值没有超过范围,
那么javac编译器将会自动隐含的为我们补上一个强制转换(byte)(short)(char),
超过了就会报错。
数字和字符的对照关系表(编码表):
ASCII码表:American Standard Code for Information Interchange,美国信息交换标准码表。
Unicode码表:万国码。也是数字和符号的关系对照表,开头0-127部分和ASCLII完全一样,128之后包含更多字符。
只需记住三个:48————‘0’ 65————‘A’ 97————‘a’
运算符
运算符:进行特定运算的符号。
表达式:用运算符连起来的式子叫做表达式。
基本运算符
四则运算: + - * / (加减乘除)
取模(取余数):%
只有整数的取模才有意义。
被除数/余数:商…余数
除法只看商不看余数,即向下取整。
首先计算得到表达式的结果,然后再打印输出这个结果。
注意事项:一旦运算符当中有不同类型的数据,那么结果将会是数据类型范围大的那种。
四则运算当中加号“+”有三种常见的用法:
1、对于数值来说,那就是加法。
2、对于字符char来说,在计算之前,char会先被提升成为int,然后在计算再计算。
char类型字符和int类型数字之间的对照关系表:ASCII、Unicode
3、对于字符串String(首字母大写,不大写不是关键字)来说,加号代表字符串连接操作。
自增自减运算符:++ ,–
使用方法:
1、单独使用:不和其他操作混合,独立成为一个步骤。
2、混合使用:和其他操作混合,例如与赋值混合或者与打印操作混合等。
使用区别:
1、单独使用没有任何区别
2、混合使用有重大区别,++num,num++
3、常量不能使用自增自减运算符
赋值运算符
基础运算符:=
复合运算符:+= -= *= /= %=
注意事项:
1、只有变量才能使用赋值运算,常量不能进行赋值。
2、复合赋值运算符中隐含了一个人强制类型转换。
比较运算符
== != < <= > >=
注意事项:
1、比较运算符的结果是一个布尔值
2、如进行多次判断,不能连着写(例如:1<y<3是错误写法,正确写法:1<y&&y<3)
逻辑运算符
与-&& 或——|| 非——!
短路效果:
与“&&” 或“||”,如果根据左边已经可以得到最终结果,那么右边的代码将不再执行,从而节省一定性能。
注意事项:
1、逻辑运算符只能用于boolean值。
2、与、或需要左右各有一个boolean值,但是取反只要有一个boolean值即可。
三元运算符
格式:
数据类型 变量名称 = 条件判断 ?表达式A : 表达式B;
注意事项:
1、必须同时保证表达式A和表达式B都符合左侧数据类型的要求。//int result = 3 > 4 ? 2.5 : 10; (错误写法)
2、三元运算符的结果必须被使用。
流程控制
流程控制—————顺序,选择,循环
1、顺序结构
2、选择结构
判断语句——if
(1)if(关系表达式){
语句体;
}
满足条件执行
(2)if(关系表达式){
语句体1;
}else{
语句体2;
}
(3)if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}else if
…
else if(关系表达式n){
语句体n;
}else{
语句体n+1;
}
选择语句——switch
格式:
switch(表达式){
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
注意事项:
1、多个case后面的数值不能重复。
2、switch后面的小括号只能是以下数据类型:
基本数据类型:byte/short/char/int
引用数据类型:String字符串、enum枚举
3、switch语句格式可以很灵活:前后顺序可以点颠倒,而且break可以省略,
匹配哪个case就从哪个case向下执行,直到遇见break或者整体结束为止。
循环结构
基本组成部分,一般可以分为四个:
- 初始化语句:再循环开始最初执行,而且只做唯一一次。
- 条件判断:如果成立,则循环继续;如果不成立,则循环退出。
- 循环条件:重复要做的事情内容,若干行语句。
- 进步语句:每次循环之后都要进行的扫尾工作,每次循环结束都要执行一次。
for循环
标准格式:
for(初始化表达式;布尔表达式;步进表达式){
循环体;
}
while(条件判断){
循环体;
}
扩展格式:
初始化语句
while(条件判断){
循环体;
步进语句;
}
do—while循环
标准格式:
do{
循环体;
}while(条件判断);
扩展格式:
初始化语句
do{
循环体;
步进语句;
}while(条件判断);
至少执行一次
三种循环的区别:
1、do—while循环至少执行一次。
2、for循环的变量在小括号中定义,只有循环内部才可以使用,而while和do—while循环初始化语句本来就在
外边,所以出来循环之后还可以继续使用。
break关键字的用法
1、可以用在switch语句当中,一旦执行,整个switch语句立刻结束
2、还可以用在循环语句当中,一旦执行,整个循环语句立刻结束
循环选择的小建议:循环次数确定的场景多用for,否则多用while
另一种循环控制语句continue关键字
一旦执行,立即跳过当前循环次数剩余内容,马上开始下一次循环。
死循环
标准格式:
while(true){
循环体;
}
注意事项:死循环后边写语句会报错。
嵌套循环
for(…){
for(…){
…
}
}
集成开发环境
Integrated Development Environment,IDE(集成开发环境)
项目project(模块module(包package(…),包package(…)))
新建项目
打开IDE,新建project选择empty project,新建model
src 源码包
external libraries 外部库(JDK)
快捷输入
psvm——自动生成main方法
public static void main(String[] args) {
}
sout——自动生成输出语句
System.out.println();
5.fori——快速生成循环语句
for (int i = 0; i < 5; i++) {
}
alt+enter 导入包,自动修复
…
方法
方法的定义:方法其实就是若干个语句的功能集合。
参数
返回值
格式:
修饰符 返回值类型 方法名称(参数类型 参数名称,…){
方法体;
return 返回值;
}
方法名称的命名规则和变量一样,使用小驼峰。
方法体:也就是大括号当中可以包含的任意条语句。
return的作用
- 停止当前方法
- 将后面的返回值还给调用处
注意:return后面的返回值必须和方法名称之前的返回值类型保持对应。
注意事项:
1、方法定义的先后顺序无所谓。
2、方法的定义不能产生嵌套包含的关系。
3、方法定义好之后不会执行,需要进行方法的调用。
方法的调用
格式:
方法名称();
方法的三种调用方式
- 单独调用:方法名称(参数)
- 打印调用:System.out.print();
- 赋值调用:数据类型 变量名 = 方法名称(参数)
四个步骤:
找到方法——传递参数——执行方法体——传递返回值
有参数:小括号中有值,一个方法需要一定的数据才能完成任务
无参数:小括号中没有值,方法不需要任何条件就能独立完成任务
有返回值,将返回值还给调用处,无返回值则直接使用
无返回值方法只能使用单独调用
注意事项
1、方法定义不能嵌套
2、方法定义的前后顺序无所谓
3、方法定义不会执行,需要调用
4、如果方法返回值类型不为void,必须写上return
5、return后面必须有返回值数据,且和方法的返回值类型相同
6、void方法后面的return可以省略,要写也只是——return;
7、一个方法可以有多个返回值,但是只有一个可以生效
方法的重载(overload)
多个方法的名称相同,但是参数列表不同。
- 参数类型不同
- 参数个数不同
- 参数的多类型顺序不同
与关键字、参数名称、返回值无关。
数组
数组的概念:是一种容器,可以同时存放多个数据值
数组的特点:
1、数组是一种引用数据类型
2、数组当中的多个数据,类型必须一致
3、数组长度在程序运行期间不可改变
两种常见的初始化方式:
1、动态初始化(指定长度),创建数组时直接指定数组长度
2、静态初始化(指定内容),创建数组时,直接指定具体数据
动态初始化数组的格式:
数据类型[ ] 数组名称 = new 数据类型[数组长度];
静态初始化
基本格式:
数据类型[ ] 数组名称 = new 数据类型[ ]{元素1,元素2,…,元素n};
省略格式:
数据类型[ ] 数组名称 = {元素1,元素2,…,元素n};
两侧数据类型必须保持一致,虽然静态初始化没有告诉数组长度,但是可以通过元素个数推算。
数组的初始化可以拆分为两个步骤:
静态
int[ ] arrayA;
arrayA = new int{1,2,3,4};
动态
int[ ] arrayB;
ayyayB = new int[4];
注意:
- 静态初始化的省略格式不能拆成两个步骤。
- 直接打印数组名称,得到的是数组对应的内存地址哈希值。
访问数组的格式:数组名称[索引值]
索引值,就是一个int数字,代表数组当中的编号。
索引值从0开始,一直到数组长度为-1为止。
使用动态初始化数组时,其中的元素将会自动拥有一个默认值,
规则如下:
- 整数类型,0;
- 浮点型,0.0;
- 字符型,’\u0000’;
- 布尔型,false;
- 引用型,null。
静态初始化数组一样有默认值
一些数组的操作
获取数组长度
数组名称.length
int len = arrayA.length;
数组一旦创建,程序运行期间,长度不可改变。
遍历数组
对数组中的元素逐一,挨个儿处理,默认处理方式就是打印输出。
数组名称.fori
数组作为方法的参数
当调用方法时,向方法的小括号进行传参,传的是数组的地址值。
如果一个方法可以有0、1、多个参数,但是只能返回0或1个返回值,不能有多个返回值。
如果希望一个方法当中产生多个结果数据进行返回,就可以使用一个数组作为返回值类型。