谈谈final

用final修饰类

这种情况很简单,这个类不能被继承。它"绝后"了。

用final修饰方法

这里可以分两种情况。

用final修饰private方法。其实也不能这么说,英文私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。

用final修饰public方法。 那么此方法不能被重写。

用final修饰参数

举个例子

    public void f2(final int a ,final User u) {
            a=15;                   //error
        u.setPassWord("sdf");  //correct
        u=new User();          //error
        System.out.println("类b中的f2被调用了");
    }

用final修饰成员变量

我们看代码

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

public class ListWrapper<E> {

    private final List<E> list;

    private final int a=15;

    public ListWrapper(){
        list = new ArrayList<E>();
//    a=10;
    }

    public boolean contains(E e){
        return list.contains(e);
    }

    public void add(E e){
        list.add(e);
    }

    public void remove(E e){
        list.remove(e);
    }
    public static void main(String[] args){

        ListWrapper<Person> list=new ListWrapper<Person>();
        Person a=new Person();
        Person b=new Person();
        list.add(a);
        System.out.println(list.contains(a));
        list.remove(a);
    }
}

成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。

因此对于list与a的赋值,我们可以在构造函数里赋值,也可以在定义的时候赋值,也可以在静态代码块里赋值。不过如果是在静态代码块里赋值,那么成员变量也应该是静态的。

除了在上述三个地方对final变量赋值外,在其他地方都是非法的。

另外用final修饰list,或者说修饰引用类型变量,final只保证变量引用的地址不变,但可以改变堆内存的具体信息。

例如,我可以使用ListWrapper的add和remove方法。此时我改变的是list在堆内存的数据信息,但是list在堆内存的位置并没有改变。

参考资料

http://blog.sina.com.cn/s/blog_6275b95d0100xdfd.html

http://www.cnblogs.com/zuoxiaolong/p/life27.html

http://blog.163.com/maomaoyu_1012/blog/static/19060130520116269329894/

时间: 2024-08-29 19:27:53

谈谈final的相关文章

谈谈 final finally finalize 区别

声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点,是我从课程中将知识点消耗后,用个人的理解.观念所表达出来的文字,参考了原文,但由于是个人理解,因此不保证观点完全正确,也不代表错误的观点是课程所表达的.如果这样仍旧还是侵权了,请告知,会将发表的文章删掉. 当然,如果你对此课程有兴趣,建议你自己也购买一下,新用户立减 30,微信扫码订阅时还可以返现 6 元,相

谈谈final、finally、finalize的区别

1.final:如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承.因此一个类不能被声明为abstract,又被声明为final.将变量或方法声明为final.可以保证他们在使用的时候不被改变.其初始化可以在两个地方:一是其定义的地方,也就是在final变量在定义的时候就对其赋值:二是在构造函数中.这两个地方只能选其中的一个,要么在定义的时候给值,要么在构造函数中给值.被声明为final的方法也只能使用,不能重写. 2.finally:在异常处理的时候,提供finall

谈谈final、finally和finalize

final: final为修饰符, 如果类被声明为final,则不能派生新子类. 如果变量被声明为final,则必须在声明时初始化,在以后的引用只能读取,不可修改. 如果方法被final声明,则只能使用,不可重载. finally: finally用于异常处理中执行catch块后执行的语句块(如果该语句块存在). finalize: finalize为方法名,用于在垃圾收集器将对象删除之前对该对象调用的.

Java核心技术36讲----------谈谈final、finally、finalize有什么不同

一.final 1.final修饰方法时,需要注意的点: #final修饰方法时,之前的第二个原因是效率.但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升.在最近的Java版本中,不需要使用final方法进行这些优化了." #因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的.即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的 #要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的

Java基础(三)-final关键字分析

今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能被继承. 这一点应该很多人都知道也遇到过,经典案例就是java.lang.String类 还有一些常见的类也是被final所修饰的,如下: 基本类型对应的包装类型(如java.lang.Integer.java.lang.Long等).字符相关类(java.lang.StringBuilder.ja

Java基础知识总结--final、finally、finalize的区别

谈谈final.finally.finalize的区别 1.final修饰符:如果一个类被声明为final,意味着这个类不能再被派生出新的子类,不能作为父类被别的类继承.因此,一个类不能即被声明为abstract又被声明为final.将变量或者方法声明为final,可以保证他们在使用中不会被改变.其初始化可以在两个地方进行:一个就是 在定义处,在final变量定义时直接给其赋值,二就是在构造函数中,这两个地方只能任选其一,并且在以后的引用中只能读取不能修改,别声明为final的方法只能使用,不能

大厂面试官问你知道final、finally、finalize有什么区别?

前言Java程序员面试,基础真的很重要.基础这东西,各个公司都很看重,尤其是大公司,他们看中人的潜力,他们舍得花精力去培养,所以基础是重中之重.之前很多人问我,项目经历少怎么办,那就去打牢基础,当你的基础好的发指的时候,你的其他东西都不重要了. Java 语言有很多看起来很相似,但是用途却完全不同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点.今天,我要问你的是一个经典的 Java 基础题目,谈谈 final.finally. finalize 有什么不同?典型回答final

java面试题大全

java面试笔试题大汇总     第一,谈谈final, finally, finalize的区别. 最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 这个问得很少. 第五,HashMap和Hashtable的区

.Net 面试题 汇总(三)

101.ASP.net的身份验证方式有哪些?分别是什么原理? 答:Windwos(默认)用IIS... From(窗体)用帐户 Passport(密钥) 102.在.net中,配件的意思是? 答:程序集.(中间语言,源数据,资源,装配清单) 103.net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置 104.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由. public void