真的知道final的用法了吗?

本文深入探讨了Java中final关键字的使用方法,特别是针对基本数据类型和引用数据类型的区别进行了详细的解释,并通过示例代码帮助读者理解final对于不同数据类型的影响。
今天晚上在网上看到一些讲基础的java知识的blog,自己便想了想真的知道了这些基础知识了吗?想想还是基础知识掌握的不好,在这里把自己遇到的问题写到blog里,一是希望自己以后一定要关注java的基础知识,定期看书复习,俗话说:“万丈高楼从地起”,只有掌握好了基础才能写出有质量的代码。二是如果有人和我一样不了解final的话,希望有所帮助。
我们都知道finnal是用来定义常量的,一旦定义就不可以改变。这句话是正确的,但是,我们应该仔细分析这句话,定义常量有基本类型和引用类型,那对这两种类型的变量,什么才叫做一旦定义就不能改变呢?我们来看看这段代码:
	public static final int DEFAULT_NUM = 1;

public static void changeNum(int num) {
DEFAULT_NUM = 2;
}

这个代码肯定是错误的。我们在来看另外一段代码:
	public static final Map<String, String> INFO_MAP = new HashMap<String, String>();

static {
INFO_MAP.put("s", "soong");
}

啊?不是说finnal变量一旦第一就不可以改变吗?没错!这个观点是真确的(废话,全世界的java书都是这样讲的,呵呵),这里就体现了,对于基本数据类型来说一但定义,并且赋值后,是不能改变的,对于应用数据类型来说,不能改变不是指它的值不能改变,而是指它所指向的引用不能改变(这就是基本数据类型和引用类型的差别)。
总结一句话:“finnal对于基本数据类型是值不能改变,而对于引用数据类型是其引用不能改变”。
**不能!抽象类不能使用 `final` 修饰。** --- ### ❌ 编译错误示例: ```java final abstract class Animal { abstract void makeSound(); } ``` > 🔴 编译报错: > `illegal combination of modifiers: abstract and final` > (abstract 和 final 的组合是非法的) --- ### ✅ 原因解析: `abstract` 和 `final` 在语义上是 **完全矛盾** 的: | 关键字 | 含义 | 要求 | |--------|------|-------| | `abstract`(抽象) | 表示该类**不完整**,必须被子类继承并实现其抽象成员 | ✔️ 必须能被继承 | | `final`(最终) | 表示该类**不可被继承** | ❌ 禁止被继承 | 👉 所以: - 如果一个类是 `abstract` 的,它**设计目的就是被继承**; - 而 `final` 类则**禁止被继承**。 两者同时使用会导致逻辑冲突,因此 Java 明确禁止这种组合。 --- ### 📌 类比理解: 这就像说一个人“既是活人又是死人”一样矛盾。 - `abstract class`:我还没完成,你得继承我来完成。 - `final class`:你不准继承我! 二者不可共存。 --- ### ✅ 正确用法对比: #### ✅ 抽象类(可被继承) ```java abstract class Animal { abstract void makeSound(); } class Dog extends Animal { void makeSound() { System.out.println("汪汪"); } } ``` #### ✅ final 类(不可被继承) ```java final class MathUtils { public static int add(int a, int b) { return a + b; } } // class MyUtils extends MathUtils → ❌ 编译错误! ``` --- ### ✅ 总结: | 问题 | 回答 | |------|------| | 抽象类能用 `final` 修饰吗? | ❌ 不能 | | 为什么不能? | `abstract` 要求继承,`final` 禁止继承,语义冲突 | | 编译器会如何处理? | 直接报错,不允许编译通过 | | 如何正确选择? | 想要子类扩展 → 用 `abstract`;想防止继承 → 用 `final`(但不能同时用) | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值