类和对象
类
模板(对现实世界的抽象描述)
通过使用属性来描述现实世界某种事物的特征,使用方法来描述行为。
对象
实例(现实世界中具体实例)
class 类名 {
private Type1 field1;
private Type2 field2 = value2;
prviate String name;
....
//无参构造器
public 类名() {
this(value1, value3);
}
//全参构造器
public 类名(Type1 field1, Type2 field2...) {
this.field1 = field1;
this.field2 = field2;
// 通用的初始化
}
//将对象封装,对外界提供公共的get/set方法
// get/set方法
public void m1() {
}
public void m2() {
}
.....
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
}
构造器间可以使用this()实现连锁调用。
构造方法:特殊方法,作用:在对象创建时自动执行一些初始化工作。
特征:
方法名与类名一致
没有返回值类型,甚至连void也没有
不能被final,static,synchronized,abstract等修饰
不可以像普通方法那样随意调用,只能在对象创建的时候被调用一次
引用变量间的传递也是值传递,不过是将变量中保存的地址复制过去。
this指代当前对象。(变量的访问就近原则)
创建对象:对象只能保存在引用变量中,并且引用变量中保存的是对象的首地址而不是对象本体。
操作对象实际是在操作对象的引用。
通过使用引用调用对象的属性,方法。
main() {
类名 引用 = new 类名();
// 一个对象的创建过程
// 1) 在永久区中检查要创建的对象所属的类的类模板是否存在
// 2) 如果不存在, 则由类加载器执行加载(读取类.class文件), 如果存在, 则不加载了.
类模板(属性的定义和方法代码)
// 3) 依据类中的属性的定义,在GC区中开辟适当的空间
// 4) 把此空间清0
// 5) 如果有显式赋值,则执行显式赋值
// 6) 执行构造器,进一步初始化
// 7) 返回对象在GC区中的首地址
引用.成员名
- 1
- 2
}
匿名对象:不将对象的地址值保存到引用变量中。
对象关联:以一个类的对象,作为另一个类的属性,从而形成两个类的关联。
package,import关键字
UML
类和对象需要大量的练习,参照笔记。
数组
数组 : 解决批量数据的存储
数组就是一个对象,数组中的元素是对象的成员变量
声明 :
元素类型[] 数组名(本质来看,是一个数组型的引用变量,保存着数组对象的首地址);
创建数组对象 :
数组名 = new 元素类型[数组长度];
数组元素的使用
数组名[下标] = 值;
System.out.println(数组名[下标]);
数组的动态创建:
元素类型[] 数组 = new 元素类型[长度]; // 如果是引用数组, 全部是空洞, 如果是基本类型数组,全部是0
如果是空洞,然后调用该对象的方法会产生空指针异常。
数组的静态创建
元素类型[] 数组 = {值1, 值2, 值3…};
元素类型[] 数组 = new 元素类型[] {值1, 值2, 值3…};
数组遍历 :
增强for循环(注意只可以使用增强for循环进行遍历,若是还进行其他操作,必须使用经典for循环)
for (元素类型 变量 : 数组名) {
访问变量相当于访问数组中每个元素值
}
int[] arr = {3, 8, 2, 0, 9, 7, 4}; 必须一行
for (int var : arr) {
System.out.println(var);
}
//找最值(两种-通过值
- 通过索引)
int max = arr[0];
for (int var : arr) {
if (var > max) {
max = var;
}
}
int maxIndex = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > arr[maxIndex]) {
maxIndex = i;
}
}
int maxValue = arr[maxIndex];
// 检索
int key = 70;
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == key) {
index = i;
break;
}
}
if (index == -1) {
System.out.println(“搜索的数据不存在”);
} else {
System.out.println(“下标是” + index);
}
// 取出数组中能被3整除的
int[] newArr = new int[arr.length];
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 3 == 0) {
newArr[count] = arr[i];
count++;
}
}
int[] child = new int[count];
for (int i = 0; i < count; i++) {
child[i] = newArr[i];
}
newArr = null;
// 扩容
int[] bigger = new int[比原来大];
for (int i = 0; i < arr.length; i++) {
bigger[i] = arr[i];
}
arr = bigger; // 如果是引用数组,则会产生大量的空洞
// 排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
//数组复制(创建新数组–>复制所有元素)
//获取子数组(创建一个新数组–>复制需要的元素)遍历的时候以容量小的数组为准
//数组反转
大量代码—>数组玩法(一)(二)