一维数组
当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数组,一维数组本质上就是在内存空间中申请一段连续的存储单元
一维数组的声明方式
数据类型[] 数组名称 = new 数据类型[数组长度]
同时指定初始值
数据类型[] 数组名称 = new 数据类型[]{..,..,..}
数据类型[] 数组名称 = {..,..,..}
案例1:使用元素11,22,33,44分别对数组中前四个元素赋值后打印
int[] arr = new int[5];
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = (i + 1) * 11;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
案例2:将元素55插入到下标为0的位置,所有元素向后移动,并打印
int[] arr = new int[5];
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = (i + 1) * 11;
}
for (int i = arr.length - 1; i > 0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = 55;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
案例3:将元素55从数组中删除,删除方式为后续元素向前移动,最后位置置为0,并打印
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
arr[4] = 0;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
一维数组的优缺点:
- 可以直接通过下标的方式访问指定位置上的元素,速度很快
- 数组要求所有元素的类型相同
- 数组要求内存空间连续,并且长度一旦确定就不能修改
- 增加和删除元素时可能需要移动大量元素,效率低
案例:统计用户输入任意一个正整数中每个数字出现次数的统计并打印
123123-->1出现2次,2出现2次,3出现2次
怎么把一个正整数拆分?先对10取余,再对10取商
代码实现
//1.提示用户输入一个正整数并使用变量记录
System.out.println("请输入一个正整数:");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
//2.准备一个长度为10,元素类型为int的一维数组
int[] arr = new int[10];
//3.拆分正整数中每个数字并记录到数组中
while (i > 0){
//对应数字下标,只要出现,次数就加1
arr[i % 10]++;
//丢弃
i /= 10;
}
//4.打印统计结果
for (int j = 0; j < arr.length; j++) {
if (arr[j] > 0){
System.out.println("数字" + j + "出现了" + arr[j] + "次");
}
}
差一个二维数组,杨辉三角
类与对象
面向过程与面向对象
面向过程:自己去洗衣服,拿盆,接水,泡衣服,搓衣服,晾起来
面向对象:交给洗衣机全部解决
对象主要指现实生活中客观存在的实体,在Java语言中对象体现为内存空间中的一块存储区域
引用类型
在堆中申请一段内存空间
值传递:
当参数是基本类型的时候,传递参数的时候,真实赋值
当参数是对象的时候,对象地址赋值给形参(如果不new对象,改变内容,随之改变。如果new对象,申请了新的地址,不会改变)
判断是否为构造方法?
构造方法名与类名完全相同并且没有返回值类型,连void都不许有
构造方法
使⽤new关键字创建对象时会⾃动调⽤构造⽅法实现成员变量初始化⼯作。
方法的重载(Overload):方法名称相同,参数列表不同
方法重载只要体现在:参数个数不同,参数类型不同,参数顺序不同
this关键字
当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就近原则),若希望使用成员变量,则需要在成员变量的前面加上this.的前缀明确要求该变量的成员变量
递归
递归的本质就是在方法体的内部直接或间接调用当前方法自身的形式
封装
通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,与现实生活不符
为避免上述错误的发生,需要对成员变量进行密封包装处理,来隐藏成员变量的细节以保证成员变量数据的合理性
1.私有化成员变量,使用private关键字修饰
2.提供公有的set get方法,使用public关键字修饰,在方法体中进行合理值的判断
3.在构造方法中调用set方法进行合理值的判断
private关键字表示私有的含义,修饰成员变量表示该成员变量只能在本类的内部使用
声明变量的时候,在栈中申请一段内存,new的时候,在堆中申请一段内存
main程序入口
static关键字
使用static关键字修饰成员变量表示静态的含义
如果没有加static,每个对象都有自己独立的一份
如果加了static关键字,此时成员变量由对象层级提升为类层级,整个类只有一份,并被所有对象共享,该成员变量随着类的加载准备就绪,与是否创建对象无关(并且放在方法区)
使用方式
-
在非静态成员方法中既能访问非静态的成员也能访问静态的成员
-
在静态方法中通常只能访问静态成员不能访问非静态成员(静态方法在类加载的时候就创建了,非静态需要创建对象)
笔试:
构造块:在类体中直接使用{}括起来的代码块,每创建一个对象都会执行一次构造块
静态代码块:使用static关键字修饰的代码块,静态代码块随着类加载时执行一次
考:1.静态代码块、代码块、构造方法体执行顺序
静态代码块(隶属于类层级,随着类的加载准备就绪)-->构造块(编译后合并到构造方法体里面)-->构造方法体
2.创建两个对象,各执行几次
静态代码块执行一次,其余都是两次
单例设计模式
static Singleton 对象
继承
当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成一个公共类,让多个类吸收、继承公共类中已有的特性和行为,而在多个类中只需要编写自己独有的特征和行为
在java中使用extends关键字表示继承关系
使用继承提高了代码的复用性、可维护性及拓展性,是多态的前提条件
子类不能继承子类的构造方法和私有方法,但私有成员变量可以被继承只是不能直接访问
无论使用何种方式构造子类的对象时都会自动调用父类的无参构造方法,来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代码super()的效果
Java语言只支持单继承不支持多继承,也就是说一个子类只能有一个父类,但一个父类可以有多个子类
方法重写Override
从父类继承下来的方法不满足子类的需求时,就需要在子类中重新写一个与父类一样的方法来覆盖从父类继承下来的版本
基本原则:
方法名相同、参数列表相同以及返回值类型相同
要求方法的访问权限不能变小,可以相同或者变大
要求方法不能抛出更大的异常
又见构造块与静态代码块(笔试)
先执行父类的静态代码块,再执行子类的静态代码块
执行父类的构造块,执行父类的构造方法体
执行子类的构造块,执行子类的构造方法体
常见访问控制符