final in Java DEMO

本文探讨了Java中final关键字在对象属性上的使用,通过实例展示了如何确保属性值不可修改,以及其在实际编程中的作用和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Dog {
    int size;
}
public class Test {
    public static void main(String[] args) {
        final Dog dog = new Dog();
        dog.size = 100;
        System.out.println(dog.size);
        
        dog.size = 999;
        System.out.println(dog.size);
    }
}

100

999



### Java 中 `final` 关键字的用法 #### 1. `final` 修饰类 当 `final` 用于修饰类时,表示该类不能再被继承。这意味着任何尝试对该类进行子类化的操作都会导致编译错误[^1]。 ```java // 定义一个 final 类 public final class FinalClass { // ... } // 尝试继承会失败 class SubClass extends FinalClass { // 编译错误 } ``` 这种设计通常用于防止某些核心功能被修改或扩展,从而提高程序的安全性和稳定性。 --- #### 2. `final` 修饰方法 当 `final` 用于修饰方法时,表示该方法不能被子类重写(override)。即使子类试图定义同名同参的方法,也会引发编译错误[^3]。 ```java public class Parent { public final void show() { System.out.println("Parent's show method"); } } public class Child extends Parent { @Override public void show() { // 编译错误:无法覆盖 final 方法 System.out.println("Child's show method"); } } ``` 需要注意的是,如果某个类本身已经是 `final` 的,则其所有方法默认也是不可覆盖的,因此无需显式声明为 `final`[^5]。 --- #### 3. `final` 修饰变量 `final` 可以用来修饰局部变量、实例变量和静态变量。一旦变量被标记为 `final`,它的值就不能再改变[^4]。 ##### (1) 局部变量 对于局部变量而言,`final` 表示它只能被初始化一次,并且在其作用域内保持不变[^2]。 ```java public class Example { public static void main(String[] args) { final int number; number = 10; // 初始化 // number = 20; // 错误:不能重新赋值 System.out.println(number); } } ``` ##### (2) 实例变量 如果是实例变量或者静态变量,那么它们必须在声明的同时完成初始化,或者通过构造器来设置初始值。 ```java public class Person { private final String name; public Person(String name) { this.name = name; // 构造函数中初始化 } public String getName() { return name; } } ``` 注意,在多态场景下,由于 `final` 成员变量会在对象创建阶段就固定下来,所以不会受到运行时期动态绑定的影响。 --- #### 注意事项 1. **`abstract` 和 `final` 不兼容** 如果一个类被声明成 `abstract`,则意味着它是专门为了派生其他具体实现而存在的;反之,如果一个类是 `final` 的话,就意味着不允许有任何后代形式存在。这两种特性显然是互相排斥的,所以在同一个地方同时指定这两个限定词是没有意义的行为。 2. **构造期间调用覆写方法的风险** 当在一个基类的构造过程中间接地触发了一个可以由衍生版本替代掉的操作时,可能会遇到未预期的结果,这是因为此时当前正在构建的对象可能还没有完全准备好接受这样的访问请求。 3. **确保所有重载构造器均参与赋初值过程** 需要特别留意那些带有 `final` 字段的情况——无论采用哪种方式去实例化此类别的实体个体,我们都得保证这些字段能够获得恰当合理的设定值。 --- ### 示例代码总结 以下是综合上述知识点的一个完整例子: ```java // A final class cannot be extended. final class Base {} // This will cause a compile-time error because 'Base' is declared as final. // class Derived extends Base {} // Demonstrating the use of final with methods and variables. class Demo { // Cannot override this method in subclasses. public final void displayMessage() { System.out.println("This message comes from a final method."); } // Final instance variable must be initialized either at declaration or through constructors. private final double piValue; public Demo(double value) { this.piValue = value; } public double getPiValue() { return piValue; } } public class MainApp { public static void main(String[] args) { Demo demoObject = new Demo(3.14); // Attempting to change the value would result in an error since it’s marked as final. // demoObject.piValue = 2.718; System.out.println(demoObject.getPiValue()); // Trying to create subclass fails due to final restriction on parent class. // Class ExtendedDemo inherits from Demo which has no effect here but shown just for illustration purpose only. /* * Following line causes compilation failure : */ // class ExtendedDemo extends Demo {} } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值