Java final关键字

1. final类

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的
优点:

  1. final类的对象实例是只读的
  2. 在多线程环境下安全的共享,不用额外的同步开销
public final class FinalClass {
    private int index = 1;

    public int get() {
        return index;
    }
}

这里写图片描述

2. final变量

  1. final可以修饰静态变量、实例变量和局部变量
  2. final变量需要为其指定初始值,值一旦给定就无法改变
  3. final修饰基本数据类型,值不能改变
    这里写图片描述
  4. final修饰引用类型,引用变量不能改变(即指向对象的地址不能改变),但是对象可以改变
public class Person {
    private int index;

    public int get() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }
}

public class FinalTest {

    public static void main(String[] args) {
        System.out.println("final修饰引用类型");
        final Person person1 = new Person();

        person1.setIndex(100);
        System.out.println("当前index = " + person1.get() + " ,当前对象哈希码 = " + person1.hashCode());

        person1.setIndex(200);
        System.out.println("当前index = " + person1.get() + " ,当前对象哈希码 = " + person1.hashCode());

        System.out.println();
        System.out.println("index不同说明对象person1改变了");
        System.out.println("对象person1哈希码相同说明person1指向的对象没改变");
    }
}

运行结果:
这里写图片描述

3. final方法

final方法不能被重写
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法,好处:

  • 把方法锁定,防止任何继承类修改它的意义和实现
  • 高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率

需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。

public class Parent {
    /**
     * private修饰方法,子类不能继承
     * */
    private final void get1() {

    }

    /**
     * final方法,子类不能继承
     * */
    public final void get2() {

    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值