java基础
第一章、Java背景及HelloWorld案例
1.Java概述
Java1995年上线, 创始人及公司詹姆斯·高斯林(James Gosling) Sun公司
2.jdk
jdk(Java Development Kit) 开发工具包,包含了JRE和开发工具
jre(JAVA Runtime Environment)Java运行时环境 内部提供了 jvm+类库
jvm(Java Virtual Machine) Java虚拟机
包含关系
jdk–>jre–>jvm
javac编译工具, java运行工具
3.简单的DOS命令
D: 盘符切换
dir 查看当前目录下的内容:
cd XXX 进入指定目录
cd… 回退到上一级
cls 清屏
exit 退出dos命令窗
4.环境变量配置
系统环境变量
新建 %JAVA_HOME% 值:jdk的安装路径
path变量 新建 %JAVA_HOME% \bin;
5.编写HelloWorld案例
显示文件的扩展名 :我的电脑——查看——勾选文件扩展名
1.HelloWorld编写第一步:新建txt文件,修改名称为HelloWorld.java
2.HelloWorld编写第二步:用记事本打开HelloWorld.java,写程序内容,如下
`public class HelloWorld{`
`public static void main(String[] args){`
`System.out.println("HelloWorld");`
`}`
`}`
注意:public 限制文件名与类名一致
1.写完代码要 ctrl +S 保存代码
2.书写要求:
1.大括号要一对一对写
2.严格区分大小写
3.严格区分中英文
3.运行–>cmd–>切换至Java文件所在目录–>javac HelloWorld.java–>java HelloWord
第二章 基础语法
1.注释
//这是单行注释
/*
这是多行注释
*/
/**
这是一个文档注释
*/
注意 注释不参与运行
2.关键字
Java中具有特殊含义的单词
特点 全部小写,在编译器和高级记事本中有高亮显示
3.常量
在Java的执行过程中其值不会发生改变的量
字符常量 ' A '
整数常量 10
小数常量 1.23
字符串常量 " 你好 "
空常量 null
4.变量
经常发生改变的数据就是变量
变量就是内存中的存储空间,空间中存储着经常发生改变的数据
变量的定义格式 数据类型 变量名=值; int a=10;
5.数据类型
Java中对每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们所表示的数据大小也是不一样的
数据类型内存占用和取值范围
四类八种
int (byte short long ) char boolean double(float)
对应的内存空间
byte 1个字节 -128-127
short 2个字节 -32768,32767 2^15-1
char 2个字节 0-65535
boolean 1个字节 true or false
int 4个字节 -21亿-21亿
long 8个字节
float 4个字节(取值范围大于int long)
double 8个字节
6.数据类型转换
a. 隐式转换 小的给大的赋值
b.强制类型转换 大的给小的赋值,会损失精度
demo int i = ( int ) 1.35 此时的i=1, 直接砍掉小数部分
7.标识符:就是给类,方法,变量等起名字的符号
标识符定义规则
*不能以数字开头
*不能包含特殊字符;除去$ 下划线_
*不能是关键字
常见命名约定
小驼峰命名法 示例 :stuName 方法名,变量名
大驼峰命名法 示例 :StuTest 类名
第三章 运算符
1.基本运算符
+(加), -(减) ,*(乘) , /(除) ,%(取模)
注意 : 整数与整数想除或者取模只能得到整数
2.赋值运算符 =
int a=3; 左边的数据赋值给右边
3.扩展赋值运算符 +=, *=, %=, /=, -=(只能常量使用;10+=1等同于10=10+1;不成立)
a+=10; 等同于 a=a+10;
a-=10; 等同于 a=a-10;
a*=10; 等同于 a=a乘10;
a%=10; 等同于 a=a%10;
a/=10; 等同于 a=a/10;
扩展赋值运算符隐含了强制类型转换
short s=10;
s+=1; 等同于 s = ( short ) s + 10
4.关系运算符
= , < , <= , ==(java中两个等号代表等同于) , !=(等于取反,不等于)
关系运算符返回一个boolean类型的值 true 或false
5.逻辑运算符 &(与) , |(或) , !(非,取反) , ^(异或);
通常用来连接连个表达式
数学中 3<x<5,Java中表示为x>3&x<5
true & true 结果 true true |true 结果 true
false & false 结果false false | false 结果false
true& false 结果false true |false 结果true
false & true结果false false | true结果true
&遇false则false |遇true则true
------
true^true 结果 false ! true 取反为false
false ^false 结果false ! false 取反为true
true^false 结果true
false ^true结果true
^ 舍同求异
6.短路逻辑运算符
&& (短路与) ||(短路或)
&& 遇false则false,左边为false右边就不执行了
|| 遇true则true ,左边为true 右边就不执行了
7.三元运算符
(条件表达式)?表达式1:表达式2;
如果条件表达式值是true返回表达式1,值是false返回表达式2;
注意: 返回类型必须与接受类型一致
第四章 流程控制语句
1.顺序结构
Java中默认的执行流程, 自上而下,从左到右依次执行
2.分支结构(选择结构)
if语句(1)if(关系表达式){ 语句体 } 关系表达式值为true,执行if中的语句体`
if语句(2)if(关系表达式){ *二选一*`
语句体 关系表达式值为true,执行if中的语句体,否则执行else中的语句体
}else{
语句体
}
if语句(3)
if(关系表达式1){ 多选一`
语句体1 如果关系表达式1为true,执行 语句体1,表达式1为false,向下执行`
}else if(关系表达式2){ 如果关系表达式2为true,执行 语句体2,表达式2为false,继续向下执行`
语句体2
}else if(关系表达式3){ 如果关系表达式3为true,执行 语句体3,表达式3为false,继续向下执`
语句体3
}.......else{ ...................`
语句体4} 如果条件都不匹配,执行语句体4`
3.switch语句
定义格式:
switch(值){ 这里的值是一个变量,可以是int ,String,enum,char`
case 1: 如果值==1;执行语句体1;`
语句体1
break;
case 2: 如果值==2;执行语句体2;`
语句体2 直到找到对应的值,如果找不到执行语句体n`
break;
..............
deflaut :
语句体n
(对范围之外的值进行友好提示)
}
break省略不写会出现case穿透,遇到下一个break结束,或者执行完整个switch语句块`
3.循环语句
(1)for循环
for(初始化语句;条件判断语句;条件控制语句){ 执行流程 : 初始化语句(只执行一次); 条件判断语句是true,执
语句体 行,条件控制语句,执行循环语句体,继续执行条件判断语句是tr
语句体 ue执行,条件控制语句,直到条件控制语句是false
}
(2)while循环
初始化语句 执行流程与for循环相同
while(条件判断语句){ 明确循环次数用for
循环语句体 不明确循环次数用while
条件控制语句
}
(3)do....while 因为条件控制语句在循环语句体下边,所以do...while循环,会先执行一
初始化语句 循环体,然后进行判断;就算条件是false,循环体至少执行一次
do{
循环语句体
}while(条件控制语句)
4.死循环
(1)for(;;){}
(2)while(true){}
(3)do{}while(true)
5.break,continue
break: 结束break所在的循环
continue: 跳出本次循环 逢七过
第五章 数组
1.定义
数组是可以存储多个相同数据类型的容器
静态初始化
数据类型 [ ]变量名={值1,值2,值3}; int[ ]arr={1,2,3}
动态初始化
数据类型 [ ]变量名=new 数据类型[数组长度]; int[ ]arr=new int[3]
2.使用元素访问数组的元素
数组名[索引]
3.数组的length属性,返回数组的长度
arr.length
4.为数组的元素赋值
* A: 为数组的元素赋值
* a: 如果在使用数组时,不想使用这些默认初始值,也可以显式地为这些元素赋值。
* 赋值过的元素已经变为新的数值,没有赋值的元素默认初始化的数值
* b: 案例
publicclass ArrayDemo02 {
public static void main(String[] args) {
int[] arr = new int[4]; // 定义可以存储4个整数的数组
arr[0] = 1; // 为第1个元素赋值1
arr[1] = 2; // 为第2个元素赋值2
// 下面的代码是打印数组中每个元素的值
System.out.println("arr[0]=" + arr[0]);
System.out.println("arr[1]=" + arr[1]);
System.out.println("arr[2]=" + arr[2]);
System.out.println("arr[3]=" + arr[3]);
}
}
5.遍历数组
* A:遍历数组
* 在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历
* B:练习
`
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 }; // 定义数组
// 使用for循环遍历数组的元素
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 通过索引访问元素
}
}
}
上述代码中,定义一个长度为5的数组arr,数组的角标为0~4。由于for循环中定义的变量i的值在循环过程中为0~4,因此可以作为索引,依次去访问数组中的元素,并将元素的值打印出来
6.数组中常见的异常
* A: 数组操作中,常见的两个异常
数组的索引越界异常
空指针异常
* B: 练习
public class ArrayDemo_4{
public static void main(String[] args){
//数组的索引越界异常
//int[] arr = {5,2,1};
//数组中3个元素,索引 0,1,2
//System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsException: 3
//空指针异常
int[] arr2 = {1,5,8};
System.out.println(arr2[2]);
arr2 = null; // arr2 不在保存数组的地址了
System.out.println(arr2[2]);//java.lang.NullPointerException
}
}
7.数组最值
* A: 数组获取最值的原理思想
* 定义数组的第一个元素arr[0]为最大值;循环arr数组,判断如果有比arr[0] 大的就交换,直到arr数组遍历完毕,那么arr[0]中就保存了最大的元素
8.数组获取最值代码实现
A: 代码实现
int max = arr[0]; 定义最大值的时候应该假设最大值为arr[0]
public class ArrayDemo05 {
public static void main(String[] args) {
int[] arr = { 4, 1, 6, 3, 9, 8 }; // 定义一个数组
int max = arr[0];
// 定义变量max用于记住最大数,首先假设第一个元素为最大值`// 下面通过一个for循环遍历数组中的元素
for (int x = 1; x < arr.length; x++) {
if (arr[x] > max) { // 比较 arr[x]的值是否大于max
max = arr[x]; // 条件成立,将arr[x]的值赋给max`
}
}
System.out.println("max=" + max); // 打印最大值`
}
}
第六章 方法
1.方法的格式
a.定义格式 权限修饰符 静态修饰符 返回值类型 方法名( 参数列表 ){ }
b.调用格式 方法名( 实参 ) ;
2.方法的作用
提高了代码的复用性,体现了封装的思想
3.方法的形参实参
形参: 形式参数 方法中定义的用来接受实参的变量
实参: 实际参数 调用方法时传入的参数,实参与形参之间传递的是实参记录的值
注意: 基本类型传递参数时,传的是他的数值
引用数据类型传递参数时,传的是他的地址值
4.方法的返回值类型
a.方法定义中的类型和return带回的数据类型必须一致
b.可以是任意数据类型
5.方法的重载
方法名相同,参数列表不同,构成方法的重载
参数列表不同表现为: 个数不同 类型不同 顺序不同
应用场景 同一个功能对不同数据类型的处理
例如 println( ); 就使用了方法的重载
6.方法中易错知识
基本数据类型作为参数调用方法后,其值不会发生改变,方法中的a 和main中的a是两个变量,互不相关
引用数据类型作为参数调用方法后,方法中的形参接收到地址值,通过地址值对堆内存中的数据进行修改
在主方法中继续引用时通过地址找到的是内存中被修改的值
public class Test1 {
public static void main(String[] args) {
int a=10;
method(a);
System.out.println(a); //此时输出a=10
int[]arr={1,2,3};
method1(arr);
System.out.println(arr[0]);//此时输出arr[0]=100;
}
private static void method1(int[]arr) {
arr[0]=100;
}
private static void method(int a) {
a=20;
}
}
第七章 类和对象
1.类和向对象
类
类是对象的数据类型
类是对现实生活具有共同属性,共同行为的事物的抽象,
对象
对象是具体的实列 具体存在的事物
2.对象的属性和行为
属性:对象具有的各种特征,每个属性都有特定的值
行为: 对象的动作,( 具有操作数据行为的方法)
3.类
public class 类名{
属性 成员变量 (名词)
行为 成员方法 (动词)
}
send 发送 message 消息
4.实体类和测试类
实体类 抽象的类 (没有main方法)
测试类 创建对象的类(写main)
5.成员变量和局部变量的区别
区别 成员变量 局部变量
内存中存放位置 堆内存 栈内存
类中位置 类中方法外 方法内部
生命周期 随着对象存在而存在,随着对象消失而消失 随着方法进栈而创建,随着方法弹栈消失
6.对象的使用
对象名.变量名
对象名.方法名
7.对象的内存图
两个变量指向同一个内存地址;
第二次之后的赋值都会把之前的值覆盖掉 两绳牵一狗
8.this 关键字
1.this 本类成员变量引用
2.this指向方法调用者的内存地址 等同于 谁调用方法this就代表谁
9.构造方法
1.格式 :
//无参构造
public 类名 (){
}
//有参构造
public 类名(参数列表){
this.本类成员变量=参数
}
2.作用
创建对象的方法 被new自动调用
3.类中不写构造方法,系统默认提供一个无参构造方法
类中写了构造方法,系统就不在提供,
/*同时写上无参和有参构造*/
10.标准类
public class Student{
//成员变量
private String name;
private int age ;
//构造方法
public Student(){}
public Student(String name,int age ){
this.name=name;
this.age=age;
}
//get And set
public void setName(String name){
this.namea=name;
}
public void getName(){
return name;
//这里省略了this 相当于return this.name
}
//成员方法
public void show(){
System.out.println(getName()+","+getAge())
}
}
第八章 String类
1.API java中已经写好的类
-
Scanner类
nextInt 键盘录入整数
next 键盘 录入字符串 以空格,回车,tab作为标记结束
nextLine 录入字符串 以回车作为结束标记
能够接受完整的数据 " 包括空格"及空格之后的数据
3.String 类
3.1 构造方法
//构造方法
String() 初始化新创建的 String对象,以使其表示空字符序列。
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。
String(char[] value) 分配一个新的 String以便它表示当前包含在字符数组参数中的字符序列。
3.2 ==
== 基本数据类型 比较的是数据值
== 引用数据类型 比较的是数据的地址值
3.3 常量优化机制
byte a=10+20;
两个常量相加,编译的时候就会进行计算,判断10+20是不是在byte的范围之内
String c="a"+"b";
两个String常量拼接,编译的时候就会进行拼接,如果常量池已经存在相同字符串,直接引用,不再创建新的对象
4.String常用方法
boolean equals(); 字符串内容比较,判断两个字符串是否相同
boolean equalsIgnoreCase(); 字符串内容比较,判断两个字符串忽略大小写是否相同
char charAt(); 获得字符串索引位置的字符
int length(); 获取字符串的长度
char[] toCharArray();将字符串转为字符数组
String substring(int begin,int end) 截取字符串,含头不含尾
String substring(int beginIndex) 从索引处开始截取,直到结束
String replace(oldString,newString) :替换字符串内容,把就旧的内容用新的内容替换 //替换所有就旧值oldString
5.StringBuilder
5.1常用方法
append(); 字符串拼接
resverse(); 反转字符串
length(); 返回字符串的长度
toString(); 将StringBuilder转为String
5.2 概述
可变字符串;他的长度可以改变
作用 提高字符串的操作效率
5.3构造方法
StringBuilder(); 空的StringBuilder
StringBuilder(String s); 参数String转变为StringBuilder
5.4
在做字符串大量拼接的时候,StringBuilder效率远高于String
String本身不可变,大量拼接的时候会重新创建对象,拼接一次就会创建一个对象,效率低
StringBuilder 可变 只需要向后追加即可
第九章 ArrayList
1.概述
长度可变的容器;
底层是数组
每次扩大自身长度的1/2,
2.常用方法
add(元素); :添加元素到集合的末尾 (添加返回true)
add(索引,元素); :把元素添加到指定索引(插队)(无返回值)
remove(索引); :把索引位置元素删除 (返回被删除的元素)
remove(元素): :删除集合中第一个与参数相同的元素 (返回Boolean值)
set(索引,元素) ; :设置索引位置元素 (返回被修改的元素)
get(索引); :获取索引位置的元素
size(); :返回集合的长度
3.删除集合中的元素
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("秋雅");
list.add("貂蝉");
list.add("王冰冰");
list.add("貂蝉");
list.add("貂蝉");
//方式一
for (int i = 0; i < list.size(); i++) {
if("貂蝉".equals(list.get(i))){
list.remove(i);
i--;
}
}
//方式二
for (int i = list.size() - 1; i >= 0; i--) {
list.remove("貂蝉");
}
System.out.println(list);
}