9.面向对象(1)
MODULE 9 面向对象
1.会定义静态成员以及会调用静态成员
2.会使用可变参数(会给可变参数传参)
3.会二分查找(手撕)
4.会冒泡排序(手撕)
5.会debug的使用
一、static关键字
(一)static的介绍以及基本使用
1.概述:static是一个静态关键字
2.使用:
(1)修饰一个成员变量:
static 数据类型 变量名
(2)修饰一个方法:
修饰符 static 返回值类型 方法名(形参){
方法体
Return 结果
}
(3)调用静态成员方法:
类名直接调用(不用new对象)
(4)静态成员特点:
A.静态成员属于类成员,不属于对象成员(非静态的成员属于对象 成员)
B.静态成员会随着类的加载而加载
C.静态成员优先于非静态成员存在内存中
D.凡是根据静态成员所在的类创建出来的对象,都可以共享这个静 态成员
(二)static修饰成员的访问特点
1.在静态方法中能直接访问非静态成员嘛?不能
想要调用:new对象调用
2.在非静态方法中能直接访问静态成员嘛?能
(1)同类:
直接调用
类名调用
(2)不同类:
类名调用
3.在静态方法中能直接访问静态成员嘛?能
(1)同类:
直接调用
类名调用
(2)不同类:
类名调用
4.在非静态方法中能直接访问非静态成员嘛?能
(1)同类:
直接调用
new对象调用
(2)不同类:
new对象调用
总结:
(1)不管在不在同一个类中,非静态成员都可以new对象调用
(2)不管在不在同一个类中,静态成员都可以类名调用
问题一:既然static成员那么好使(类名直接调用),那么我们在实际开发中, 能不能将所有的成员都定义成静态
不能
由于静态成员会随着类的加载而加载,如果将所有的成员都变成静态 的,那么类一加载,静态成员都会进内存,会大量占用内存空间
问题二:那么静态成员啥时候定义呢?
一般情况下,我们在抽取工作类的时候可以将工具中的所有成员都定 义成静态的
问题三:啥时候定义工具类?
比如我们在写代码的过程中,发现有的功能在反复实现,代码,功能 一样,此时就可以抽取出来,形成工具类
二、可变参数
1.需求:
定义一个方法,实现n个整数相加
2.分析:
方法参数位置,只明确了参数类型,但是不明确参数个数,此时就可以定义成 可变参数
(一)介绍和基本使用
1.定义格式:
数据类型...变量名
2.注意:
(1)可变参数的本质是一个数组
(2)参数位置不能写多个可变参数,而且当可变参数和其他普通参数一起使 用时,可变参数需要放到列表最后
三、递归
1.概述:方法内部自己调用自己
2.分类:
(1)直接递归:
public static void method(){
method()
}
(2)间接递归:
A(){
B()
}
B(){
A()
}
(3)注意:
A.递归必须要有出口,否则会出现“栈内存溢出”
B.递归即使有出口,递归次数不要太多
3.练习:
输出3到1
计算n的阶乘
斐波那契数例
四、数组常见算法
(一)数组翻转
1.概述:数组对称索引位置上的元素互换
(二)冒泡排序
数组的排序,是将数组中的元素按照大小进行排序,默认都是以升序的形式进行排序,数组排序的方法很多,比如冒泡排序
排序都是要进行数组元素大小的比较,再进行位置的交换,冒泡排序是采用数组中相邻元素进行比较换位
(三)二分查找
1.前提:数组中的数据必须是有序的
2.查询思想:
A.老式查询:遍历数组,一个一个比较 -> 查询效率慢
B.二分查找:每次找中间索引对应的元素进行比较查询(每一次查询少一半数据)
五、对象数组
(一)对象数组
1.需求:定义一个长度为3的数组,存储3个Person对象,遍历数组,将三个Person对象中的属性值获取出来
六、方法参数
(一)基本数据类型作为方法参数传递
基本类型做方法参数传递,传递的是值,不是变量本身
方法运行:压栈
方法运行完毕:弹栈 -> 释放栈内存
(二)引用数据类型作为方法参数传递
引用数据类型做方法参数传递时,传递的是地址值
七、命令行参数
八、其他操作
(一)快速生成方法
1.要求先定义再调用,可以先调用
A.快捷键:Alt + 回车
2.快速将一段代码抽取到一个方法中:
A.选中要抽取的方法
B.按ctrl+alt+m
(二)debug测试
1.概述:调试代码的一种操作
2.作用:能清楚的看到每个变量在代码执行过程过中的变化去找错