day11_final、权限、内部类、引用类型
2020年2月24日
1 final关键字
1.1概述
子类可以在父类的基础上改写父类的内容,例如方法重写。为了避免随意改写的情况,java提供了final关键字,用于修饰不可改变的内容
final:不可改变。
- 类:被修饰的类,不能被继承
- 方法:被修饰的方法,不能被重写
- 变量:被修饰的变量,不能被重新赋值
1.2 使用方式
修饰类
查询API可以发现,像public final class String
、public final class Math
、public final class Scanner
等类都是被final修饰的,目的是供我们使用,所以不让我们改变其内容。
修饰方法
格式:
修饰符 final 返回值类型 方法名(参数列表){}
重写被final修饰的方法时,编译会报错
修饰变量
- 局部变量——基本类型
基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改
- 局部变量——引用类型
只能指向一个对象,地址值不能再更改,但是不影响对象内部的成员变量值的修改
- 成员变量
成员变量涉及到初始化的问题,初始化的方式只能二选一:
- 显示初始化
- 构造方法初始化
被final修饰的常量名称,所有字母都大写,字母之间用_分隔
2 权限修饰符
2.1 概述
Java中有四种访问权限。
- public:公共的
- protected:受保护的
- default:默认的
- private:私有的
2.1 不同权限的访问能力
public | protected | default | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中(子类与无关类) | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
3 内部类
3.1 概述
将一个类A定义在另一个类B里面,里面的那个类A称为内部类,B称为外部类
3.1.1 成员内部类
定义在类中方法外的类
Class Car{//外部类
Class Engine{//内部类
}
}
在描述事务时,如果一个事务内部还包含其他事物,就可以使用内部类这种结构,比如汽车类Car中包含发动机类Engine,此时Engine就可以用内部类来描述,定义在成员位置
访问特点
- 内部类可以直接访问外部类的成员,包括私有成员
- 外部类要访问内部类的成员,必须要建立内部类对象
创建内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
内部类仍然是一个独立的类,在编译之后会在内部类被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
1.2 匿名内部类【重点】
- 匿名内部类:本质是一个带具体实现的父类或父接口的匿名的子类对象。开发中,最常用到的内部类就是匿名内部类。以借口举例,在使用一个接口时,需要定义子类、重写接口中的方法、创建子类对象、调用重写后的方法。如果目的只是为了调用方法,就可以将这四步合成一步。
前提
匿名内部类必须继承一个父类或者实现一个父接口。
格式
new 父类名或接口名(){
//方法重写
@override
public void method(){
//执行语句
}
};
等号右边是匿名内部类,定义并创建该接口的子类对象
等号左边是多态赋值,接口类型引用指向子类对象
通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递
4 引用类型用法总结
在实际开发中,引用类型的使用非常重要,也非常普遍。基本类型可以作为成员变量、方法参数、方法返回值,引用类型也同样可以。
4.1 class作为成员变量
类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象
4.2 interface作为成员变量
接口是对方法的封装
使用一个接口作为成员变量,可以随时更换技能,这样的设计更加灵活,增强了程序的拓展性。接口作为成员变量时,对它进行赋值的操作,实际上,是赋给它一个实现类对象。
4.3 interface作为方法参数和返回值类型
当接口作为方法的返回值和方法参数,返回和传递的都是它的子类对象。ArrayList类是java.util.List接口的实现类。所以,当我们看到List接口作为参数或返回值类型,可以将ArrayList的对象进行传递和返回。