一、final关键字概念与四种用法
1、用于修饰类
当final用来修饰类,格式: public final class 类名称{ //... } 含义:当前类不能有任何子类(太监类),但是有父类 注意:一个类如果是final类,那么其中所有的成员方法都无法进行覆盖重写
2、用于修饰成员方法
当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写 格式: 修饰符 final 返回值类型 方法名称(参数列表){ //... } 注意:对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾
3、用于修饰成员变量
对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样不可变 1、由于成员变量具有默认值,所以用了final之后必须手动赋值 2、对于final的成员变量,要么直接赋值,要么通过构造方法赋值,2选1 3、必须标准类当中所以重载的构造方法,最终都会对final的成员变量进行赋值
4、用于修饰局部变量
一旦使用final用来修饰局部变量,那么这个变量就不能进行更改,一次赋值,终生不变
4种权限修饰符: public > protected > (default) > private 同一个类(我自己) Y Y Y Y 同一个包 (我邻居) Y Y Y N 不同包子类 (我儿子) Y Y N N 不同包非子类 (陌生人) Y N N N 注意事项: (default)不是关键字,而是不写
二、内部类的概念与分类
内部类:如果一个事物的内部包含令一个事物,那么这就是一个类内部包含另一个类 分类: 成员内部类 局部内部类(包含匿名内部类) 1、成员内部类定义格式: 修饰符 class 外部类名称 { 修饰符 class 内部类名称{ //**** } //*** } 注意:内用外,随意访问,外用内,需要内部类对象 ================================ 如何使用成员内部类: 1、间接方式:在外部类的方法当中,使用内部类,然后main知识调用外部类的方法。 2、直接方式:公式 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称(); ================================/ 2、局部内部类: 如果一个类定义在一个方法内部,那么这就是一个局部内部类 “局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。 定义格式: 修饰符 class 外部类名称{ 修饰符 返回值类型 外部类方法名称(){ class 局部内部类名称{ //**** } } }
内部类的同名变量访问 格式:外部类名称.this.成员变量名
局部内部类的final问题 备注:从java8开始,只要局部变量事实不变,那么final关键字可以省略 原因: new出来的对象在堆内存中 局部变量是跟着方法走,在栈内存当中 方法运行结束后,立刻出栈,局部变量会立刻消失 但是new出来的对象会在堆当中持续,直到垃圾回收
如果接口的实现类(或者是父类的子类),只需要使用唯一的一次, 那么这种情况下就可以省略该类的定义,改为使用【匿名内部类】 匿名内部类的定义格式: 接口名称 对象名 = new 接口名称(){ //覆盖重写所有抽象方法 }; 对格式进行解析“new 接口名称(){};” 1、new代表创建对象的动作 2、接口名称就是匿名内部类需要实现哪个接口 3、{...}这才是匿名内部类的内容 另外还要注意几点: 1、匿名内部类,在【创建对象】时,只能使用唯一一次 如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了 2、匿名对象,在【使用方法】的时候,只能调用唯一一次 如果希望同一个对象调用多次方法,那么必须给对象起名字 3、匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】 强调匿名内部类和匿名对象不是一回事