final
- final: 不可改变,最终的含义。可以用于修饰类、方法和变量。
-
类:被修饰的类,不能被继承。
修饰符 final class 类名 { }例如
public final class String -
方法:被修饰的方法,不能被重写。
-
变量:被修饰的变量,有且仅能被赋值一次。
修饰符 final 返回值类型 方法名(参数列表){ //方法体 }修饰符 final 数据类型 变量名 = 值;在声明的时候必须赋值!
-
被final修饰的常量名称,一般都有书写规范,所有字母都大写。
- final的应用场景:
- 定义一个可供使用但不可被修改的类,如
public final class String、public final class Math、public final class Scanner等。 - 定义常量,如
final double PI = 3.14;
- 定义一个可供使用但不可被修改的类,如
接口
- 接口的定义
- 方法:抽象方法,默认已加上public abstract,无需手动写。
- 成员变量:常量,默认加上public static final修饰,无需手动书写。
public interface 接口名{ // 成员变量: 常量 int AGE = 12; String SCHOOL_NAME = "黑马程序员"; // 方法:抽象方法 void run(); }
instanceof关键字
格式
变量名 instanceof 数据类型
如果变量属于该数据类型或者其子类类型,返回true。
如果变量不属于该数据类型或者其子类类型,返回false。
代码例子
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
a.eat(); // 调用的是 Cat 的 eat
// 向下转型
if (a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse(); // 调用的是 Cat 的 catchMouse
} else if (a instanceof Dog){
Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的 watchHouse
}
}
}
匿名内部类
-
匿名内部类:定义一个没有名字的内部类,必须继承一个父类或者实现一个父接口
-
格式:
new 类名或者接口名() { 重写方法; };以上伪代码包含了1. 继承/实现 2. 方法重写 3. 创建对象(new关键字)
例子
new Swim() { @Override public void swimming() { System.out.println("蝶泳..."); } }; interface Swim { public abstract void swimming(); }- 这个没有名字的类想要实现Swim接口,把Swim写在了大括号前,表示这个没有名字的类实现了Swim接口,所以需要在类中重写接口里面所有的抽象方法。{}里面的是真正的匿名内部类。而上面的整个部分应该叫做匿名内部类的对象。
- 定义匿名内部类类型的变量:多态
Swim s = new Swim() { @Override public void swimming() { System.out.println("蝶泳..."); } };
-
使用场景
- 当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类对象只要使用一次,就可以用匿名内部类简化代码。
反编译
terminal输入
$javap xxx.class