Java基础
编程语言
编码 idea VScode vim
编译 使用javac去编译
javac HelloWorld.java会生成同名字节码文件
运行 使用java 命令 运行
不需要.class
找不到主类
字节码文件是否生成
java Hello命令对不对,文件名对不对
CLASSPATH不要写错,可以不写,如果其余没有问题再回来看
高级语言的编译方式
编译型
使用专门的编译器,针对特定的操作系统,将源代码翻译成机器码
C C++
解释型
有专门的解释器,将源码解释成特定平台的机器码,且立即执行,不会生成新文件
就是将编译型语言的编译和执行结合成一步同时进行
缺点 效率低
混合型
编码+注释
源码要经过编译 生成与平台无关字节码
class文件不是可执行程序
需要jvm去解释执行 Java为不同系统提供不同虚拟机
*Java跨平台原理
wirte once run any where
常用命令
javac 编译命令
格式 Javac [-d 目录路径] 文件名.java
作用 编译源码文件 获得字节码文件:将字节码文件存放-到后面指定的位置
使用javac HelloWorld.java/不指定目录.class存放当前文件
javac -d obj/HelloWorld.java
java 运行的命令
格式 Java[-cp文件的目录] 类名
作用 运行字节码文件
package
定义格式
package 包名
要求
package语句必须是程序第一条可执行代码
package语句在一个Java文件中最多有一条
package语句在一个Java文件可以没有
这个包名的代码package com.briup; 编译后 字节码文件会存放到
com/briup下
场景
教务系统:学生系统 教师系统 新增修改删除查询
package按角色去分模块
com.briup.students;
AddStudent
EditStudent
DeleteStudent
UpdateStudent
按功能去分模块
com.briup.add;
addStudent;
导包
import 包名.类名;
import java.util.Scanner;
不需要导包可以使用
java.lang
JVM
day03
第二章
注释://单行注释 /*多行 */ /**文档注释
多行注释不能嵌套多行注释
关键字:被java赋予特殊含义的单词
保留字:暂时没被java赋予特殊含义的单词
比如const 在java在Scrip中关键字
标识符(变量 常量 方法)
命名规则
1.不能使用java中保留字 关键字
2.可以使用由字母 数字 下划线和$组成
3.数字不能开头
4.大小写敏感
5.长度没有限制
编码器习惯
命名规则:
类和接口
首字母大写(大驼峰)
class HelloWorld
class HelloMyWorld
方法和变量
首字母小写 第二个单词开始每个首字母大写
int num;
getStudentById();
常量
全词大写 多个单词之间用_分割
LIGHT_COLOR
临时变量 一般用_开头
_a
思考
int _ =0;
int $=0;
变量和常量的定义
常量
定义: 在程序运行中,他的值不可以发生改变
除了null,其他常量可以直接用输出语句输出
分类
字面值常量
字符串常量
用""扩起来的0个或者1个或者多个字符
""
"0"
"hello"
"a"
整数常量
0 1 2 3 99 -10 -19
小数常量
0.1 -1.1
字符常量''单引号扩起来的单个字符
'a' 'B' '你' '好'
布尔常量
true false
空常量
null
自定义常量
声明final关键字
final int NUM_A = 1;
类的常量定义在main的外部
const 在JavaScript中声明常量的关键字
变量
定义 用于储存值的一种容器
强类型语言:比如在java中 声明变量需要指定他的数据类型,并且这个类型不能更改了
int a;
a = 10;
a = 10.1;// 报错
弱类型语言中:比如javascript 声明变量不需要指定数据类型,这个类型赋值时确定
let a;
a = 10;
a = 10.1;
a = true;
a = {name:"张三",age:12};
a = [1,2,3,4,5,6,7,{name:"张三",age:12},[],true]
声明
int a = 10; // 声明和初始化
或者
int a; // 声明
a = 10; // 初始化
注意:
java中变量一定要先声明 再赋值 再使用
S.o.p(a);// a?
int a;
int a;
S.o.p(a); // a=?
a = 1;
基本数据类型
整型
int a = 20;
long b = 20L; b = 20l;
byte
short
浮点型
double a = 1.0D; a = 1.0d;
float a = 1.0F; a = 1.0f;
字符型
char 单引号扩起来的单个字符
不可以为空单引号
布尔型
boolean(值:true false)
引用数据类型
类
String
数组
接口
比特位:bit 是计算机存储信息的最小单位 二进制 0 1
字节byte 是计算机分配内存的最小单位 通常用B表示
1byte == 8bits
转义字符
\
\n 换行
\t 缩进
\\ \
\'
\"
进制
二进制 0 1 组成
0b1 0b0
八进制 0-7组成 00-07(0开头)
十进制 0-9组成
十六进制 0-9 abcdef组成 不区分大小写
0x0a(0x开头)
数据类型转换
数据类型表示范围
隐式类型转换double>float>long>int>short>byte
char
在赋值过程 小数据类型值或变量可以直接赋值给大类型变量 类型会自动转换
大类型数据给小类型数据可能会损失 编译错误
short/byte/char自动转换int 计算
各种类型的值都参与计算,范围小的会自动提升范围大的 计算
显示类型转换
赋值过程如果大类型都赋值给小类型变量 编译报错 可以强制类型转换
格式float float1=(float)3.14;
强制转换 注意值的问题
操作符
对于字面值常量 变量进行操作的符号 也叫运算
表达式
用操作符将字面值常量,变量连起来的式子
运算符分类
算数运算符
+ - * / %
求余运算 结果正负符号只与表达式运算符左边操作符符号有关
表达式只要有字符串参与 结果都是字符串
字符串加其他任何类型数据 结果都是字符串System.out.println("hello"+'a'+1); helloa1
区分字符串和字符
自增 自减 a++ ++a 没区别单独使用
赋值运算符
= *= <<= &=
比较 条件 关系 运算符分类
> < >= <= == !=
// 在js
== != 判断值是否相同
=== !== 判断类型是否相同 在判断值
从键盘录入两个整形数字 比较大小 输出结果
移位操作符
逻辑操作符
&& ||
带逻辑短路
2>1&&3>2;
同真则真
2>3&&3>2
true||fasle 结果为true
! 非 取反
^ 异或
两个都是0 结果0
两个都是1 结果0
1个1 1个0 结果1
有假则假
三目运算符
求两个数最大值 最小值
表达式?语句1:语句2
可读性低 不建议
流程控制
顺序执行
分支结构
if(){
} else{
}
循环结构
for while do-while
switch case
switch case()
case 1:
语句1;
break;
case 2:
语句2;
break;
default:
所有条件都不匹配 执行这里
如果满足case语句 没有break 代码回顺序往下执行 直到遇到break 如果一直没有break 执行default
break;跳出当前循环
循环语句遇到break跳出循环
continue
结束本次循环 进入下次循环
循环结构
for
for(初始化语句;条件判断语句;条件控制语句){
// 循环语句体
}
// 死循环
for(;;){
}
while
while(条件判断语句){
循环语句
条件控制语句
}
// 死循环
while(true){
}
do-while
do{
循环语句
条件控制语句
}while(条件判断语句)
// 死循环
do{
}while(true)
循环中的几个关键字
break;
跳出当前循环
循环语句遇到break关键字,循环直接结束
continue;
结束本次循环,进入到下一次循环
label;
代码中出现多层循环嵌套,label标签配合break关键字,可以使程序从内部循环中跳出
如果想让break或continue针对某一个指定的循环起作用,那么可以使用label标签 给循环起名字,然后 使用break或continue加上label标签名即可。
循环嵌套
一个循环可以嵌套另外一个 或者多层for 循环
方法
就是完成特定功能的代码块
通过方法的定义和调用,可以大大提高代码的复用性和可读性
定义格式:
修饰符 返回值类型 方法名 形参列表 形式参数列表
public void main (){
// 方法体
}
public int getSum(int a,int b){
return a + b;
}
getSum(1,2);
方法重载
同一个类中,如果函数名相同,但是参数列表不同(参数的数据类型不同、参数的个数不同),就构成方法的重载
重载与返回值类型无关
数组
表示一块连续的内存空间
可以存储多个元素
要求元素的数据类型一致
数组定义的方式
// 数据类型[] 数组名
int[] arr;
double[] arr;
// 数据类型 数组名[]
int arr[]
double arr[]
数组在没有初始化的时候不能使用
数组长度
arr.length 是一个属性 不是方法
必须在创建数组对象时就明确指定
一旦确定,无法改变
>=0 不能为负数
数组的下标从0开始 数组的下标最大值是 length - 1;
数组异常
数组下标越界
java.lang.ArrayIndexOutOfBoundsException
索引越界异常发生在尝试访问数组或集合的某个位置时,该位置超出了实际存在的范围。
例如,数组的索引是从0到数组长度减1,如果尝试访问超出这个范围的索引,就会抛出IndexOutOfBoundsException。
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(numbers[5]); // 尝试访问数组的第六个元素
}这段代码会抛出IndexOutOfBoundsException,因为数组numbers只有5个元素,索引范围是0到4。
}
空指针异常
java.lang.NullPointerException
空指针异常发生在尝试使用一个未被分配内存的引用变量时。
换句话说,当你尝试调用一个未指向任何对象的引用变量的方法或访问其字段时,就会抛出NullPointerException。
public class Main {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // 尝试访问null引用的length方法
}
}这段代码会抛出NullPointerException,因为str没有指向任何字符串对象。
数组的默认值
动态初始化后的数组会有默认值
int 0
double float 0.0
char \u0000
boolean false
String null
数组初始化
动态初始化
int[] arr1 = new int[3];
静态初始化
int[] arr2 = new int[]{1, 2, 3, 4, 5};
int[] arr3 = {1, 2, 3, 4, 5};
注意错误写法
内存空间
使用
工具类
注意导包
java.util.Arrays 包含了操作数组的很多方法
Arrays.copyOf(array,10);
Arrays.toString(array);
Arrays.sort(arr1);
Arrays.fill(arr1,10)
数组拷贝
数组的长度不能更改,但是如果有更多的元素存入数组,可以创建一个新的更大的数组,将旧的数组中的元素放进去,然后再放新数组
java.lang.System 中 有个方法
arraycopy 可以实现复制数组中的元素的功能
[0,1,2,3]
[0,0,0,0,0,0,0,0,0,0]
[0,1,2,0,0,0,0,0,0,0]
arraycopy(
老数组,
int 从哪里开始复制, 0
新数组,
int 复制到哪里,0
int 长度,3
)
二维数组
数据类型[][] 数组名=new 数据类型[一维长度][二维长度];
方式二
数据类型[][] 数组名=new 数据类型[一维长度][];
元素的赋值与访问
可变参数列表本质是一个数组 方法中使用可变参数列表 比用数组做参数更强大
可变参数和普通参数共同存在 可变参数必须放到最后一个参数的位置
public ststic void addAB{int a,int b}
public ststic void addAB(double a,double b}
学习中遇到所有报错
编译型报错 Javac
运行型 Java