在Java中,final可以修饰类,方法,属性。
一 final数据
final关键字修饰变量,用来向编译期告知这块数据恒定不变:
1.一个永不改变的编译期常量:在Java中这类常量必须是基本类型,编译期可以将该常量代入到可能用到它的表达式中,也就是说,可以在编译期执行计算;
private final int valueOne = 1;
public static final int VALUE_TWO = 2;
2.一个运行期时被初始化的值,一旦初始化完成,将不再改变。
private final Random rand = new Random(100);
private final int valueThree =rand.nextInt(50);
当final修饰的是对象引用时,要特别注意一定:该引用不能改变,但是该引用指向的对象却可以修改。这一限制同样适用于数组,它也是对象。
//无法将r再指向另外一个新的对象,array也不能指向新的数组
private final Refe r = new Refe(23);
private int[] array = {1,2,3,4,5,6};
public void changeFinalRefeObject() {
//编译无法通过,不允许修改r
//r = new Refe(22);
//但是修改r所指向的对象却是可以的
r.age = 22;
//编译无法通过,不允许修改array
//array = new int[6];
//修改数组的内容却是可以的
array[0] = 10;
}
空白final(没在定义处给出值),需要注意一些,但是稍加思考,都是符合逻辑的:
1.static final:static
final是类变量,且只能初始化一次,所以这类变量这能在静态语句块中初始化;
public static final int VALUE_ONE;
//只能在静态语句块中初始化
static {
VALUE_ONE = 1;
}
2.非static final:非静态语句块先于构造方法执行,所以可以在非静态语句块中对final变量赋值;
private final int valueOne;
//在执行构造方法前,先执行非静态语句块
{
valueOne = 1;
}
3.如果在构造方法中对final变量赋值的话,所有的构造方法都必须有对final变量的赋值语句;
class Final {
private final valueOne;
public Final() {
valueOne = 1;
}
public Final(int xx) {
valueOne = 1;
}
}
4.不能同时在非静态语句块和构造方法中对final赋值,因为只能初始化一次,但是语句块总是和构造方法一同执行。
总之记住一点:final修饰的变量在使用之前,必须初始化,只有三个地方可以初始化:
a.定义处初始化;
b.语句块中初始化;
c.构造方法中初始化。
final还可以修饰参数,无法修改参数的值或者引用。
public void noChangeParam(final Refe ref,final int a) {
//不能修改
//a = 3;
//ref = new Refe(22);
}
二 final方法
final修饰方法时包含的语义是:该方法禁止重写。注意,可以重载。
有一点值得我们特别注意:类中所有的private方法都隐式的指定为final,也就是子类中无法覆盖它。其实这也很好理解,private不具有子类继承性,所以子类也就不存在覆盖它的可能。但是如果对private方法显示的添加final修饰词(虽然这没有任何意义),但是这可能会造成混淆。
class WithFinals {
private final void f() {
System.out.println("WithFinal.f()");
}
private void g() {
System.out.println("WithFinal.g()");
}
}
/*
* 看起来子类好像覆盖了父类的private方法和private final方法
*/
class OverridingPrivate extends WithFinals {
private final void f() {
System.out.println("OverridingPrivate.f()");
}
private void g() {
System.out.println("OverridingPrivate.g()");
}
}
看起来子类覆盖了父类中的private final方法,这怎么可能呢?!这又该如何解释呢?
我们一定要正确理解覆盖的意思,“覆盖”只有在某个方法是父类接口的一部分时才会出现,也就是说这个方法必须是子类可以看见的,这样子类向上转型为父类时,可以通过调用这个方法。但是当方法是private时,它就不是父类接口的一部分,它只是父类私有的,子类看不见。这个时候子类完全可以生成一个具有同样签名的方法,它也仅仅是恰巧有着同样的方法签名而已,并不是覆盖。
三 final类
final类无法继承,final类中的方法也就不存在覆盖的问题了,所以final类中的所有方法都隐式的指定为final。
以上内容来自于对《Thinkin Java》这本书中关于final的理解,关于final方法,其中提到了在Java5以前实用final修饰方法是为了提高效率,同意编译期将该方法的所有调用都转为内嵌调用。但是虚拟机现在做了很多优化(最基本的,使用了“类型继承分析”技术),即使是非虚方法,虚拟机也会激进的进行内联调用。所以使用final修饰方法的唯一理由就是:明确禁止覆盖。
分享到:
相关推荐
Java中的final关键字是一个非常重要的修饰符,它用于声明变量、方法和类,确保它们在程序执行期间保持不变。final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final...
Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...
在Java编程语言中,`final` 和 `static` 是两个非常重要的关键字,它们分别具有不同的含义和用法,但都对代码的结构和行为产生深远影响。本文将深入探讨这两个关键字,并结合实际示例来解释它们的应用场景。 首先,...
4. 用 private 修饰的 static 成员变量和成员方法,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很...
`final`关键字在Java中有多种用途,它可以用来修饰类、方法和变量,其主要目的是确保被修饰的对象具有不可变性或只读性。 #### 1. `final`修饰变量 当`final`用于修饰一个变量时,该变量成为常量,一旦赋值后就不...
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来定义不可变性和唯一性。这个关键字可以应用于变量、方法和类,分别赋予它们不同的特性。以下是对`final`关键字在不同场景下使用的详细介绍: 1....
Java中final类的简单使用,并对Java关键字的使用做出了总结
在Java编程语言中,`final`关键字有着重要的作用,它用于标记一个变量、方法或类,表示不可变性。这个特性在多个方面都有应用,包括创建常量、确保引用不可变以及在多线程环境中提供安全。 1. **常量的创建**: `...
下面我们将详细探讨`final`关键字在修饰变量、方法和类时的不同用法。 1. **final变量** - 常量定义:`final`变量一旦被初始化后,其值就不能再改变。例如,我们可以定义一个名为`PI`的`final`变量,表示圆周率,...
Java 中的 `final` 关键字是一个至关重要的概念,它被用来声明类、方法和变量,以确保它们在程序执行过程中不可更改。深入理解 `final` 关键字可以帮助开发者写出更加安全、高效的代码。 首先,`final` 关键字可以...
在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用方法和限制。 一、final 关键字 ...
1. **区分成员变量和局部变量**:如果在方法中存在同名的局部变量和成员变量,`this` 可以用来访问成员变量。 2. **构造器链**:`this` 可以调用同一个类中的其他构造器,如 `this(int i)` 表示调用带一个参数的构造...
在Java编程语言中,`final`关键字是一个非常重要的概念,它具有多种用途,涉及到类、方法和变量的声明。在本篇文章中,我们将深入探讨`final`关键字在Java中的使用和意义。 首先,`final`关键字用于声明一个不可变...
- **示例**:在Java中,可以使用`getBytes(String charsetName)`方法将字符串编码为指定字符集的字节数组;使用`new String(byte[] bytes, String charsetName)`方法将字节数组解码为字符串。 #### 2.2 字节序标记...
在Java中,final可以用来修饰类、方法、变量和参数,以实现特定的编程需求。以下是对final关键字在各个场景下用法的详细说明: 1. **final修饰类** - 当一个类被final修饰时,它不能被其他类继承。这意味着final类...
Java中的`final`关键字是一个非常重要的修饰符,它在编程中起到了确保不变性的关键作用。在本文中,我们将深入探讨`final`关键字的用途和用法。 首先,`final`可以用于修饰类、方法和变量。当`final`应用于类时,...
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来声明一个变量、方法或类为不可变的。在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量...
例如,在一个银行系统中,有一个withdraw方法,用于从账户中提取资金,可以使用final方法来确保该方法的实现不被修改: public final void withdraw(double amount) { // 提取资金逻辑 } 这样,子类不能重写...