Java语言进阶 #继承&多态 #Day11 #命名规范 #注释模板 #权限修饰符 #内部类 #继续发红包

一、final

final最终的,最后的,不可变的

  • final的四种应用场景:
  1. 修饰类 : 太监化,不能有子类
    与abstract关键字矛盾(抽象类不能直接用,一定要有子类)
    在这里插入图片描述

  2. 修饰成员方法 : 最终方法,不能被覆盖重写
    与abstract关键字矛盾(抽象方法一定要覆盖重写,所以冲突)
    在这里插入图片描述

  3. 修饰局部变量(局部常量) :只能赋值一次
    对于基本数据类型而言,不可变指:值不可变
    对于引用数据类型而言,不可变指:地址不可变
    在这里插入图片描述

  4. 修饰全局变量(全局常量) :在创建时就必须手动赋值(使用final关键字,不会再有默认值,所以需要手动赋值)。要么使用直接赋值 ,要么通过构造方法 赋值
    在这里插入图片描述

二、命名规范&注释模板

1. 命名规范

1.1 通用规定

类别 命名规范
项目名 全部小写
包名 全部小写
类名 大驼峰
变量名,方法名 小驼峰
常量名 全部大写,下划线分隔

所有命名规则必须遵循以下规则 :

  1. 名称只能由字母、数字、下划线、$符号组成.
  2. 不能以数字开头.
  3. 名称不能使用Java中的关键字.
  4. 坚决不允许出现中文及拼音命名.

1.2 包名规定

在Java编程规范中要求开发人员在自己定义的包名前加上唯一的前缀(为了保障每个Java Package命名的唯一性)。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称(一般是反过来用,比如com.baidu)作为自己程序包的唯一前缀

  1. com:公司项目,copyright由项目发起的公司所有.
      包名 : com.公司名.项目名.模块名
  2. team : 团队项目,指由团队发起,并由该团队开发的项目,copyright属于该团队所有.
      包名 : team.团队名.项目名.模块名

  1. indi : 个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者(也有公司写作onem
      包名 : indi.发起者名.项目名.模块名…

  2. pers : 个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人.
      包名 : pers.个人名.项目名.模块名…

  3. priv : 私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人.
      包名 : priv.个人名.项目名.模块名

2. 注释模板

2.1 类注释

在这里插入图片描述

2.2 属性注释

在这里插入图片描述

2.3 方法注释

在这里插入图片描述

2.4 构造方法注释

在这里插入图片描述

三、权限修饰符

在这里插入图片描述

四类分别对应: 我自己我邻居我儿子陌生人


  • private私有的意思,只能自己内部调用
  • (default)缺失的意思,之前说过,同包连导包语句都可省,省个权限修饰符也没什么毛病吧
  • protected保护的,父子间血脉是受保护的

四、内部类

一个类内部,包含另一个类。这个里面的类,就叫做内部类
为什么要有内部类?心脏可以看做一个类吧?脱离了身体类,它就没有意义。所以心脏类就是一个内部类。

分类:

  1. 成员内部类
  2. 局部内部类(包含匿名内部类)

1. 内部类的定义格式

内部类和外部类的格式一模一样

public class 内部类名称 {}
  • 注意: 内部类可以随意访问外部类,外部类需要借助内部类对象
    在这里插入图片描述

  • 可以看到13行定义了一个外部类私有方法,8行的内部类调用成功(没标红报错)

  • 19~23外部类调用内部类方法,需要先创建了内部类对象

2. 内部类的使用

内部类的使用,可以分为间接使用直接使用 两种方式

  • 间接使用: 通过外部类方法调用内部类方法
    可以采取匿名对象的方式
    在这里插入图片描述

  • 直接使用: 直接创建内部类对象,再调用方法

// 直接使用的格式
外部类.内部类 对象名 = new 外部类().new 内部类();

  • 类文件
    在这里插入图片描述
  • 运行文件
    在这里插入图片描述

提示:内部类的编译

内部类究竟是怎样的存在?或者说,内部类究竟在编译过程中,发生了什么?

  1. 打开out文件夹(里面放着编译后的.class文件)
    在这里插入图片描述
  2. 找到项目文件夹
  3. 查看
    在这里插入图片描述
  • 发现: 内部类的命名利用了外部类$内部类的形式

3. 重名变量访问

外部类访问内部类很好办,因为要通过内部类对象。
内部类如何访问外部类的重名变量呢?

外部类名.this.重名变量;

在这里插入图片描述

4. 局部内部类

局部内部内核成员内部类就是放的位置不一样,注意这个内部类只能在这个方法内。
在这里插入图片描述

小提示: 其实可以通过这个方法,return一个Object,然后向下转型。但是这样做很麻烦,不提倡。

5. 类的权限修饰符

在这里插入图片描述

  • 外部类: public(default)
    在这里插入图片描述
    外部类,私有化还有意义嘛?(不能调用)
  • 成员内部类: publicprotected(default)private
    在这里插入图片描述
  • 局部内部类: 啥都不能写(不是(default)的意思)

6. 局部内部类的final问题

  1. new出来的对象在堆当中
  2. 成员方法在栈中
  3. 成员方法运行完毕,出栈,局部变量消失
  4. 对象要等垃圾回收才失效

问题来了: 如果这个局部内部类要用局部变量咋办?局部变量消失后
解决办法: 让这个局部内部类,把需要的局部变量复制一份(当然这个复制的动作不需要我们做)。如果这个局部变量会变的话,复制哪个?所以,不能让它变,要加上final关键字

Java8开始,final可以省略不写。(这叫【有效final】)

7. 匿名内部类 【重点!】

如果接口的实现类(或子类)只需要使用一次,就可以使用匿名内部类

接口名称 对象名 = new 接口名称() {
	// 重写所有抽象方法
}

  1. 先定义一个接口
    在这里插入图片描述

  2. 通过【匿名内部类】直接调用(蓝底就是匿名内部类),注意结尾的分号
    在这里插入图片描述

  3. 调用方法,结果
    在这里插入图片描述

注意

匿名内部类省略的是类名称 (省略了实现类/子类名称),而不是对象名称 。下面这个两个都省了,叫做匿名对象匿名内部类

new 接口名称() {
	// 重写所有抽象方法
}

匿名内部类 是在创建对象时,只能使用唯一一次
匿名对象 是在调用方法时,只能使用唯一一次

8. 类作为成员变量类型

以下为了方便,我没有使用标准格式(私有化+Getter/Setter,这样代码看上去也不至于凌乱)

  • 创建一个武器类
    在这里插入图片描述
  • 创建一个英雄类 (武器类作为数据类型)
    在这里插入图片描述
  1. 运行
    在这里插入图片描述

9. 接口作为成员变量类型

  • 接口
    在这里插入图片描述
  • 用接口作为成员变量类型
    在这里插入图片描述
  • 运行
    在这里插入图片描述

当然,还可以使用匿名对象进一步简化

五、Test:继续发红包

1. 准备复制

素材在我上传的文件里,包括图片和接口。

2. 红包实现

2.1 创建红包

  1. 创建一个新文件,创建RedPacketFrame类对象,发现是一个抽象类。所以下一步要创建一个它的实现类
    在这里插入图片描述
  2. 出现红线,按Alt 回车,选择第一项。按照提示,在运行文件中创建实现类实例并传入参数“标题”
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2 测试程序

  1. 直接运行
    在这里插入图片描述
  2. 金额、个数、留言都没问题。塞钱进红包也没问题
    在这里插入图片描述
  3. 点击页面上的元素,看看哪些功能没完成
    在这里插入图片描述
    在这里插入图片描述

2.3 实现平均红包

  1. 按照提示,输入群主名称
    在这里插入图片描述
  2. 设置打开方式,发现要使用OpenMode接口
    在这里插入图片描述
  3. 创建这个接口的实现AvergeMode
    在这里插入图片描述
  4. 创建接口实现对象,并传入
    在这里插入图片描述
    在这里插入图片描述

2.4 随机红包

关键就是创建一个新的接口实现类(注意观看注释,这应该是最接近随机的一种方法了)
在这里插入图片描述

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章