`
lizhenbin2010
  • 浏览: 99784 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java Final的理解

 
阅读更多

Final主要应用场合:数据、方法以及类。

final数据:

 

(1) 编译期常数,它永远不会改变。

(2) 在运行期初始化的一个值,我们不希望它发生变化。

 

对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程里。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销。在Java 中,这些形式的常数必须属于基本数据类型。

 

无论static 还是final 字段,都只能存储一个数据,而且不得改变。

 

(1)对于基本数据类型,final 会将值变成一个常数。

(2)对于对象,final 会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将引用变成指向另一个对象。然而,对象本身是可以修改的。

 

 

1、final数值常量:

public static final double PI = 3.14

final 属性的基本数据类型,并含有编译期的值,所以它们除了能作为编译期的常数

使用外,在任何导入方式中也不会出现任何不同。Static 强调它们只有一个;而final 表明它是一个常数。

final static表示编译期的常数。

 

2、空白final:

private final List list;

private final Sudent sudent;

尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白final 都必须在实际使用前得到正确的初始化。而且编译器会主动保证这一规定得以贯彻。然而,对于final 关键字的各种应用,空白final 具有最大的灵活性。位于类内部的一个final 字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。

 

3、final自变量:

public int getNext(final int index) {}

只能读取自变量,不可改变它,对象只能读取该对象,对象的值还是可以改变的。

 

总结:final变量,其实声明为final表示指向对象的引用就不能改变了,如果是指向基本类型,基本就是常量,如果是对象,从头到尾都表示只是一个对象,对象的属性内容可以改变。

 

final方法:

public final String getMethodName() {};

声明为final的方法条件

1、设计足够完美,防止任何继承类改变它的本来含义。

2、效率的考虑。只要编译器发现一个final方法调用,就会忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。相反,它会用方法主体内实际代码的一个副本来替换方法调用。这

样做可避免方法调用时的系统开销。

 

private是之后自己才能使用,继承不了,声明为final,子类还是可以调用的,只是不能重写。

 

 

final类:

 

final class TestFinalClass{}。

典型的有String Integer Long等。

 

如果说整个类都是final,就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出

于安全方面的理由,我们不希望进行子类化(子类处理)。

 

数据成员既可以是final,也可以不是,final的规则同样适用于数据成员,无论类是否被定义成final,类定义成final 后,结果只是禁止进行继承——没有更多的限制。然而,由于它禁止了继承,所以一个final 类中的所有方法都默认为final。因为此时再也无法覆盖它们。所以与我们将一个方法明确声明为final一样,编译器此时有相同的效率选择。

 

import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述:JAVA Final测试
 * Date: 13-1-28 Time:下午7:37
 */
public class TestFinal {

    /**
     * final常量
     */
    public static final double PI = 3.14;

    /**
     * final类变量
     */
    public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * final数值,空白final
     */
    final String className;
    final TestFinalMethod testFinalMethod;
    final List list;

    /**
     * 传入参数初始化final
     * @param className
     * @param testFinalMethod
     * @param list
     */
    public TestFinal(String className, TestFinalMethod testFinalMethod, List list) {
        this.className = className;
        this.testFinalMethod = testFinalMethod;
        this.list = list;
    }

    /**
     * 构造初始化空白final
     */
    public TestFinal() {
        className = TestFinal.class.getName();
        testFinalMethod = new TestFinalMethod();
        list = new ArrayList();
    }

    /**
     * final变量参数
     * @param index
     * @return
     */
    public int getFinalCount(final int index) {
        int num = 0;
        for (int i = 0; i < 100; i++) {
           // index ++;
            num = num + index;
        }
        return num;
    }

    /**
     * 修改final变量参数
     */
    public void modifyFinalParams() {

        list.add("abc");
        list.add(10);

        testFinalMethod.setKey("key");
        testFinalMethod.setValue(100);
    }
}

/**
 * 测试Final方法
 */
//class TestFinalMethod extends TestFinalClass {
class TestFinalMethod {
    private String  key;
    private int value;
    /**
     * final方法
     */
    public final String getTestFinalMethodName() {
        return TestFinalMethod.class.getName();
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}

/**
 * 测试Final类
 */
final class TestFinalClass {
    private String className;
    public String simpleName;
    public final String getTestFinalClassName() {
        return TestFinalMethod.class.getName();
    }
}

 

分享到:
评论

相关推荐

    深入理解Java中的final关键字_动力节点Java学院整理

    带你深入理解Java中的final关键字_动力节点Java学院整理.

    java中final关键字和static关键字详细用法

    根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

    《剑指offer》Java深入理解final、finally、finalize.pdf

    final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作; finalize 是一个不...

    Java零基础-final关键字.md

    内容概要: 本文介绍了Java中final关键字的概念和用法。读者将学习什么是final关键字,为什么需要使用final,以及在不同场景...如有疑问,可以参考Java官方文档或向技术论坛寻求帮助,进一步加深对final关键字的理解。

    Java中final关键字详解

    深入理解final关键字 一.final关键字的基本用法  在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。  1.修饰类  当用final修饰...

    final和static用法详解JAVA

    根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

    Java中的final关键字深入理解

    主要介绍了Java中的final关键字深入理解的相关资料,需要的朋友可以参考下

    浅析对Java关键字final和static的理解

    本文主要给大家谈谈小编对java关键字final和static的理解,本文给大家介绍的较详细,需要的朋友参考参考下

    深入理解Java final变量的内存模型

    对于 final 域,编译器和处理器要遵守两个重排序规则:  在构造函数内对一个 final 域的写,与随后把这个构造对象的引用赋值给一个变量,这两个操作之间不能重排序  初次读一个包含 final 域的对象的引用,与...

    深入理解java内存模型.pdf

    深入理解JAVA内存模型.pdf (高清版) 1.基础 2.重排序 3.顺序一致性 4.voltile 5.锁 6.FInal 7.总结。。。等等

    深入理解 Java 内存模型.pdf

    java线程之间的通信对程序员完全透明,内存可见性问题...三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现;java内存模型的设计目标,及其与处理器内存模型和顺序一致性内存模型的关系

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    Java 内存模型的抽象 4 重排序 6 处理器重排序与内存屏障指令 7 happens-before 10 重排序 13 数据依赖性 13 as-if-serial 语义 13 程序顺序规则 15 重排序对多线程的影响 15 顺序一致性 19 数据竞争与顺序...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    ava基础 基础知识 ...Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    有关Java中关键字final的理解

     在Java编程语言中,有时候需要告知编译器一段数据是不变的编译期常量。对于这种情况,编译器可以将此常量值带入需要用到它的计算式子当中,这种在编译时执行计算式的方法减轻了运行时的开销。通常,这类常量数据...

    深入理解java内存模型

    Java内存模型的抽象 重排序 处理器重排序与内存屏障指令 happens-before 重排序 数据依赖性 as-if-serial 语义 程序顺序规则 重排序对多线程的影响 顺序一致性 数据竞争与顺序一致性保证 顺序一致性内存模型 同步...

    深入理解Java内存模型??final

    与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:  1、在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个...

    面向对象修饰符public private protest super final abstract理解

    public private protest super final abstract this 等用法

    Java 基础学习笔记:数据类型,常见运算,final &amp;amp; static,Java 常见类,异常 &amp;amp; 反射

    Java编程语言的语法类似于C++,但是相比C++更简洁和易于理解。它采用了“一次编写,到处运行”的原则,即一次编写的程序可以在不同的操作系统上运行,这得益于Java虚拟机(JVM)的存在。JVM是Java的核心组成部分,它...

    java面试笔试题集合

    java面试笔试题集合4. 多态性: 多态性是指允许不同类的...java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别

Global site tag (gtag.js) - Google Analytics