1.Java语言基础(一)
1.1 Java基础语法
1.1.1 Java语言的发展史
首先是在1995年Java语言被sun公司推出;在2004年推出5.0版本,这一次更新力度很大,使Java语言得到快速发展;2009年Oracle公司收购了Sun公司;2014年的Java8.0版本是目前公司用的最多的版本;目前JDK最新版本为18
1.1.2 JDK,JRE,JVM三者的联系
JDK:Java 开发工具,包括JRE以及一些开发工具(编译工具:Javac.exe;运行工具:Java.exe等)
JRE:Java运行时环境,其包含了JVM和一些核心类库
JVM:Java虚拟机,用来解析运行Java程序,它支持了java语言的跨平台原理。
1.1.3 DOS命令的介绍和使用
Win+r 输入 cmd进入DOS环境
切换盘符:盘符号:
进入一个目录: cd目录名
进入多层目录: cd目录名\目录名
回退到盘符:cd\
查看当前目录下所有的内容:dir
清屏:cls
退出:exit
输入命令的时候可以按Tab键自动补全;按上下箭头可以选择之前输入过的命令。
1.1.4 Path环境变量的配置
安装了JDK以后,如果不配置环境变量,我们就只能在JDK\bin目录下去使用Java.exe和Java.exe两个命令。配置环境变量之后,可以在任意路径下都能使用Javac.exe和Java.exe两个命令。
1.1.5 第一个代码HelloWorld案例
public class HelloWorld{
public static void main(String[]args){
System.out.println(“hello world!”);
}
}
其中要特别注意程序类名要和文件名严格一致。
1.1.6 NotePad++软件的安装和使用
与计算机自带的文本编辑器相比,在Notepad++软件中程序有具体行号
1.1.7 Java中的数据类型
Java是一种强类型语言,给每个数据都分配了数据类型,每种类型的数据对应的所占空间大小也不一样。
Java中的数据类型分为两种:基本数据类型(8种)和引用数据类型
基本数据类型(占用字节数):byte(1)、short(2)、char(2)、int(4)、long(8)、float(4)、double(8)、boolean(1);
Java中的基本数据类型中的整数类型(byte、short、char、int、long)默认为int类型,小数类型(float、double)默认为double类型,
引用数据类型:类、数组、接口等。
1.1.8 常量的使用
在Java程序运行过程中其值不会发生改变的量。
常量分为6种:整数常量、小数常量、字符常量、字符串常量、布尔常量、空常量(null)。
字符常量在中有且仅有一个字符;
空常量不可以直接输出。
1.1.9 变量的定义与使用
在Java程序运行过程中,在一定范围内,其值可以发生改变的量,我们称为变量。我们通常是用变量来保存一个数据。
定义格式:数据类型 变量名 = 值;
修改变量的值:变量名 = 值;
注意事项:不能重复定义名字;未赋值不能直接使用;使用long类型的数据的时候,建议在数值后面加上一个大(小)写的“L(l)”;在使用float类型的数据的时候,在数值后面加上一个大(小)写的“F(f)”。
1.1.10 Java中代码的书写规范
标识符:在Java语言中给变量、方法、类、包取名。
Java代码中标识符的书写规范:
标识符的组成:大小写字母、数字、美元符号、下划线
注意:命名是不能以数字开头、不能是关键字、严格区分大小写、可以是中文,但是不建议。
首先是给变量和方法取名:小驼峰命名法,如果名字只有一个英文单词,则全部小写,如果是两个或者多个单词组成,则第一个单词全部小写,后面单词首字母全部大写。例如:main、getMax、getSum等。
其次是给类取名:先说一下Java语言中的模块结构:Java工程—>Java模块—>Java包—>Java类。我们给类取名是依据大驼峰命名法,不管几个英文单词,其首字母全部大写。例如:Demo、HelloWorld等
给包取名:我们给Java包取名是:com.xxxx.xxxx;xxxx是自己取的名,全部小写。
1.1.11 数据类型之间的转换
byte<short、char<int<long<float<double
Java语言中的数据类型转换分为自动类型转换和强制类型转换,其中自动类型转换是把小的数据(数值)放到大的数据类型(变量)里去;强制类型转换是把大的数据(数值)强行放到小的数据类型(变量)里去。
例:强制类型转换 i=(int)13.14
1.1.12 Java中的各种运算符操作
Java中的表达式:通过运算符把常量或者变量连接起来的式子。
用来连接常量或者变量的符号叫做运算符。例如:int x=1+y;
Java中的运算符包括:算数运算符、赋值运算符、自增自减运算符、关系运算符、逻辑运算符、短路逻辑运算符、三元运算符。
算数运算符:+,-,*,/,%。其中需要注意的是:两个整数相除得到的是整数,要想得到小数,那参与相除操作的两个数必须有一个带小数。如果在表达式中含有多个数据类型,就会出现数据类型自动提升,提升为最大的那一种数据类型。例:byte b=1;int i=b+1;在这里我们就要用int类型的i的变量去接收。Java中存在整数常量优化机制。 例:byte b = 3+4;这种不会报错。
获得一个数个位:数%10;
获得一个数的十位:数/10%10;
获得一个数的百位:数/100%10;以此类推。
赋值运算符:=,+=,-=,*=,/=,%=;例:a+=b等同于a=(数据类型)a+b;
后面这5种赋值运算符包含了强制类型转换。
自增自减运算符:i++(++i),i–(–i);在单独使用的时候,i++(i–)和++i(–i)没有区别。在参与到其他运算中去的时候,看+(-)的位置,例如:++i是先进行自增操作,再参与到其他运算操作中去。而i++则是先进行参与的运算操作再自增。在以后的学习中主要用的还是单独使用的情况。
关系运算符:,!=,>,>=,<,<=;得到的结果是boolean类型的数据,要注意赋值运算符=和关系运算符,别搞混了。
逻辑运算符:&,|,,!;&:有false则false;|:有true则true;:相同为false,不同为true;!:取原来相反的结果。
短路逻辑运算符:&&和||;其中&&的效果和&一样,都是有flase则false,但是&&效率更高,因为当判断表达式左边为false的时候,右边直接不执行;||的效果和|一样,都是有true则true,当判断表达式左边为true的时候,右边直接不执行。
三元运算符:格式:数据类型 变量名=关系表达式?表达式1:表达式2;
当关系表达式结果为true时,把表达式1的值赋给变量;当关系表达式结果为false时,把表达式2的值赋给变量。
int a=3,b=5;
int getMax = a>b?a:b;
在这里补充几点其他内容:
一、键盘录入:三步
导包:import java.util.Scanner;
创建对象:Scanner.sc =new Scanner(System.in);
实现键盘录入:int a=sc.nextInt();还有其他方法对应其他数据类型
二、产生随机数:三步
导包:import java.util.Random;
创建对象:Random r =new Random();
产生随机数:int a =r.nextInt(产生范围);
产生范围为半闭半开区间。先转换成全闭区间,[(大值-小值)+1] + 小值
三、在Java语言中,控制流程语句结构有三种:顺序结构、分支结构、循环结构
顺序结构:按照代码的顺序,程序从上而下执行;
分支结构:if分支结构、if…… else分支结构、if…… else if……else结构、switch结构
循环结构:for循环结构、while循环结构、do……while循环结构
1.1.13 if分支语句
if分支语句分为三种:
if(判断语句){
语句体;
}
if(判断语句){
语句体1;
}else{
语句体2;
}
if(判断语句1){
语句体1;
}else if(判断语句2){
语句体2;
}else if(判断语句3){
语句体3;
}……else if(判断语句n){
语句体n;
}else{
语句体n+1;
}
1.1.14 switch分支语句
switch 分支语句:
switch(表达式/变量){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
……
default:
语句体n+1;
break;
}
break可以直接跳出循环;continue可以结束本次循环,直接开始下次循环
总结:如果表示某一个具体的值的时候 那么就优先考虑使用 switch分支语句, 使用if 、else if也是可以的
如果表示一个区间范围的话 95>=x>90 则使用 if else if
1.1.15 for循环结构
for(初始化值;条件判断;条件控制){
循环语句体;
}
例:对0-100求和
int sum=0;
for(int i=0;i<=100;i++){
sum+=i;
}
System.out.println(“sum:”+sum);
当你明确循环次数的时候 我们就使用for循环
1.1.16 while循环结构
初始化语句;
while(条件判断语句){
循环语句体;
条件控制语句;
}
例:对0-100求和:
int sum=0,i=0;
while(i<=100){
sum+=i;
i++;
}
System.out.println(“sum:”+sum);
一般是在不明确循环的次数的是 我们使用 while循环
1.1.17 do…while循环结构
初始化语句;
do{
循环语句体;
条件控制语句;
}while(条件判断语句);
例:对0-100求和:
int i=0;
int sum =0;
do{
sum+=i;
i++;
}while(i<=100);
注意:do……while循环语句不管条件判断是不是true,都会先执行循环体语句一次。在书写格式上,while()后有;
1.1.18 各种循环语句的区别和应用场景
for | while | do……while | |
---|---|---|---|
特点 | 先执行判断语句再决定是否要执行循环体 | 先执行判断语句再决定是否要执行循环体 | 先执行一次循环体的内容,再判断 |
初始化变量 | 初始值不能在for循环外面使用 | 初始值可以在while循环外面使用 | 初始值可以在dowhile循环外面使用 |
适用场景 | 明确循环次数的时候 | 在不明确循环次数的时候(一般使用都是写死循环的时候) | 至少需要执行一遍的时候 |
死循环:for( ; ; ){}
while(true){}
do{}while(true);
1.1.19 循环跳转控制语句
跳转控制语句 | 作用 |
---|---|
continue | 跳过某次循环,执行下一次的循环 |
break | 终止循环 |
注意:continue只能在循环体里使用。
1.1.20 嵌套循环的应用
循环结构里套着循环结构;先执行一次外部循环,内部循环全部走完一遍,再执行外部循环一次,又完全执行内部循环。总的循环次数:外部循环次数*内部循环次数。
1.1.21 使用循环嵌套打印9*9乘法表
//打印乘法表:
public class Print{
public static void main(String[]args){
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(i>=j){
System.out.println(i+"*"+j+"="+(i*j));
}
}
}
}
}
1.1.22 IDEA开发软件
先建工程项目;接着建模块;再建包;再建class;
1.1.23 数组的动态初始化
数组是用来存储多个相同类型的数据容器(注意只能存储同一类型的数据)。数组的索引是从0开始,依次加1。
数组定义格式:
数据类型 [] 变量名 例:int [] arr1 --------------推荐使用这一种
数据类型 变量名 [] 例:int arr2[] -------------了解即可
数组的动态初始化:只知道数组的容量,对于数组的具体值不清楚,使用数组的动态初始化
动态初始化格式:数据类型 []变量名 =new 数据类型[长度/容量] 例:int []arr1=new int[5];
new代表去JVM堆内存中申请内存空间,new是一个关键字,凡是创建对象都必须要使用的关键字。
1.1.24 数组的访问格式
定义完数组后,我们是通过索引来访问数组内部的数据的。数组名[i]; 其中i代表索引;例如:arr1[0],arr1[1]……
我们要想知道数组长度时:数组名.length,这样我们访问数组最后一个元素时就成了:数组名[数组名.length-1]。
使用数组常见的两个问题是什么?
索引越界 空指针异常
是何种原因导致出现的?
索引越界: 访问了不存在的索引值, 索引值的范围:0~容量-1
空指针异常: 一个变量没有记录任何对象的内存地址,然后访问了对象的属性或者方法。
1.1.25 数组的静态初始化
我们创建数组时,我们知道了数组元素的具体值,直接对数组赋予具体值。例:int []arr={1,3,5,7,9};
格式:数据类型 [] 变量名=new 数据类型[]{值1,值2,值3……} -----注意尽管我们知道了长度,但是也不能写
简写格式:数据类型 []变量名={值1,值2,值3……} -------------------推荐这种形式
1.1.26 Java的内存划分和作用
区域名称 | 作用 |
---|---|
栈内存(Stack) | 方法运行时使用的内存,存放方法中的变量和参数。 |
堆内存(Heap) | 存储对象或数组,new出来的数据,都存储在堆内存。 |
方法区 | 存储已加载的class文件信息。 |
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
栈内存:方法执行完毕,内存释放,栈内存存放的是局部变量。
堆内存:数据使用完毕后,等待垃圾回收器回收,堆内存存放的是new出来的数据, 数组,对象。
数组的默认初始化值:
整数类型:0
浮点类型:0.0
字符类型:空字符 ''
布尔类型:false
引用类型:null
1.1.27 分析数组在内存中的存储
单个数组在内存中的存储:栈中存放方法的参数和变量;new出来的部分存放在堆内存中,包括对象和数组,两者通过同一地址相联系。
多个数组在内存中的存储:栈中存放方法的参数和变量;new出来的部分存放在堆内存中,包括对象和数组,两者通过同一地址相联系。但是,多个数组间没有联系,他们各自在栈内存中开辟空间,也各自在堆内存中开辟空间,两者地址不一样,没有联系。
多个数组变量指向同一数组对象:多个对象指向同一个内存地址的时候,那么修改元素会互相影响
1.1.28 方法的定义和调用
方法的定义格式一
public static void 方法名(){
方法体;
}
调用:方法名();
方法的定义格式二(带参数列表)
public static void 方法名(数据类型 数据变量){
方法体;
}
调用:方法名(常量或变量);
例: public static void getMax(int a){
};
getMax(10);getMax(a)
方法的定义格式三(带返回值):
public static 数据类型 方法名(参数列表){
方法体;
return 数据;
}
常见调用:数据类型 变量名=方法名(参数)
例:public static int getMax(){
方法体;
return;
}
调用:int a = getMax(i)。
1.1.29 方法的参数和返回值问题
什么时候需要带参数:当一些变量经常变化,我们就可以把它定义为参 数,在调用方法的时候我们再来给他赋值,这样可以做到灵活多变。
我们在定义方法的时候不给参数赋值,只有在调用方法的时候才给其赋值,其中在参数列表中多个参数用逗号隔开,
1.1.30 方法的重载(Overload)
同一个类中有多个不同同名的方法
判别重载的条件:在同一类中多个同名的方法,他们的参数列表不同,参数列表不同体现在参数数量和对应位置上的参数类型不同
方法重载与修饰符无关,与返回值无关,JVM会根据我们调用方法传递的参数来调用对应的方法。
1.1.31 参数是基本类型和引用类型的区别
方法参数是基本数据类型的时候,形参的改变不会造成实参的变化,每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己的独立内存空间,当方法内部代码调用完毕之后,会从栈内存中弹栈消失;
方法参数是引用数据类型的时候,形参的改变会造成实参的变化,应为两者指向堆内存里的同一个地址。
1.1.32 Debug断点调试的使用
Debug断点调试工具是为了让程序员更加清楚地查看程序的执行流程,可以用来追踪程序运行过程来调试程序。
小白自学java ing,纯属个人分享,会持续更新分享自己的笔记,有错误希望大佬指正