小议Java中final关键字使用时的注意点

final 类
final 类不能被继承,同时,一旦用 final 修饰了类,也就意味着 final 类中的所有方法都被隐式地指定为 final 方法

final 方法
在类继承的过程中,对于父类中的 final 方法,子类不能修改和覆盖。
private 方法都被隐式指定为 final 方法。
有两个原因使用 final 方法:

  • 锁定方法,防止被子类修改其含义
  • 在早期的 java 实现版本中,final 方法被实现为内嵌调用,可以提升性能

final 变量
final 关键字用来修饰变量是最常用的用法,如果修饰成员变量,则必须在定义时或者构造方法中初始化,且一经初始化此后不能再进行任何赋值。
针对基本类型和类对象有着不同的含义:

  • 对于基本类型,final 变量一经初始化,此后不能再改变该变量的值
  • 对于类对象,已经初始化后,不能让这个变量再指向另一个对象,但他指向的对象的内容是可以改变的

static final 域称为编译期常量,一般全部大写。

示例

class Glyph {
 void draw() {
  System.out.println("Glyph.draw()");
 }
 Glyph() {
  System.out.println("Glyph() before draw()");
  draw();
  System.out.println("Glyph() after draw()");
 }
}
class RoundGlyph extends Glyph {
 private int redius = 1;
 RoundGlyph(int r) {
  radius = r;
  System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
 }
 void draw() {
  System.out.println("RoundGlyph.draw(), radius = " + radius);
 }
}
public class RolyConstructors {
 public static void main(String[] args) {
  new RoundGlyph(5);
 }
}

输出结果:

Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5

上面的代码展示了类初始化过程以及隐藏的灾难性问题。
main 函数中以参数 5 调用 RoundGlyph 的构造函数创建了 RoundGlyph 对象,在 RoundGlyph 构造方法执行前调用了其父类 Glyph 的构造方法。
然而,在父类 Glyph 的构造方法中调用了 draw 方法,由于多态性,此时实际上调用了子类的 draw 方法,然而子类的 redius 此时还没有通过构造器初始化,因此输出了:

RoundGlyph.draw(), radius = 0

这显然不是我们想要的结果,因此需要注意:

  • 用尽可能简单的方法初始化类成员
  • 在构造器中最好只调用 final 方法

第二条的原因是 final 不会应用多态性,因此可以保证调用的是当前对象的相应方法,而不是初始化工作还没有进行的子类的覆盖方法。

总结final的内存分配方式:
1.修饰变量:
通常情况下,final变量有3个地方可以赋值:直接赋值,构造函数中,或是初始化块中。
(1)初始化:
由于在java的语法中,声明和初始化是联系在一起的,
也就是说:如果你不显示的初始化一个变量,系统会自动用一个默认值来对其进行初始化。(如int就是0)
对于final变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,
如果是静态的,则可以在初始化块。
(2)内存:
常量(final变量)和非final变量的处理方式是不一样的。
每一个类型在用到一个常量时,都会复制一份到自己的常量池中。
常量也像类变量(static)一样保存在方法区,只不过他保存在常量池。
(可能是,类变量被所有实例共享,而常量池是每个实例独有的。)
2.修饰方法:
保存在方法区,并且可以被函数代码直接替换,而不用等到执行时再决定具体是那个函数。
3.修饰类:
保存在方法区。

(0)

相关推荐

  • 简单理解Java的垃圾回收机制与finalize方法的作用

    垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新覆盖这个方法,因为Object已经实现了一个默认的,除非我们要实现特殊的功能(这 里面涉及到很多东西,比如对象空间树等内容). 不过用Java以外的代码编写的Class(比如JNI,C++的new方法分配的内存),垃圾回收器并不能对这些部分进行正确的回收,这时就需要我们覆盖默认的方法来实现对这部分内存的正确释放和回收(比如C++需要delete). 总之,f

  • 深入解析Java编程中final关键字的作用

    final class 当一个类被定义成final class,表示该类的不能被其他类继承,即不能用在extends之后.否则在编译期间就会得到错误. package com.iderzheng.finalkeyword; public final class FinalClass { } // Error: cannot inherit from final class PackageClass extends FinalClass { } Java支持把class定义成final,似乎违背了

  • 浅谈Java中return和finally的问题

    这两天学到了异常机制,其中try...catch...finally个人觉得算是重要的一环,联系到之前学的语句,遇到了return和finally这个好玩的问题,经过试验,发现计算机语言这种逻辑关系果然微妙,以下是自己的见解,若有不对之处,望各位前辈指点: 首先看第一段代码 public class return_finally{ public static void main(String[] args){ System.out.println( m_1() ); } public stati

  • Java中final关键字的用法总结

    1.final修饰类 被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现细节也无法改变,无法被扩展.final类中的所有成员方法都会被隐式地指定为final方法,final类中的成员变量可以根据需要设为final. 2.final修饰方法 一个类中的方法如果被final关键字修饰,则其子类无法覆写该方法,只能被子类继承.如果父类中的某个方法不想被其子类所覆写,可将该方法定义为final类型,另外,父类中的私有方法(即被priv

  • 完全解析Java编程中finally语句的执行原理

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子. 清单 1. public class Test { public static void main(St

  • Java面向对象编程中final关键字的使用方法详解

    在Java中通过final关键字来声明对象具有不变性(immutable),这里的对象包括变量,方法,类,与C++中的const关键字效果类似. immutable指对象在创建之后,状态无法被改变 可以从三个角度考虑使用final关键字: 代码本身:不希望final描述的对象所表现的含义被改变 安全:final对象具有只读属性,是线程安全的 效率:无法修改final对象本身,对其引用的操作更为高效 final 变量 定义final Object a,则a只能被初始化一次,一旦初始化,a的数据无法

  • 讲解Java编程中finally语句的基本使用方法

    在java中的finally关键一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会被执行,写个例子来说明下: public class TryAndFinallyTest { public static void main(String[] args) throws Exception{ try{ int a = testFinally(2); System.out.println("异常返回的结果a:"+a); }

  • Java垃圾回收finalize()作用详解

    finalize 方法使用案例 package test; class TestGC { private String str = "hello"; TestGC(String str) { this.str = str; } public void finalize() { System.out.println(str); } } public class Hello { /** * @param args */ public static void main(String[] ar

  • 详解Java异常处理中finally子句的运用

    当异常被抛出,通常方法的执行将作一个陡峭的非线性的转向.依赖于方法是怎样编码的,异常甚至可以导致方法过早返回.这在一些方法中是一个问题.例如,如果一个方法打开一个文件项并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路.finally关键字为处理这种意外而设计. finally创建一个代码块.该代码块在一个try/catch 块完成之后另一个try/catch出现之前执行.finally块无论有没有异常抛出都会执行.如果异常被抛出,finally甚至是在没有与该异常相匹配的catch子句

  • 小议Java中final关键字使用时的注意点

    final 类 final 类不能被继承,同时,一旦用 final 修饰了类,也就意味着 final 类中的所有方法都被隐式地指定为 final 方法 final 方法 在类继承的过程中,对于父类中的 final 方法,子类不能修改和覆盖. private 方法都被隐式指定为 final 方法. 有两个原因使用 final 方法: 锁定方法,防止被子类修改其含义 在早期的 java 实现版本中,final 方法被实现为内嵌调用,可以提升性能 final 变量 final 关键字用来修饰变量是最常

  • Java中final关键字详解

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 主要介绍:一.final关键字的基本用法.二.深入理解final关键字 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能

  • Java中final关键字详解及实例

    final在Java中可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,如果你试图将变量再次初始化的话,编译器会报编译错误.  final的含义在不同的场景下有细微的差别,但总体来说,它指的是"不可变". 1. final变量 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量.final变量经常和static关键字一起使用,作为常量.用final关键字修饰的变量,只能进行一次赋值操作

  • Java中final关键字的使用与注意总结

    前言 在java中可以将实例域定义为final.在构建对象是必须初始化这样的值.必须确保在每个构造器执行之后,这个域的值被设置,并且在后面的操作中不再对其修改.使用final声明变量之后,这个值就不能修改,一般final类型的变量都被声明为静态变量,而且是公有类型的,它在内存中被放在一个特有的公共区域. 也就是说,在Java语法中规定,final修饰的成员变量必须有程序员显式地指定初始值. 定义格式为: public  static  final  double pi = 3.1415926:

  • Java中final关键字和final的4种用法

    目录 1.final 定义 2.final 的 4 种用法 2.1.修饰类 2.2.修饰方法 2.3.修饰变量 2.4.修饰参数 3.final 作用 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,查看系列面试文章请关注我. Gitee 开源地址:gitee.com/mydb/interv- 1.final 定义 final 翻译成中文是"最终"的意思,它是 Java 中一个常见关键字,使用 final 修饰的对象不允许修改或替换其原始值或定义. 比如类被 fin

  • java中final关键字使用示例详解

    final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的.final关键字的含义?final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误.什么是final变量?凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量.final变量经常和static关键字一起使用,

  • Java中final关键字的深入探究

    前言 final 关键字的字面意思是最终的,不可修改的.这似乎是一个看见名字就大概知道怎么用的语法,但你是否有深究过final在各个场景中的具体用法,注意事项,以及背后涉及的Java设计思想呢? 一. final 修饰变量 1. 基础: final 修饰基本数据类型变量和引用数据类型变量 相信大家都具备基本的常识: 被 final 修饰的变量是不能够被改变的.但是这里的"不能够被改变"对于不同的数据类型是有不同的含义的. 当 final 修饰的是一个基本数据类型数据时,这个数据的值在初

  • 举例讲解Java中final关键字的用法

    1. final variable final variable 就是一个常量,一旦被初始化就不可以被改变. class Test1 { final double PI = 3.14; //常量的名称最好大写 public Test1(){ PI = 3.14; } void test(){ System.out.println("PI is: " + PI); } public static void main(String[] args){ Test1 t = new Test1(

  • Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理

    final 当这个关键字修饰一个类时,意味着他不能派生出新的子类,也就是说不能被继承,因此一个类不能被同时声明为abstract和final.当final修饰变量或者方法时,可以保证他们在使用中不会被改变.被声明为final的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改.同样,当final修饰一个方法时,这个方法不能被重载. finally 异常处理时提供finally来执行任何清楚操作.如果抛出一个异常,那么相匹配的catch子句就会被执行,然后控制就会转入finally块.

随机推荐