目录
1.数组介绍
问题: 什么是数组? 什么情况下使用数组? 数组就是一种容器, 可以存储(同种数据类型)的多个值. double[] arr = {11.1, 22.2, 33.3, 10}; System.out.println(arr[3]); // 10.0 场景: 如果发现要操作的多个数据, 属于同一组数据, 就可以考虑使用数组容器来进行维护.
1.数组的定义格式
1. 数据类型[] 数组名; 2. 数据类型 数组名[]; 注意: 这种格式定义出来的, 仅仅只是数组类型的变量.
int[] arr;
System.out.println(arr); // 编译错误, 提示没有进行初始化
2.数组的静态初始化
- 初始化: 为数组容器在内存中, 开辟空间, 并将数据存入空间中的过程. - 完整格式: 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...}; int[] arr = new int[]{11,22,33}; 错误示例: int[] arr = new int[3]{11,22,33}; --> 编译错误 - 简化格式: 数据类型[] 数组名 = {元素1, 元素2, 元素3...}; int[] arr = {11,22,33}; - 细节: 打印数组名称的时候, 会在控制台看到数组的十六进制地址值. [I@233ac34
3.数组的元素访问
格式: 数组名[索引]; 索引(角标,下标) : 数组容器中每一个空间, 所对应的编号, 编号从0开始逐个+1增长.
4.数组的遍历操作
介绍: 将数组中每一个元素取出来的过程, 取出来之后(打印, 判断, 求和...)
for(int i = 0; i < arr.length; i++){
// i : 索引
// arr[i] : 元素
}
细节: 数组名.length ---> 动态的获取到数组的长度(元素的个数) 遍历数组的快捷键: 数组名.fori + 回车
5.数组的动态初始化
介绍: 手动指定长度, 系统分配默认初始化值. 格式: 数据类型[] 数组名 = new 数据类型[长度]; 实例: int[] arr = new int[3]; 默认初始化值:
整数: 0
小数: 0.0
布尔: false
字符: '\u0000' --> unicode字符 ---> 常见的体现就是空白字符
引用数据类型 : null
引用数据类型: 数组, 类, 接口
两种初始化的区别: 动态初始化: 手动指定长度, 系统分配默认初始化值. 静态初始化: 手动指定元素, 系统会计算出该数组的长度. 两种初始化的使用选择: 1. 静态初始化: 如果要操作的数据都已经明确给出了, 推荐使用静态初始化 需求: 计算出班级学生的总成绩 (100,100,100,90) int[] arr = {100,100,100,99}; 2. 动态初始化: 只知道要存储几个元素, 但是不明确具体数值的情况 需求: 键盘录入5个元素, 并存入数组 需求: 产生10个1~100之间的随机数, 并存入数组
int[] arr = new int[5];
for(int i = 0; i < arr.length; i++){
arr[i] = sc.nextInt();
}
------------------------------------------
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
int num4 = sc.nextInt();
int num5 = sc.nextInt();
int[] arr = {num1, num2, num3, num4, num5};
6.数组的内存图
7.数组的常见问题
ArrayIndexOutOfBoundsException : 数组索引越界异常 原因: 访问了不存在的索引
NullPointerException : 空指针异常
原因: 当一个引用数据类型的变量, 记录到一份 null 值之后, 跟堆内存的指向就切断了
这时候还想去访问堆内存数据, 就会出现空指针异常.
8.二维数组介绍
介绍: 二维数组是一种容器, 内部存储的都是一维数组 理解: 数组的嵌套 场景: 如果发现要操作的多组数据, 又是同一组, 就可以考虑使用二维数组进行维护
举例:
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
{
{22,66,44},
{77,33,88},
{24,45,65},
{11,66,99}
}
9.二维数组的静态初始化
完整格式: 数据类型[][] 数组名 = new 数据类型[][]{ {一维数组}, {一维数组} }; 简化格式: 数据类型[][] 数组名 = { {一维数组}, {一维数组} }; 范例:
int[][] arr = {
{22,66,44},
{77,33,88},
{24,45,65},
{11,66,99}
};
二维数组的元素访问:
数组名[索引]; ---> 获取到的是一维数组
数组名[m索引][n索引] :
m索引 : 指定要访问哪一个一维数组
n索引 : 指定访问一维数组中的哪一个元素
System.out.println(arr[2][1]);
10.二维数组的遍历操作
思路: 1. 遍历二维数组, 获取到每一个一维数组 2. 遍历每一个一维数组, 获取到具体的元素
for(int i = 0; i < arr.length; i++){
// arr[i] : 每一个一维数组
for(int j = 0; j < arr[i].length; j++){
System.out.println(arr[i][j]);
}
}
11.二维数组的动态初始化
格式: 数据类型[][] 数组名 = new 数据类型[m][n];
int[][] arr = new int[2][3];
创建了一个二维数组, 数组名叫做arr, 该数组可以存储2个一维数组, 每一个一维数组可以存储3个元素.
细节: 可以将提前创建好的一维数组, 存入二维数组中.
int[] arr1 = {11,22,33};
int[] arr2 = {44,55,66};
int[][] arr = new int[2][3];
arr[0] = arr1;
arr[1] = arr2;
12.二维数组的内存图
2.方法
1.方法介绍
-
什么是方法 ?
-
方法就是一段具有独立功能的代码块,不调用就不执行。
-
-
方法的另外一个名字?
-
函数
-
-
方法的出现对程序有哪些好处?
-
可以将记在一起的臃肿代码,按照功能逻辑进行分类关系(提高代码的可阅读性)
-
可以提高代码的复用性
-
写好的一个方法, 可以进行多次调用
-
-
-
问题 : 方法的出现, 是否能够提高程序的执行效率 ?
-
不能 !
-
2.方法的通用定义格式
-
格式 :
public static 返回值类型 方法名 (参数) {
方法体;
return 返回值;
}
-
修饰符 : 目前来说, 就是 public static
-
返回值类型 : 跟返回值的类型要匹配
-
return 10; int return 12.3; double
-
-
方法名 : 自己起的名字 -> 见名知意 -> 小驼峰命名法
-
参数 : 方法运行之前所需要的材料.
-
方法体 : 方法中真正执行的逻辑代码
-
return :
-
用于返回结果数据
-
结束方法
-
-
今后自己定义方法的思路 :
-
参数 :
-
问题 : 思考自己这个方法中所使用的数据, 是否有灵活度的要求
-
没有 : 不写参数
-
有 :
-
-
问题 : 思考自己这个方法要什么类型的数据, 要几个?
-
举例 : 求出三个整数的最大值
-
类型 : int
-
数量 : int a, int b, int c
-
-
-
-
返回值类型 :
-
观察 : 自己这个方法逻辑写完了之后, 有没有结果的产生
-
没有 : void
-
有 : 写对应的数据类型.
-
-
-
3.方法的调用格式
-
不带返回值的方法 (void)
-
只能单独调用
public static void method(){ } method();
-
-
带返回值的方法
public static int getMax(int a, int b){ int max = a > b ? a : b; return max; }
-
单独调用 : geteMax(10,20);
-
丢失数据, 不推荐
-
-
赋值调用
-
int max = getMax(10,20);
-
推荐, 因为非常灵活.
-
-
输出调用
-
System.out.println(getMax(10,20));
-
不太推荐, 不够灵活.
-
-
4.方法常见问题
-
方法不调用就不执行
-
方法与方法之间是平级关系, 不允许嵌套定义
-
方法的编写顺序和执行顺序无关, 要想梳理执行顺序, 就看调用顺序.
-
如果一个方法没有返回值 (void) return语句可以省略不写, 但是非要写的话, 只能是 return;
-
retrun; 下面不要写代码, 因为执行不到.
5.方法重载 (Overload)
-
目标 1: 能够独立识别出方法与方法之间是否是正确的重载关系
-
在同一个类中, 方法名相同, 参数不同
-
个数不同, 类型不同, 顺序不同.
-
-
-
目标2 : 能够理解方法重载出现的好处
-
不需要记忆过多繁琐的方法名字了.
-
假设没有方法重载 :
System.out.printInt(10); System.out.printDouble(10.0);
-
有方法重载:
System.out.println(10); System.out.println(10.0);
-
6.方法参数传递面试题
-
打开ppt文件夹,将内部流程梳理清楚。
-
方法的参数传递问题:
-
基本数据类型:传递的是具体的值
-
引用数据类型:传递的是地址值
-
3.面向对象(基础)
1.面向对象介绍
-
什么是面向对象呢 ?
-
面向对象不是一门技术,而是一种编程的指导思想
-
指导我们以什么方式去思考问题,指导我们以什么方式去编写代码
- 当要解决问题的时候, 就要思考, 是否已经有存在的对象, 可以解决这个问题. - 解决的问题是键盘录入 : Scanner - 解决的问题是产生随机数 : Random - 解决的问题是对多个学生的信息进行管理 : Student --> 自己写的类.
-
-
面向对象主要学习什么 ?
-
学习自己如何设计对象
-
学习已有的对象该如何使用.
-
2.类和对象
-
什么是类 ?
-
类是一组相关属性和行为的集合 , 可以将其看做为是对象的 [设计图]
-
-
什么是对象 ?
-
根据类, 所创建出来的实体.
-
-
类和对象的关系 ?
-
依赖关系, 需要根据类去创建对象
-
根据一个类, 还可以创建多个对
-
-
类的组成 ?
-
属性 (成员变量) 成员变量跟之前定义的变量格式一样, 只不过位置发生了改变, 放在类中方法外.
-
什么样的东西, 作为类的属性呢?
-
事物的一些特征信息 , 姓名, 年龄, 身高... (名词)
-
-
-
行为 (成员方法) 成员方法跟之前定义方法的格式一样, 只不过去掉了 static 关键字.
-
什么样的东西, 作为类的行为呢?
-
行为指的是该事物具体能做的事情, 吃饭, 学习...(动词)
-
-
-
public class Student {
String name;
int age;
public void study(){
System.out.println("学生学习");
}
}
3.对象的创建和使用
-
创建对象的格式
类名 对象名 = new 类名(); Student stu = new Student(); - 打印对象名的时候, 会看到内存地址.
-
使用成员变量的格式
对象名.变量名; stu.name = "张三"; System.out.println(stu.name); System.out.println("姓名为:" + stu.name); - 如果没有给成员变量赋值, 获取到的就是成员变量的默认初始化值.
-
使用成员方法的格式
对象名.方法名(); stu.study();
4.对象内存图
-
一个对象的内存图
-
两个对象内存图
-
在一次程序的执行过程中, 创建了多个对象, 该类的字节码文件加载一次.
-
每new一次, 都是一个新的对象, 在堆内存中会有自己独立的内存空间.
-
-
两个引用指向相同空间内存图
-
成员变量和局部变量的区别
-
编写位置不同
-
成员变量 : 方法外
-
局部变量 : 方法中
-
-
初始化值不同
-
成员变量 : 有默认初始化值
-
局部变量 : 没有默认初始化值, 使用之前必须完成赋值.
-
-
内存位置不同
-
成员变量 : 堆内存
-
局部变量 : 栈内存 -- 栈内存的所属方法当中
-
-
生命周期不同
-
成员变量 : 随着对象的创建而存在, 随着对象的消失而消失
-
局部变量 : 随着方法的调用而存在, 随着方法的调用结束而消失.
-
-
作用域
-
都在自己所在的大括号中.
-
-
5.this关键字
-
this关键字可以解决的问题
-
情况 : 如果局部变量和成员变量重名了, Java 会根据就近原则, 优先使用局部变量.
-
非要使用成员变量的话, 就可以使用 this 关键字进行区分.
-
public class Student {
String name = "张三";
public void show(){
String name = "李四";
System.out.println(name); // 李四
System.out.println(this.name); // 张三
}
}
-
this 关键字的概念 :
-
this 代表当前类对象的引用 (地址)
-
哪一个对象调用的方法, 方法中的this, 就代表的是哪一个对象 .
-
stu1.show() --> this --> stu1的地址
-
stu2.show() --> this --> stu2的地址
-
-
-
this的内存图
-
6.构造方法
-
构造方法 (构造器) : 用于创建对象.
-
构造方法的格式 :
-
方法名与类名相同, 大小写也要一致
-
没有返回值类型, 连 void 都没有
-
没有具体的返回值 (不能由return语句带回结果数据.)
-
-
构造方法的执行时机 :
-
在创建对象的时候, 被系统自动调用执行.
-
每创建一次对象, 就会执行一次构造方法.
-
注意 :构造方法不能手动调用, 不能通过对象名.的形式进行调用
-
-
构造方法的注意事项
-
如果一个类当中, 没有手动编写过构造方法, 系统将会提供一个默认的, 无参数的构造方法
-
如果手动编写了构造方法, 系统将不会再系统那个默认的无参构造了.
-
建议 : 无参构造方法, 带参构造方法, 全部手动给出.
-
构造方法也是方法, 允许重载关系.
-
7.封装 (重点)
-
面向对象三大特征 : 封装, 继承, 多态
-
封装 : 隐藏实现细节, 仅对外暴露公共的访问方式.
-
封装在代码中常见的体现:
-
将属性抽取到类当中, 这是对数据进行的一种封装
-
封装前 :
工号 姓名 年龄 电话 1 张三 23 156JQKA1111 2 李四 24 156JQKA1111 3 王五 25 156JQKA1111 4 赵六 26 156JQKA1111 使用Java代码保留这些数据并使用. String id1 = "1"; String name1 = "张三"; int age1 = 23; String tel1 = " 156JQKA1111"; String id2 = "1"; String name2 = "张三"; int age2 = 23; String tel2 = " 156JQKA1111"; String id3 = "1"; String name3 = "张三"; int age3 = 23; String tel3 = " 156JQKA1111"; String id4 = "1"; String name4 = "张三"; int age4 = 23; String tel4 = " 156JQKA1111"; 弊端: 变量太多, 太零散, 不方便进行管理.
-
封装后 :
工号 姓名 年龄 电话 1 张三 23 156JQKA1111 2 李四 24 156JQKA1111 3 王五 25 156JQKA1111 4 赵六 26 156JQKA1111 public class Employee { String id; String name; int age; String tel; ... } Employee e1 = new Employee("1","张三",23,"156JQKA1111"); Employee e2 = new Employee("2","张三",23,"156JQKA1111"); Employee e3 = new Employee("3","张三",23,"156JQKA1111"); Employee e4 = new Employee("4","张三",23,"156JQKA1111");
-
-
将代码功能抽取到方法中, 这是对代码功能进行的一种封装
public static void printArray(int[] arr){ ... 遍历数组的代码 } printArray(arr);
-
8.private关键字
-
权限修饰符 : 修饰的是成员 (变量, 方法, 构造方法)
-
private : 在同一个类中
-
默认的 : 在同一个类中, 在同一个包下进行访问
-
protected : 就业班再学..
-
public : 可以在任意位置访问
-
-
今后使用最多的 :
-
private
-
public
-
9.标准 JavaBaen (重点)
-
JavaBean 类 : 用于封装数据的类
-
要求 :
-
成员变量需要私有化
-
提供空参, 带参构造方法
-
针对于私有的成员变量, 提供对应的setXxx和getXxx方法.
-