一、day10复习
1. this关键字(表示对当前对象的引用,和具体对象有关)
A. this修饰属性表示直接从类中寻找同名的成员变量
B. this修饰方法
a. this修饰成员方法:this.成员方法名();表示从类中寻找并调用该成员方法
b. this修饰构造方法: this(参数);表示从类中寻找并调用该构造方法,且this(参数)只能写在构造方法的首行,且不能成环
注意:只有构造方法之间才能相互调用,成员方法中不能调用构造方法。(构造方法只能通过产生对象时,编译器自动调用,为成员变量赋初始值;一组构造方法就是为了不同成员变量的赋值,因此可以互相调用)
C. this表示当前对象的引用,通过哪个对象调用属性或方法,this就指代谁
2. static: 与具体对象无关,和类本身有关
A. static修饰的属性称为类属性,与对象无关,和类本身有关,该类的所有对象共享此属性,在JVM的方法区保存静态变量
B. static修饰的方法称为类方法,一般工具类方法设置为静态方法,与对象无关
eg: Math.max(a,b); Array.sort(数组名); 与类强相关,与具体的对象无关。比如求最大值,不论哪个对象都是一样的规则
3. 注意:
A. 在静态方法中能否调用成员方法或者成员变量(F,成员方法或成员变量必须先生成对象通过对象调用,静态方法可以直接通过类调用,前后矛盾)
B. 在成员方法中能否调用静态方法或静态变量(T, 静态域没对象都能调用,成员方法是必须由对象才能调用,因此当然能够调用,虽然格式正确但是不推荐,一般直接通过类来调用静态域)
4. 注意:
A. 在静态方法中能否使用this关键字(F, this表示对象的引用,和注意3中的A类似)
B. 在成员方法中能否使用this关键字调用静态属性或方法(F,静态属性或方法没对象都能调用,因此肯定能够调用,但是一般不推荐)
5. 代码块
A. 普通代码块:直接定义在方法中,{}括起来的代码
B. 构造块:定义在类中,用{}括起来的代码。(实际上在编译的时候,将所有的构造块按之前的先后顺序移动到构造方法的最上方)
C. 静态块:使用static修饰,定义在类中的,用{}括起来的代码,只在类加载的时候执行一次,一般用于类的静态变量的初始化或者用于打印类加载相关信息
注意:执行顺序:静态块>构造块>构造方法>普通方法。相同类型代码块之间按照顺序向下执行。
二、代码块等作业讲解
1. 例题1:
解析:答案应该选A
2. 例题2
解析:答案选D,方法中定义的都是局部变量,一律都在栈帧中存储
3. 例题3
解析:静态方法中能够调用静态变量,因此不会编译出错,同时boolean类型的初始值为false,因此结果为false
4. 例题4
解析:考察代码块的执行顺序。静态块>构造块>构造方法(调用的对应的)>普通方法,相同类型按顺序执行。因此(6+9)/3,最后输出 = 5
三、数组练习等_作业讲解
1. 例题1:
解析:答案选择C,定义在方法中的都是局部变量,局部变量必须赋值后才能使用,否则会编译出错
2. 例题2
解析: this调用构造方法的语法为: this(参数);
3. 例题3:
(1)个人代码和测试
(2)示例代码和测试
(3)代码思路:采用双引用法
4. 例题4
(1)个人代码实现和测试
(2)思路:
5. 例题5
(1) 思路1:排序法
(2)思路2:利用哈希表<元素,出现次数>(暂时没学不实现代码)
(3)思路3:摩尔投票法 (速度最快,时间复杂度为O(n))
A. 摩尔投票法规则:从第一个元素开始投票,默认候选人就是第一个元素,初始票数为1(自己给自己的一票)。从第二个元素开始进行投票,出现相同的数字,票数+1;出现不同的数字,票数-1。当票数减为0的时候,更换候选人为后一个元素,并使得票数+1(自己给自己一票)
直到整个数组扫描完毕,最终剩下的候选人即为众数
B. 摩尔投票法原理:
C. 实现代码:
a. 个人代码
b. 示例代码
D. 递归解决众数问题
6. 例题6
(1)个人代码
(2)示例代码(标记位,更优)
A. 示例代码思路
当oddCount == 3,则直接返回true退出。扫描一整个都没有退出,则返回false
B.实现
四、封装
面向对象三大特性:封装,继承,多态
1. 封装(强调的是保护和易用):对外屏蔽类内部一些实现细节,类的外部只能通过类提供的方法来操作类
(1)定义:
(2)封装现实例子:
(3)如何实现封装:通过类结构以及访问修饰符来实现封装(访问修饰符控制方法或属性只对哪些类可见)
2. 四大访问修饰符
(1)可见性依次从小到大为
private(私有权限,仅类的内部可见) < defaul(包访问权限,包内部可见)t < protected(继承权限) < public(公开的,所有对象可见)
(2)public: 当访问修饰符使用public,则当前项目中,任何地方都可以调用public权限的域(类,属性,方法都可以)
(3)private访问修饰符:
A. private 修饰属性
a. 称为私有属性,这些属性只在当前类的内部可见(出了类,对外部完全隐藏,如果强行调用则报错)。
b. 使用private关键字对属性进行封装操作 (一般常用作用)
c. 为什么要用private封装(保护性)
<1>如果都定义为public来说,可能会有安全风险
<2>如果都定义为private然后用getter和setter方法来使用的意义(体现保护性)
d. private封装示例(私有属性创建,直接强行访问私有属性)
e. 当属性被private封装后,类中需要提供getter和setter方法来控制私有属性被外部的访问,类的外部通过getter/setter方法(这两个方法都是public权限,为了外部能使用)来使用私有属性
<1>
getter->取得私有属性 (命名规则:get开头 + 属性名称 )
setter->修改私有属性 (命名规则:set开头 + 属性名称 )
<2>需要在外部访问的加上getter方法,需要在外部修改的加上setter方法
<3>以下为示例(实现私有属性的getter,setter方法)
getter方法:
setter方法
f. 阿里编码规约:类中变量没有特殊情况,统一使用private进行封装,合理提供getter方法和setter方法
(4)包访问权限 default =》
A. 注意:这个关键字不需要写,权限修饰符什么都不写就是包权限!!!如下例子
B. 包:文件夹
a. 操作系统在同一个文件夹下不能存在同名文件(文件名= 文件名称 + 文件类型)
b. java中使用关键字package声明一个包,就是(操作系统的)文件夹。用于解决类名称重复的问题(不同的包下可以存在相同名称的类,相同的包不能存在相同名称的类)。
c. 如何在IDEA中创建一个包。在src下new一个package。包的命名是全小写的,多个单词之间用_分隔
<1>创建方法
<2>创建的包
<3>在创建的包内新建一个BankTest类
d. 若多个包下都存在同名的类,就要使用import导入某个包下的某个类(来解决不知道使用的是哪个类的问题),方法如下。
注意:import关键字是用来导入类的,不是包
<1>语法为:
import 类的全名称 (包名.类名); //java.util.Date其中java.util是包名,Date是类名
<2>例子: