一、final关键处的使用
1.修饰类
被final修饰的类,不能被继承。
我们学过的String 、Math都是被final修饰的类
2.修饰成员方法
被final修饰的方法,不能被覆盖重写。
final 和 abstract 不能同时使用。
3.修饰成员变量
- 被final修饰的成员变量其值不能变
-
- 基本数据类型:值不能变
- 引用数据类型:地址值不能变,地址值里面的成员变量的值可以改变
-
- 在定义的时候必须赋值
-
- 直接赋值:基本数据类型,直接给值。引用数据类型直接new对象
- 构造赋值:必须在所有的构造方法中,都给该变量进行赋值操作。
-
4.修饰局部变量
被final修饰的局部变量其值不能变:
基本数据类型:值不能变
引用数据类型:地址值不能变
- 权限修饰符
权限修饰符/范围 当前类 同一个包 不同包(子类) 任意地方
private Y N N N
(default) Y Y N N
protected Y Y Y N
public Y Y Y Y
内部类
-
内部类的概念与分类
什么叫内部类:类中包含类
内部类的分类:
- 成员内部类
- 局部内部类
- 匿名内部类
- 成员内部类
成员内部类的定义格式
public class 类名{
//成员变量
//成员方法
//成员内部类
class 类名{
//内部类的成员变量
//内部类的成员方法
}
}
成员内部类的使用
内部类使用外部类的成员(成员变量和成员方法):直接使用
外部类使用内部类的成员(成员变量和成员方法):
- 直接访问:外部类.内部类 对象名 = new 外部类().new 内部类();
- 间接访问:
在外部类中定义方法,在方法中创建内部类对象,然后通过外部类对象调用该方法,从而完成间接调用。
成员内部类的同名变量访问
在内部类的方法中访问同名的外部类成员变量:
访问内部类方法的局部变量:直接访问
访问内部类方法的成员变量:this.成员变量
访问外部类方法的成员变量:外部类.this.成员变量
成员内部类注意事项
非静态成员内部类中,不能有静态成员
静态成员内部类中,可以有静态成员
2.局部内部类
局部内部类的定义
public class 类名{
//成员变量
//成员内部类
//成员方法
public void show(){
//局部变量
//局部内部类
class 类名{
//局部内部类的成员变量
//局部内部类的成员方法
}
}
}
访问局部内部类
步骤:
- 创建外部类对象
- 在对应的成员方法中创建局部内部类对象
- 外部类对象调用这个成员方法
局部内部类final问题
在局部内部类的成员方法中,访问所在方法(外部类的方法)的局部变量,该局部变量必须是有效的final。
局部内部类注意事项
局部内部类中不能有静态的成员。
3.匿名内部类
前提:必须继承一个父类或实现一个接口
匿名内部类格式
我们所获取的是一个匿名内部类的对象(可以作为成员变量来使用,也可以作为局部变量来使用):
接口 对象名 = new 接口(){
//覆盖重写接口的所有抽象方法
};
应用场景
某一个接口的实现类/父类的子类 只需要创建一个对象,我们可以使用匿名内部类。这样操作简单。
什么叫类只使用一次:就是通过这个类只创建一个对象
使用匿名内部类并且使用匿名对象
//使用匿名内部类创建对象的场景
某一个接口实现类只需要创建一个对象,
//匿名对象的使用场景
而且该对象只是用一次。
隐含条件:一个接口只有一个抽象方法的时候
接口的特殊应用
类作为成员变量类型
成员变量的类型可以是:基本数据类型或者引用数据类型
接口作为成员变量类型
数据类型 变量名;
类是一种数据类型
接口也是一种数据类型
接口作为方法的参数或返回值
传递的是实现类的地址值。