JAVA小记:final,内部类

一、 final关键字

1、概述

  由继承关系可知,子类可以在父类的基础上改写父类内容,比如,方法重写。如果随意的继承API中提供的类,改写其内容,显然这是不合适的。为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容。
final: 不可改变。可以用于修饰类、方法和变量。
类:被修饰的类,不能被继承。(太监类)
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,不能被重新赋值。

2、注意事项

  (1)由于final修饰的类不能被继承,所以其中所有方法都不能被进行覆盖重写。
  (2)对于方法和类,abstract和final不能同时使用,因为矛盾。因为abstract的方法是一定要被覆盖重写才能有意义的。
  (3)final修饰的变量,在其生命周期里,只能被赋值一次。
  (4)特殊地,对于final修饰的成员变量来说,定义变量时必须进行直接赋值或者利用构造方法进行赋值,因为在对象被创建时,变量会被自动赋默认值,这也代表着这些变量永远都只能时默认值,显然不合理。

  这两种赋值方式只能选其一,需要注意的是,使用构造方法对其赋值时,所有有参构造和无参构造都必须有赋值语句,毕竟创建对象的时候,并不知道会用哪种构造方法。(即,要保证类当中所有重载的构造方法都对final修饰的成员变量进行赋值)

二、内部类

1、概述

定义

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。

分类

成员内部类和局部内部类(局部内部类包括匿名内部类)

2、成员内部类

格式

修饰符 class 外部类名称 {
	修饰符 class 内部类名称 {
	}
}

需要注意:内部类可以访问外部类,而外部类需要通过已创建的内部类对象进行访问

成员内部类的使用

  内部类的使用有两种方式:间接方法和直接方法
  间接方法:通过外部类对象调用外部类方法,在外部类方法中建立内部类对象来使用内部类方法。
  直接方法:公式为

外部类名称.内部类名称 对象名 = new 外部类名称().内部类名称();

成员内部类的同名变量访问

  对于继承关系来说,同名变量可以以this和super区分。
  对于外部类和成员内部类来说,可用

外部类名称.this.外部成员变量名 

this.内部成员变量名 

进行区分。

3、局部内部类

定义

局部变量指的是定义在方法中的变量,类比局部变量,局部内部类指的就是定义在外部类的某个方法内的类,并且只有当前所属方法能使用它。

格式

修饰符 class 外部类名称 {
	修饰符 返回值类型 外部类方法名(参数列表){
    	class 内部类名称 {
        }
	}
}

局部内部类的使用

在局部内部类的所属方法中创建对象,才能在该方法之外调用局部内部类的成员变量和方法。

4、关于类的权限修饰符

外部类

(public/(default))
  不能使用private是因为:private指被修饰的部分只可被其所属类本身调用,而外部类不属于任何类。
  不能使用protected是因为:protected指被修饰的部分在(default)基础上可以被其所属类的子类调用,而外部类不属于任何类。

成员内部类

(public/protected/(default)/private)

局部内部类

(不可使用任何修饰符,且无修饰状态并不等同于(default)):因为局部内部类只能被当前方法使用。

5、局部内部类访问所在方法的局部变量

  在JAVA8及更新版本中,局部内部类访问所在方法的局部变量时,这个局部变量必须是有效final的(即变量只能进行一次赋值并且值不能改变),在JAVA7及更早的版本中,这个局部变量是被要求必须用final修饰的。
  原因是,这个局部变量和局部内部类在同一方法中,不考虑对象的创建,则该方法执行结束后,方法内所有变量将和内部类一同结束生命周期。但是局部内部类(阴险狡诈地)创建了一个对象(长生不老的躯壳),看似和局部变量一同结束生命,实际上留了一个被实例化的对象并且保存在了更为安全的堆内存中,不会随着方法的结束而结束其生命周期,这个对象将会一直使用这个死去的变量,这就要求在(摇摇欲坠的)栈内存中的变量也要在死前被局部内部类的实例化对象复制一份带走(作为标本)保存,并且不能再改变(不能诈尸)。

6、匿名内部类

(1)如果接口(或父类)只需要使用实现类(或子类)一次,则可以使用匿名内部类。
(2)格式:

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

(3)注意事项:
匿名内部类在创建对象之后只能使用唯一的一次。
匿名内部类省略的是实现类或子类;而匿名对象省略的是对象名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值