final
- final是一个关键字,意思是不可改变,可以修饰类,方法,变量。
类:被修饰的类,不能被继承。
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,只能赋值一次。
格式
//用在类上
final class 类名 {} //不能被继承
//用在方法:
修饰符 final 返回值类型 方法名(参数列表){ //方法体 } //不能被重写
//局部变量(基本类型):
final 变量类型 变量名 = 赋值的参数
//局部变量可以通过先定义,后续语句再赋值。例:final int X; X=1; //只能赋值一次
//成员变量(基本类型)
final 变量类型 变量名 = 赋值的参数
//成员变量可以通过显示赋值和构造方法两种方式赋值。
//注意,如果是通过构造方法,那么所有构造方法里面都必须要有赋值公式。
命名规范
- 被final修饰的常量名称,所有字母都大写
权限修饰符
- public:公共的。
- protected:受保护的
- default:默认的(系统会默认加,除了在接口里写默认方法用,在其他地方自己写就会报错)
- private:私有的
- 权限修饰符,定义时写在最前面
注意
(default是默认的,不需要手动添加)
public(所有包中) > protected(如果是子类,所有包,否则当前包) > default(当前包中) > private(当前类)
编写代码时,如果没有特殊的考虑,建议这样使用权限:
- 成员变量使用private ,隐藏细节。
- 构造方法使用public ,方便创建对象。
- 成员方法使用public ,方便调用方法。
内部类
- 内部类就是一个写在类中的类
定义格式
class 类A{
class 类B{
}
} //这里,类B其实就是类A的内部类,类A是类B的外部类
访问特点
- 内部类可以直接访问外部类的成员,包括私有成员
- 外部类要访问内部类的成员,则必须要建立内部类的对象来访问
- 如果子类继承了父类,那他也继承了父类的内部类,可以通过子类名.内部类名的方式来定义内部类对象
建立内部类格式
- 外部类名.内部类名 对象名 =new 外部类名().new内部类名()
- 例:类A.类B nbdx = new 类A().new类B(); //这里,nbdx就是一个新声明的内部类对象,可以拿来调用内部类的成员和方法
- 如果遇到内部类和外部类成员重名,又想在内部类中调用外部类的成员,这时候可以用:外部类名.this.成员名来调用
- 例:设有name变量,在外部类A和内部类B中都有定义,此时想在内部类中调用外部类的name变量
类A.this.name //此成员就代表外部类A的name
匿名内部类(重点)
在实际使用中,我们经常会遇到想使用一些抽象类或者接口的抽象方法时,此抽象类或者接口的子类的方法没有重写或者重写的方法此时不适用。而我们如果只是临时用一下,专门为此去创建一个子类,步骤又很麻烦。此时我们可以用到匿名内部类
定义格式
new 类名/接口名(){
///重写你想要实现的抽象方法
}
//这里的(类名/接口名)就是你想要使用的类或者接口的名字,里面的方法就重写你现在想要实现的方法
//你也可以直接通过上面的方法创建出的匿名内部类来赋值给一个引用
//格式
类名/接口名 nb = new 类名/接口名(){
//重写的方法体;
}
注意
写匿名内部类的时候,也要重写抽象类或者接口里的所有抽象方法(和普通类一样)。
是否能创建接口或者抽象类的内部类对象呢?不可以