文章目录
一、final
final
最终的,最后的,不可变的
- final的四种应用场景:
-
修饰类 : 太监化,不能有子类
与abstract关键字矛盾(抽象类不能直接用,一定要有子类)
-
修饰成员方法 : 最终方法,不能被覆盖重写
与abstract关键字矛盾(抽象方法一定要覆盖重写,所以冲突)
-
修饰局部变量(局部常量) :只能赋值一次
对于基本数据类型而言,不可变指:值不可变
对于引用数据类型而言,不可变指:地址不可变
-
修饰全局变量(全局常量) :在创建时就必须手动赋值(使用final关键字,不会再有默认值,所以需要手动赋值)。要么使用直接赋值 ,要么通过构造方法 赋值
二、命名规范&注释模板
1. 命名规范
1.1 通用规定
类别 | 命名规范 |
---|---|
项目名 | 全部小写 |
包名 | 全部小写 |
类名 | 大驼峰 |
变量名,方法名 | 小驼峰 |
常量名 | 全部大写,下划线分隔 |
所有命名规则必须遵循以下规则 :
- 名称只能由字母、数字、下划线、$符号组成.
- 不能以数字开头.
- 名称不能使用Java中的关键字.
- 坚决不允许出现中文及拼音命名.
1.2 包名规定
在Java编程规范中要求开发人员在自己定义的包名前加上唯一的前缀(为了保障每个Java Package命名的唯一性)。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称(一般是反过来用,比如com.baidu
)作为自己程序包的唯一前缀
com
:公司项目,copyright由项目发起的公司所有.
包名 : com.公司名.项目名.模块名team
: 团队项目,指由团队发起,并由该团队开发的项目,copyright属于该团队所有.
包名 : team.团队名.项目名.模块名
-
indi
: 个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者(也有公司写作onem
)
包名 : indi.发起者名.项目名.模块名… -
pers
: 个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人.
包名 : pers.个人名.项目名.模块名… -
priv
: 私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人.
包名 : priv.个人名.项目名.模块名
2. 注释模板
2.1 类注释
2.2 属性注释
2.3 方法注释
2.4 构造方法注释
三、权限修饰符
四类分别对应: 我自己 、我邻居 、 我儿子 、 陌生人
private
私有的意思,只能自己内部调用(default)
缺失的意思,之前说过,同包连导包语句都可省,省个权限修饰符也没什么毛病吧protected
保护的,父子间血脉是受保护的
四、内部类
一个类内部,包含另一个类。这个里面的类,就叫做内部类
为什么要有内部类?心脏
可以看做一个类吧?脱离了身体
类,它就没有意义。所以心脏类
就是一个内部类。
分类:
- 成员内部类
- 局部内部类(包含匿名内部类)
1. 内部类的定义格式
内部类和外部类的格式一模一样
public class 内部类名称 {}
-
注意: 内部类可以随意访问外部类,外部类需要借助内部类对象
-
可以看到13行定义了一个外部类私有方法,8行的内部类调用成功(没标红报错)
-
19~23外部类调用内部类方法,需要先创建了内部类对象
2. 内部类的使用
内部类的使用,可以分为间接使用 和直接使用 两种方式
-
间接使用: 通过外部类方法调用内部类方法
可以采取匿名对象的方式
-
直接使用: 直接创建内部类对象,再调用方法
// 直接使用的格式
外部类.内部类 对象名 = new 外部类().new 内部类();
- 类文件
- 运行文件
提示:内部类的编译
内部类究竟是怎样的存在?或者说,内部类究竟在编译过程中,发生了什么?
- 打开
out
文件夹(里面放着编译后的.class
文件)
- 找到项目文件夹
- 查看
- 发现: 内部类的命名利用了
外部类$内部类
的形式
3. 重名变量访问
外部类访问内部类很好办,因为要通过内部类对象。
内部类如何访问外部类的重名变量呢?
外部类名.this.重名变量;
4. 局部内部类
局部内部内核成员内部类就是放的位置不一样,注意这个内部类只能在这个方法内。
小提示: 其实可以通过这个方法,return一个Object,然后向下转型。但是这样做很麻烦,不提倡。
5. 类的权限修饰符
- 外部类:
public
、(default)
外部类,私有化还有意义嘛?(不能调用) - 成员内部类:
public
、protected
、(default)
、private
- 局部内部类: 啥都不能写(不是
(default)
的意思)
6. 局部内部类的final问题
- new出来的对象在堆当中
- 成员方法在栈中
- 成员方法运行完毕,出栈,局部变量消失
- 对象要等垃圾回收才失效
问题来了: 如果这个局部内部类要用局部变量咋办?局部变量消失后
解决办法: 让这个局部内部类,把需要的局部变量复制一份(当然这个复制的动作不需要我们做)。如果这个局部变量会变的话,复制哪个?所以,不能让它变,要加上final
关键字
从
Java8
开始,final
可以省略不写。(这叫【有效final】)
7. 匿名内部类 【重点!】
如果接口的实现类(或子类)只需要使用一次,就可以使用匿名内部类
接口名称 对象名 = new 接口名称() {
// 重写所有抽象方法
}
-
先定义一个接口
-
通过【匿名内部类】直接调用(蓝底就是匿名内部类),注意结尾的分号
-
调用方法,结果
注意
匿名内部类省略的是类名称 (省略了实现类/子类名称),而不是对象名称 。下面这个两个都省了,叫做匿名对象匿名内部类
new 接口名称() {
// 重写所有抽象方法
}
匿名内部类 是在创建对象时,只能使用唯一一次
匿名对象 是在调用方法时,只能使用唯一一次
8. 类作为成员变量类型
以下为了方便,我没有使用标准格式(私有化+Getter/Setter,这样代码看上去也不至于凌乱)
- 创建一个武器类
- 创建一个英雄类 (武器类作为数据类型)
- 运行
9. 接口作为成员变量类型
- 接口
- 用接口作为成员变量类型
- 运行
当然,还可以使用匿名对象进一步简化
五、Test:继续发红包
1. 准备复制
素材在我上传的文件里,包括图片和接口。
2. 红包实现
2.1 创建红包
- 创建一个新文件,创建RedPacketFrame类对象,发现是一个抽象类。所以下一步要创建一个它的实现类
- 出现红线,按
Alt 回车
,选择第一项。按照提示,在运行文件中创建实现类实例并传入参数“标题”
2.2 测试程序
- 直接运行
- 金额、个数、留言都没问题。塞钱进红包也没问题
- 点击页面上的元素,看看哪些功能没完成
2.3 实现平均红包
- 按照提示,输入群主名称
- 设置打开方式,发现要使用OpenMode接口
- 创建这个接口的实现AvergeMode
- 创建接口实现对象,并传入
2.4 随机红包
关键就是创建一个新的接口实现类(注意观看注释,这应该是最接近随机的一种方法了)