Java instanceof 和 final关键字的使用

instanceof

在Java中可以使用instanceof关键字判断一个引用是否在一个指定类型里面,返回Boolean结果
如:

Animal dog1 = new Dog();
Animal cat = new Cat();
Dog dog2 = new Dog();

if(cat instanceof Cat) // 返回true
if(cat instanceof Animal) // 返回true
if(dog1 instanceof Cat) // 返回false
if(dog2 instanceof Dog) // 返回true 

注意,基础数据类型不能使用instanceof

int a = 100;
System.out.println(a instanceof Object); // 报错
System.out.println(null instanceof Object); //false

null 不属于任何类型,类也不能为null

final

final关键字用于修饰类,属性,参数,变量和方法,表示最终的
final修饰的结果:

  • 修饰类,表示该类为最终类,不能被继承
  • 修饰属性,表示该属性的值不能发生变化
  • 修饰方法,表示该方法不能被重写,重载不受影响
  • 修饰参数和变量,表示参数或者变量不能被更改

修饰类

final修饰的类不能被继承

public final class A{}

public class B extends A{}  //报错

final修饰的类里面的所有方法都默认为final方法

修饰方法

使用final修饰的方法不能被子类重写,但是不影响当前类的重载


public class A{
    public final void method(){}
    // 重载1
    public final void method(int i){}
    // 重载2
    public void method(int i, double j){}
}public class B extends A{
    @Override 
    public final void method(){}  // 报错
    
    @Override 
    public final void method(int i){}  // 报错
    
    // 可以重写
    @Override 
    public void method(int i, double j){}
}

修饰属性

final修饰的属性表示常量,也就是不允许被修改的,只允许有三种赋值方法:

  • 定义的时候赋值 public final int a = 666;

  • 在构造函数中赋值
    final int a;
    public A(){ a = 666 ;}

  • 在初始化块和构造函数中进行初始化

public class A{
    public final int a = 666;
    public final int b;
    public final int c;
    public final double d; // 报错 不允许没有赋值的final属性,没有默认值
    {
        b = 666;
    }
    public A(){
        c = 888;
    }
}

修饰变量

final可以修饰参数或者变量,实质上参数即局部变量。和修饰成员属性一样,final修饰变量有两种类型,表示的意义一样,但是操作不通

  • 修饰基本类型变量,表示变量的值不可改变
  • 修饰引用类型变脸时,变量指向的兑现地址不可改变,但是对象内容可以改变

如:

final int a = 1; //a的值初始化之后不可改变

final int[] b = new int[] {1,2,3};
b = new int[] {4,5,6} //报错,无法更改对象地址
b[0] = 111; // 可以更改对象内容
b[1] = 222;
b[3] = 333;

静态常量

结合 static final 关键字可以用来定义静态常量,也就是编译器常量

public class A{
    public static final int CONSTANT = 100;
    private static final int CONSTANT_SOMETHING;
    static {
        CONSTANT_SOMETHING = 123;
    }
}

编译器常量对程序的运行速度有自动优化,推荐使用
注意静态常量通常使用全大写字母加下划线,普通常量和普通变量使用相同命名规则

final 的应用:

  1. 如果没有明确需要开放继承,那么尽量使用 final 修饰类
  2. 私有 private 方法默认是 final 最终的,无需添加 final 关键字
  3. 仅初始化一次的只读属性优先使用 final 修饰,如果是常量则使用 static final
  4. 提倡使用 final 修饰变量,大部分情况下编译器会自动优化
  5. 如果可以,优先使用 final 修饰属性,特别在多线程中具有先天并发特性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩尼诗道-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值