Java基础1
学习黑马java系列课程所作笔记
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
1.JDK(Java Development kit)开发者工具包,在Oracle官网下载(link)。
2.LTS(Long-Term Support) Version 有JDK 8、11、17、21。
3.验证安装成功与否:cmd中输入java -version 、javac -version看版本号。
4.JDK中最重要的两个命令程序 :javac:编译工具 ,java:执行工具
5.常用命令行命令:
一、Java快速入门
第一个java程序HelloWorld
开发java程序,需要三个步骤,编写代码,编译代码,运行代码
注意事项:
1.第一个Java程序建议用记事本书写
2.建议代码文件名全英文,首字母大写,满足驼峰模式,源代码文件的后缀必须是.java
具体代码:
过程:
Jdk11开始,可直接运行源代码文件,底层生成了临时的class文件
注意事项:
- 文件名称的后缀必须是java结尾
- 文件名称必须与代码的类名称一致
- 必须使用英文符号
补充知识:JDK组成、跨平台原理
补充知识:环境变量
补充知识:环境变量与JAVA_HOME
二、Intellij IDEA下载与使用
1.简介
- Intelli] IDEA一般简称IDEA,在代码错误提醒,智能代码补全等多方面表现的都非常优秀,是进行ava开发时,很多企业首选的开发工具。
2.IDEA的下载与安装
-下载链接:link
-安装方式:基本上是使瓜式安装,建议修改安装路径(不要安装在有空格和中文的路径下)。
3.IDEA管理Java程序的结构
- project(项目、工程)
- module(模块)
- package(包)
- class(类)
例:
4.使用IDEA开发一个java程序的步骤:
- 创建工程 new project(空工程)
- 创建模块 new Project(空工程)
!](https://img-blog.csdnimg.cn/direct/6d15be01268d4982b87e2693577eb82d.png)
3.创建包 new Package
包名 用公司域名倒写加上项目名字
4.新建类
建议首字母大写,不要带后缀(IDEA自动帮你加)
5.编写代码、并启动
6.总结
5.IDEA中个性化设置与常见快捷键
1.主题与字体
2.背景色
3.快捷键
- ctrl+X是剪切当前行,比ctrl +Y操作起来更方便
5.IDEA中的其他操作
- 删除类文件(Delete)
- 修改类名称(Refactor)
- 修改模块(Refactor)
- 导入模块
- 删除模块(先删目录里的,再删文件夹里的)
- 打开工程
- 关闭工程
三.基础语法
1.注释
快捷键进行注释(想要打开就在按一下)
2.字面量
- 计算机是用来处理数据的,字面量就是告诉程序员:数据在程序中的书写格式
常用数据
3.变量
- 变量是用来记住程序要处理的数据的。
变量的定义格式
变量的使用注意事项
补充
- 计算机中表示数据的最小单元:一个字节(byt,简称B,是使用8个二进制位组成的)
- 字节中的每个二进制位就称为位(bit,简称b),1B=8b
4.关键字与标识符
关键字
- Java语言自己要用到的一些词,有特殊作用的,我们称之为关键字,如:public、class、int···我们不能将之用为类名,变量名。
标识符
- 标识符就是名字,我们写程序时会起一些名字,如类名、变量名等等都是标识符。
标识符的要求
- 基本要求:由数字、字母、下划线()和美元符($)等组成
- 强制要求:不能以数字开头、不能用关键字做为名字、且是区分大小写的。
标识符的建议规范
- 变量名称:满足标识符规则,同时建议用英文、有意义、首字母小写,满足“驼峰模式”,例如:
int studyNumber =59; - 类名称:满足标识符规则,建议全英文、有意义、首字母大写,满足“驼峰模式”,例如:HelloWorld,Student
5.数据类型
5.1数据类型的分类
-基本数据类型:4大类8种
如果希望随便一个整型字面量默认是long类型的,需要在后面加上L或者l(建议L防止看成1)
例:long lg = 4242442332432L;
long l=40; 就没事
*随便写小数字面量,默认是double,如果希望小数是float,后面加上F或f
例:float f=3.14F;
5.2类型转换
5.2.1自动类型转换
- 类型范围小的变量,可以直接赋值给类型范围大的变量
例:byte a=12; int b=a;
5.2.2表达式的自动类型转换
- 在表达式中,小范围类型的变量,会自动转换成表达式中较大范围的类型,再参与运算。
注意事项 - 表达式的最终结果类型是由表达式中的最高类型决定。
- 表达式中,byte、short、char 是直接转换成int类型参与运算的。 (防止两个小类型相加超出小类型的范围)
5.2.3强制类型转换
类型范围大的数据或者变量,直接赋值给类型范围小的变量,会报错。
int a=20;
byte b=1;//报错
- 强制类型转换:强行将类型范围大的数据或者变量赋值给类型范围小的变量
快捷键强转:alt+enter
注意事项
- 强制类型转换可能造成数据(丢失)溢出:
- 浮点型强转成整型,直接丢掉小数部分,保留整数部分返回
6运算符
6.1 基本的算术运算符
+号作连接符
- “+”符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串。
“abc”+5->“abc5” - 识别技巧:能算则算,不能算则在一起。
6.2自增自减运算符
- 注意:++ 、–只能操作变量,不能操作字面量。
6.3 赋值运算符
注意:扩展的赋值运算符隐含了强制类型转换。
6.4关系运算符
- 注意:在jva中判断是否相等一定是“==”,千万不要把“=”误写成“=”。
6.5逻辑运算符
注意:在java中,“&”、“|”:无论左边是falsei还是true,右边都要执行。
6.7 三元运算符与运算符优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | – |
1 | () | 圆括号 | (表达式)/函数名(形参表) | 左到右 | – |
1 | . | 成员选择(对象) | 对象.成员名 | 左到右 | – |
1 | -> | 成员选择(指针) | 对象指针->成员名 | 左到右 | – |
- | |||||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
2 | ~ | 按位取反运算符 | ~表达式 | 右到左 | – |
2 | ++ | 自增运算符 | ++变量名/变量名++ | 右到左 | – |
2 | – | 自减运算符 | –变量名/变量名– | 右到左 | – |
2 | * | 取值运算符 | *指针变量 | 右到左 | – |
2 | & | 取地址运算符 | &变量名 | 右到左 | – |
2 | ! | 逻辑非运算符 | !表达式 | 右到左 | – |
2 | (类型) | 强制类型转换 | (数据类型)表达式 | 右到左 | – |
2 | sizeof | 长度运算符 | sizeof(表达式) | 右到左 | – |
- | |||||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
3 | * | 乘 | 表达式*表达式 | 左到右 | – |
3 | % | 余数(取模) | 整型表达式%整型表达式 | 左到右 | – |
- | |||||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
4 | - | 减 | 表达式-表达式 | 左到右 | – |
- | |||||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
5 | >> | 右移 | 变量>>表达式 | 左到右 | – |
- | |||||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
6 | >= | 大于等于 | 表达式>=表达式 | 左到右 | – |
6 | < | 小于 | 表达式<表达式 | 左到右 | – |
6 | <= | 小于等于 | 表达式<=表达式 | 左到右 | – |
- | |||||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
7 | != | 不等于 | 表达式!= 表达式 | 左到右 | – |
- | |||||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
- | |||||
13 | ?: | 条件运算符 | 表达式1?表达式2:表达式3 | 右到左 | 三目运算符 |
- | |||||
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | – |
14 | /= | 除后赋值 | 变量/=表达式 | 右到左 | – |
14 | *= | 乘后赋值 | 变量*=表达式 | 右到左 | – |
14 | %= | 取模后赋值 | 变量%=表达式 | 右到左 | – |
14 | += | 加后赋值 | 变量+=表达式 | 右到左 | – |
14 | -= | 减后赋值 | 变量-=表达式 | 右到左 | – |
14 | <<= | 左移后赋值 | 变量<<=表达式 | 右到左 | – |
14 | >>= | 右移后赋值 | 变量>>=表达式 | 右到左 | – |
14 | &= | 按位与后赋值 | 变量&=表达式 | 右到左 | – |
14 | ^= | 按位异或后赋值 | 变量^=表达式 | 右到左 | – |
14 | |= | 按位或后赋值 | 变量|=表达式 | 右到左 | – |
- | |||||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | – |
6.8 Java API入门
7.程序流程控制
7.1分支结构
7.1.1 if分支
- 根据条件(真或假)来决定执行某段程序
if分支有三种形式
- if(条件){},()后不能跟";",否则0中的代码将不受的控制了。
- 如果If语句的{}中只有一行代码的情况,{}可以省略不写(但是不推荐省略)。
7.1.2 switch分支
- 是通过比较值来决定执行哪条分支
switch分支的执行流程
- 先执行表达式的值,再拿着这个值去与case后的值进行匹配。
- 与哪个case后的值匹配为true就执行哪个case块的代码,遇到break就跳出switch分支。
- 如果全部case后的值与之匹配都是false,则执行default块的代码。
if、switch的比较,以及各自适合什么业务场景?
- if在功能上远远强大于switch.
- 当前条件是区间的时候,应该使用f分支结构。
- 当条件是与一个一个的值比较的时候,switch分支更合适:格式良好,性能较好,代码优雅。
switch使用时的注意事项
- 表达式类型只能是byte,short,int,char,JDK5开始支持枚举,JDK7开始支持String,不支持double,float,long
- case给出的值不允许重复,且只能是字面量,不能是变量
- 正常使用switch的时候 ,不要忘记写break,否则会出现穿透现象。
当存在多个case分支的代码相同时,可以把相同的代码放到一个case块中,其他的case块都通过穿透性穿透到该case块执行代码即可,这样可以简化代码。
7.2循环结构
7.2.1 for循环
- 控制一段代码反复执行多次
for循环格式
7.2.2 while循环
7.2.3 do-while循环
7.2.4 三种循环的区别小结
- for循环和while循环(先判断后执行);do-while(先执行后判断)
- for循环和while循环的执行流程是一模一样的,功能上无区别,for能做的while也能做,反之亦然。
- 使用规范:如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。
7.2.5 死循环
- 可以一直执行下去的一种循环,如果没有干预不会停下来。
死循环的写法
7.2.6 循环嵌套
- 循环中又包含循环。
循环嵌套的特点 - 外部循环每循环一次,内部循环会全部执行完一轮。
7.2.7 跳转关键字
- break:跳出并结束当前所在循环的执行。
- continue:用于跳出当前循环的当次执行,直接进入循环的下一次执行。
注意事项
break:只能用于结束所在循环,或者结束所在switch分支的执行。
continue:只能在循环中进行使用。
7.2.8案例技术:生成随机数
8.数组
- 数组就是一个容器,用来存储一批同种类型的数据。
例子
8.1数组的定义与访问
8.1.1静态初始化数组
- 定义数组的时候直接给数组赋值
- 数组在计算机中的基本原理
8.1.2 数组的访问
数组的访问
8.1.3 数组的遍历
- 遍历:就是一个一个地访问一遍容器中的数据
8.1.4 动态初始化数组
- 定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度
动态初始化数组元素默认值规则
- 动态初始化:适合开始不确定具体元素值,只知道元素个数的业务场景。
- 静态初始化:适合一开始就知道要存入哪些元素值的业务场景。
8.2 数组在计算机中的执行原理
8.2.1数组的执行原理,Java程序的执行原理
Java内存分配介绍
- 方法区
- 栈
- 堆
- 本地方法栈
- 程序计数器
数组在计算机中的执行原理
8.2.2多个变量指向同一个数组的问题
使用数组时常见的一个问题
- 如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象
8.3补充知识:Debug工具的使用
- IDEA自带的断点调试工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况
DEBUG工具基本使用步骤
9.java 方法
9.1方法概述
- 方法是一种语法结构,它可以把一段代码封装成一个功能,以便重短调用。
方法的完整格式
方法如何执行?
- 方法定义后,必须调用才可以跑起来,调用格式:方法名(…);
方法的调用流程 - Debug
方法定义时几个注意点
- 方法的修饰符:暂时都使用public static修饰。
- 方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。
- 形参列表可以有多个,甚至可以没有;如果有多个形参,多个形参必须用“,”隔开,且不能给初始化值。
9.1方法定义的其他形式
- 方法定义时:需要按照方法解决的实际业务需求,来设计合理的方法形式解决问题。
注意事项 - 如果方法不需要返回数据,返回值类型必须申明成void(无返回值申明),此时方法内部不可以使用return返回数据。
- 方法如果不需要接收数据,则不需要定义形参,且调用方法时也不可以传数据给方法了。
9.2方法使用时的常见问题
- 方法在类中的位置放前放后无所谓,但一个方法不能定义在另一个方法里面。
- 方法的返回值类型写==void(无返回申明)==时,方法内不能使用return返回数据,如果- 方法的返回值类型写了具体类型,方法内部
- 则必须使用return:返回对应类型的数据。
- return语句的下面,不能编写代码,属于无效的代码,执行不到这儿。
- 方法不调用就不会执行,调用方法时,传给方法的数据,必须严格匹配方法的参数情况。
- 调用有返回值的方法,有3种方式:1、可以定义变量接收结果2、或者直接输出调用,3、甚至直接调用:
- 调用无返回值的方法,只有1种方式:1、只能直接调用。
9.3方法在计算机中的执行原理
- 方法被调用的时候,是进入到栈内存中运行
sum方法执行完就会从栈中清除掉,main方法继续执行
main方法执行完也会从栈里面清除掉
更复杂的例子
main调用study,study调用eat,
eat方法执行完出去,study继续调用sleep方法
sleep执行完出去,然后study相当于也执行完了,也出去,main没有余下的代码,也执行完了
9.4java的参数传递机制
Java的参数传递机制都是:值传递
- 所谓值传递:指的是在传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本。
-实参:在方法内部定义的变量。
-形参:定义放法时“(…)”中所声明的参数。
9.4.1基本类型的参数传递
9.4.2引用类型的参数传递
其实也是值传递,不过传的是地址
9.4.3 练习案例
import java.util.Random;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
int[] codes ={
};
printArray(codes);
}
public static void printArray(int[] arr){
if (arr==null){
System.out.println(arr);
return;
}
System.out.print("[");
for (int i=0;i<arr.length;i++)
System.out.print(i==arr.length-1?arr[i]:arr[i]+",");
System.out.print("]");
}
}
9.4.4方法重载
- 一个类中,出现多个方法的名称相同,但是它们的形参列表是不同的,那么这些方法就称为方法重载了。
方法重载的注意事项
- 一个类中,只要一些方法的名称相同、形参列表不同,那么它们就是方法重载了,其它的都不管(如:修饰符,返回值类型是否一样都无所谓)。
- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称。
方法重载的应用场景
- 开发中我们经常需要为处理一类业务,提供多种解决方案,此时用方法重载来设计是很专业的。
案例导学 - 开发武器系统,功能需求如下:
①可以默认发一枚武器。
②可以指定地区发射一枚武器。
③可以指定地区发射多枚武器。
9.4.5 补充知识 在方法中单独使用return关键字
- return;可以用在无返回值的方法中,作用是:立即跳出并结束当前方法的执行。
9.5 案例
9.5.1买飞机票
public class demo {
public static void main(String[] args) {
double price=calculate(1000,11 ,"经济舱");
System.out.println("优惠价是"+price+"元");
}
public static double calculate(double price,int month,String type){
if (month>=5&&month<=10){
//旺季
switch (type)
{
case "头等舱":
price *=0.9;
break;
case "经济舱":
price*=0.85;
break;
}
}
else {
switch (type)
{
case "头等舱":
price *=0.7;
break;
case "经济舱":
price*=0.65;
break;
}
}
return price;
}
}
9.5.2开发验证码
public class demo {
public static void main(String[] args) {
System.out.println("验证码是:"+createCode(5));
}
public static String createCode(int n){
Random r=new Random();
String code="";
//1.定义一个for循环用于控制产生多少位随机字符
for(int i=1;i<=n;i++){
//为每个位置随机生成一个随机字符,可能是数字,大小写字母。
//思路,随机一个0 1 2之间的数字,分别代表数字,大写字母,小写字母
int type=r.nextInt(3);//0,1,2
switch (type){
case 0:
//随机一个数字字符
code+=r.nextInt(10);//0-9
break;
case 1:
code+=(char)('A'+r.nextInt(26));
break;
case 2:
code+=(char)('a'+r.nextInt(26));
break;
}
}
return code;
}
}
9.5.3评委打分
public class demo {
public static void main(String[] args) {
System.out.println("当前选手得分是:"+getAverageScore(5));
}
public static double getAverageScore(int number){
int[] scores =new int[number];
//scores=[0,0,0,0,······];
Scanner sc=new Scanner(System.in);
for(int i=0;i<scores.length;i++){
System.out.println("请您输入第"+(i+1)+"个评委的分数");
scores[i]=sc.nextInt();
}
//从数组中计算出总分,找出最高分、最低分
int sum=0;
int min=scores[0];
int max=scores[0];
for (int i=0;i<scores.length;i++){
sum+=scores[i];
if(scores[i]<min)
min=scores[i];
if(scores[i]>max)
max=scores[i];
}
return (sum-min-max)/(scores.length-1);
}
}
9.5.4数字加密
public class demo {
public static void main(String[] args) {
System.out.println(encrpt(8346));
}
public static String encrpt(int number){
//假设 number=1983
//1.把这个密码分为一个一个的数字,才可以对其进行加密
int[] numbers = split(number);
//numbers=[1,9,8,3]
//2.遍历每个数字,并加密
for(int i=0;i<numbers.length;i++){
numbers[i]=(numbers[i]+5)%10;
}
//numbers=[6,4,3,8]
//3.反转数组,单独写一个方法
reverse(numbers);
//4.把数字拼接起来
String data="";
for (int i=0;i<numbers.length;i++){
data+=numbers[i];
}
return data;
}
public static int[] split(int number) {
int[] numbers =new int[4];
numbers[0]=number/1000;
numbers[1]=(number/100)%10;
numbers[2]=(number/10)%10;
numbers[3]=number%10;
return numbers;
}
public static void reverse(int[] numbers){
for(int i=0,j=numbers.length-1;i<j;i++,j--){
int temp=numbers[i];
numbers[i]=numbers[j];
numbers[j]=temp;
}
}
}
9.5.5数组拷贝
public class demo {
public static void main(String[] args) {
int[] arr={
11,22,33};
int[] arr2=copy(arr);
printArray(arr2);;
//注意,这不是拷贝,指向的是同一个数组
//int[] arr3=arr;
}
public static void printArray(int[] arr){
System.out.print("[");
for (int i=0;i<arr.length;i++){
System.out.print(i==arr.length-1?arr[i]:arr[i]+",");
}
System.out.print("] ");
}
public static int[] copy(int[] arr) {
int[] arr2 = new int[arr.length];