java:final详解

本文详细介绍了Java中final关键字的使用,包括修饰类、方法、参数和变量的各种场景。final修饰的类不能被继承,其方法默认为final,无法被重写。final方法可以被重载。final修饰的参数意味着其引用不可改变。final修饰的变量分为编译期常量和运行期常量,static final字段在编译时必须初始化。文章还探讨了final在多线程环境下的内存模型规则,确保了线程安全。最后,文章提到了final的限制条件和局限性,并指出final不能防止对象的成员被修改。
摘要由CSDN通过智能技术生成

final基础使用

修饰类

当某个类的整体定义为final时,就表明了你不能打算继承该类,而且也不允许别人这么做。即这个类是不能有子类的。

注意:final类中的所有方法都隐式为final,因为无法覆盖他们,所以在final类中给任何方法添加final关键字是没有任何意义的。

这里顺道说说final类型的类如何拓展? 比如String是final类型,我们想写个MyString复用所有String中方法,同时增加一个新的toMyString()的方法,应该如何做?

设计模式中最重要的两种关系,一种是继承/实现;另外一种是组合关系。所以当遇到不能用继承的(final修饰的类),应该考虑用组合, 如下代码大概写个组合实现的意思:

class MyString{
   

    private String innerString;

    // ...init & other methods

    // 支持老的方法
    public int length(){
   
        return innerString.length(); // 通过innerString调用老的方法
    }

    // 添加新方法
    public String toMyString(){
   
        //...
    }
}

修饰方法

常规的使用就不说了,这里说下:

  • private 方法是隐式的final
  • final方法是可以被重载的

private final
类中所有private方法都隐式地指定为final的,由于无法取用private方法,所以也就不能覆盖它。可以对private方法增添final关键字,但这样做并没有什么好处。看下下面的例子:

public class Base {
   
    private void test() {
   
    }
}

public class Son extends Base{
   
    public void test() {
   
    }
    public static void main(String[] args) {
   
        Son son = new Son();
        Base father = son;
        //father.test();
    }
}

Base和Son都有方法test(),但是这并不是一种覆盖,因为private所修饰的方法是隐式的final,也就是无法被继承,所以更不用说是覆盖了,在Son中的test()方法不过是属于Son的新成员罢了,Son进行向上转型得到father,但是father.test()是不可执行的,因为Base中的test方法是private的,无法被访问到。

final方法是可以被重载的

我们知道父类的final方法是不能够被子类重写的,那么final方法可以被重载吗? 答案是可以的,下面代码是正确的。

public class FinalExampleParent {
   
    public final void test() {
   
    }

    public final void test(String str) {
   
    }
}

修饰参数

Java允许在参数列表中以声明的方式将参数指明为final,这意味这你无法在方法中更改参数引用所指向的对象。这个特性主要用来向匿名内部类传递数据。

修饰变量

常规的用法比较简单,这里通过下面三个问题进一步说明。

所有的final修饰的字段都是编译期常量吗?

现在来看编译期常量和非编译期常量, 如:

public class Test {
   
    //编译期常量
    final int i = 1;
    final static int J = 1;
    final int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值