一、final关键字
1.概述
final: 不可改变。可以用于修饰类、方法和变量。
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,不能被重新赋值。
2.修饰类
格式如下:
final class Fu{
}
//被final修饰的类不能被继承
class Zi extends Fu{
}
像 public final class String 、 public final class Math 、 public final class Scanner等类,都是被 final 修饰的,目的就是供我们使用,而不让我们所以改变其内容,提高安全性。
3.修饰方法
格式如下:
class Fu{
public void method1(){
}
public final void method2(){
//加了final修饰的方法不能被子类重写
}
}
class Zi extends Fu{
@Override
public void method1(){
}
/*
public void method2(){
//不能重写final修饰的方法
}
*/
}
4.修饰变量
局部变量——基本类型
基本类型的局部变量,被fifinal修饰后,只能赋值一次,不能再更改。
public class Demo1 {
public static void main(String[] args) {
//声明变量,直接赋值
final int b=10;
//第二次赋值
//b=20; //报错,被final修饰的变量不能再赋值
}
}
局部变量——引用类型
引用类型的局部变量,被 final 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改。
public class Demo1 {
public static void main(String[] args) {
//创建User对象
final User user = new User();
//被final修饰的对象不可指向其他地址值
// user = new User();
//可以修改此对象的属性值
user.setName("张三");
}
}
被 final 修饰的常量名称,一般都有书写规范,所有字母都大写。
二、权限修饰符
1.概述
Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限。
- public:公共的。
- protected:受保护的
- default:默认的
- private:私有的
public > protected > default > private
2.修饰符的权限
位置 | public | protected | default | private |
同一类中
| √ | √ | √ | √ |
同一包中
(
子类或任意类
)
| √ | √ | √ | |
不同包的子类
| √ | √ | ||
不同包的任意类
| √ |
因此 public 具有最大权限, private 则是最小权限,不加权限修饰符,就是default权限 。
三、内部类
1.概述
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用 。
内部类分为:
- 成员内部内,类定义在了成员位置 (类中方法外称为成员位置)
- 局部内部类,类定义在方法内
2.成员内部类
成员内部类 :定义在类中方法外的类。
定义格式:
class 外部类{
// 成员变量
// 成员方法
class 内部类{
// 成员变量
// 成员方法
}
}
内部类可以直接访问外部类的成员,包括私有成员。
创建内部类对象格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
3.局部内部类
局部内部类 :定义在方法中的类。
定义格式:
class 外部类名 {
数据类型 变量名;
修饰符 返回值类型 方法名(参数列表) {
// …
class 内部类 {
// 成员变量
// 成员方法
}
}
}
使用方式:在定义好局部内部类后,直接就创建对象
内部类可以直接访问外部类的成员,包括私有成员。
局部内部类编译后仍然是一个独立的类,编译后有$还有一个数字。
4.匿名内部类
匿名内部类:是内部类的简化写法。它的本质是一个 带具体实现的父类或者父接口的匿名的子类对象。开发中,最常用到的内部类就是匿名内部类了。
前提: 匿名内部类必须继承一个父类或者实现一个父接口。
匿名内部类格式:
new 父类名或者接口名(){
// 方法重写
@Override public void method() {
// 执行语句
}
};
匿名内部类使用:
public class Demo1 {
public static void main(String[] args) {
new Swim(){
@Override
public void swiming() {
System.out.println("狗刨式游泳....");
}
}.swiming(); //狗刨式游泳....
}
}
//定义游泳接口
interface Swim{
void swiming();
}
匿名内部类的本质:
- 定义一个没有名字的内部类
- 这个类实现了Swim接口
- 创建了这个没有名字的类的对象
主要是简化了代码,通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。