final的作用随着所修饰的类型而不同

1、final修饰类中的属性或者变量

不管属性是基本类型还是引用类型。final所起的作用都是变量里面存放的“值”不能变。

这个值,对于基本类型来说,变量里面放的就是实实在在的值,如1,“abc”等。

   
而引用类型变量里面放的是个地址。所以用final修饰引用类型变量指的是它里面的地址不能变。并非说这个地址所指向的对象或数组的内容不能够变,这个一定要注意。

比如:类中有一个属性是final Person p=new Person("name");
那么你不能对p进行又一次赋值,可是能够改变p里面属性的值,p.setName('newName');

p是引用变量  它里面存的一个地址,不能改变  可是我们能够改变这个地址指向的对象的属性值。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDYzNDA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

final修饰属性,声明变量时能够不赋值。并且一旦赋值就不能被改动了。

对final属性能够在三个地方赋值:声明时、初始化块中、构造方法中。总之中的一个定要赋值。

2、final修饰类中的方法

作用:能够被继承。但继承后不能被重写。

3、final修饰类

作用:类不能够被继承。

思考一个有趣的现象:

byte b1=1;

byte b2=3;

byte b3=b1+b2;//当程序运行到这一行的时候会出错,由于b1、b2能够自己主动转换成int类型的变量。运算时java虚拟机对它进行了转换,结果导致把一个int赋值给byte-----出错

假设对b1 b2加上final就不会出错

final byte b1=1;

final byte b2=3;

byte b3=b1+b2;//不会出错,相信你看了上面的解释就知道原因了。

以上内容是转载于http://blog.csdn.net/linchunhua/article/details/5305452

下面为自己见解

我们知道一个定义为final的对象引用仅仅能指向唯一一个对象(由于地址不能更改)可是一个对象的本身的值是能够改变的;

比方:

Random rand=new Random();

public final int A_1=rand.nextInt(10);

这里A_1每次执行的结果都不同的。

为了将一个常量真正做到不可更改 能够将常量声明为static final。

public static final int A_2=rand.nextInt(10);

这里结果每次执行都是同样的。

static final形式。它在内存中为A_2开辟了一个恒定不变的区域,当再次实例化对象的时候,任然指向A_2这块内存区域。所以A_2保持不变。A_2是在

装载的时候被初始化,而不是每次创建新的对象时都被初始化

final方法

final定义方法不能被覆盖

注意:一个父类的某个方法定义了private修饰符  。子类将无法訪问  自然就无法覆盖

//final 类
public class finalParent {
private final void doit(){
System.out.println("父类.doit()");
}
final void doit2(){
System.out.println("父类.doit2()");
}
public void doit3(){
System.out.println("父类.doit3()");
}
}

public class finalFindMethod {
public static void main(String[] args){
Sub s=new Sub();
s.doit();//结果是子类.doit()
finalParent p=s;//向上转型
p.doit2();
p.doit3();
}
}
//在父类定义了doit(),子类也定义了doit()看似是子类覆盖了父类的方法。可是覆盖必须能够满足一个对象向上转型为他的基本类型
//而且调用同样方法的这一条件;父类中带了private是主类的私有方法,子类仅仅是新定义了一个方法而已,二不是覆盖
//final的方法不能被子类继承

public class Sub extends finalParent {
final void doit() {
System.out.println("子类.doit()");
} // final void doit2(){ //这里显示不能重写父类为final的方法
//
// }
public void doit3() {
System.out.println("子类.doit3()");
}
}
结果:
子类.doit()

父类.doit2()

子类.doit3()
//在父类定义了doit(),子类也定义了doit()看似是子类覆盖了父类的方法,可是覆盖必须能够满足一个对象向上转型为他的基本类型

//而且调用同样方法的这一条件;父类中带了private是主类的私有方法,子类仅仅是新定义了一个方法而已,二不是覆盖

//final的方法不能被子类继承





final使用方法的更多相关文章

  1. 利用final定义方法:这样的方法为一个不可覆盖的方法。

      常量(这里的常量指的是实例常量:即成员变量)赋值: ①在初始化的时候通过显式声明赋值.Final int x=3: ②在构造的时候赋值. 局部变量可以随时赋值.   利用final定义方法:这样的 ...

  2. java中static,final,private方法的继承多态问题

    父类中的final  private方法不能被继承,父类中的static方法可以被继承,但是不能重写,这三者都属于前期绑定,java中除了这三种以及构造方法之外剩下的都是后期绑定(运行是绑定). 当父 ...

  3. static和final修饰方法

    static修饰的方法是静态方法,所有的对象共用一份,也就是共享方法.static方法是可以被继承,然后可以被重写和重载. final修饰的方法是不可变方法,final方法所在类被继承时,被final ...

  4. Java final 关键词修饰类、方法、变量

    1. final修饰类  被修饰的类不能被继承,也没有子类.假如随意创建这些类的子类,子类可能会错误的修改父类的实现细节.出于安全原因,类的实现细节不允许有任何改动.在创建对象模型的时候,确信这个类不 ...

  5. final 关键字:用来修饰类,方法,成员变量,局部变量

    final 关键字:用来修饰类,方法,成员变量,局部变量 表示最终的不可变的 1.final修饰一个类 表示当前的类不能有子类,也就是不能将一个类作为父类 格式: public final class ...

  6. Java中final关键字修饰变量、方法、类的含义是什么

    Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...

  7. Final类和Final方法

    终止继承 Final类 当关键字final用来修饰类时,其含义是该类不能在派生子类.换句话说,任何其他类都不能继承用final修饰的类,即使该类的访问限制为public类型,也不能被继承:否则,将编译 ...

  8. java中final关键字的使用方法

     [java中为什么会有final变量]: final这个关键字的含义是"这是无法改变的"或者"终态的": 那么为什么要阻止改变呢? java语言的发明者可 ...

  9. java类中final方法的作用

    不给子类复写这个方法.说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用 inline扩展 ...

随机推荐

  1. C# Winform 模拟QQ新闻弹出框

    一开始做的时候,觉得这个太简单了.真心做的时候还是遇到了不少的坑啊. 1)循环播放新闻内容,建议使用showdialog(),不要用show(),不太好控制前后之间的停顿. 2)窗口的初始位置为有下角 ...

  2. 【转】Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示

    1 package com.lixu.clearedittext; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 i ...

  3. 安卓第一课:android studio 的环境搭建与真机运行以及遇到的问题

    AS的下载: https://developer.android.com/studio/index.html AS的安装: android studio, sdk, virtual device都要安 ...

  4. POJ 3669 简单BFS

    标号 搜 完了-- //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #in ...

  5. tomcat:Could not publish to the server. java.lang.IndexOutOfBoundsException

    1.将工程加入到tomcat,报上述错误 2. run--maven build 报jar包错误: invalid LOC header (bad signature) 3.根据提示找到上述jar包, ...

  6. RadioButton的drawableTop图片文字不居中

    在安卓应用的开发中,一般普通应用用到最多的就是底部放一个RadioGroup实现切换的布局,今天在实现的时候,却出现了底部RadiButton的drawableTop图片及文字无法居中的情况,经过对比 ...

  7. 题解 P2330 【[SCOI2005]繁忙的都市】

    又是一道Kruskal题目. AC代码见下. 主要思路就是将所有的边储存起来,然后进行贪心地选择,期间需要判断两个端点是否有关联,这一过程通过并查集实现.Kruskal部分套模板就可以了. #incl ...

  8. 以Append方式打开文件,设置偏移量无效

    #include<stdio.h> int main() { FILE * fd = fopen("btoo1.c", "ab+"); fpos_t ...

  9. Raphaeljs入门到精通(一)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  10. Linux软防火墙ACL匹配的优化点

    首先.请求不要再诬陷Netfilter.尽管它有一些固有性能损耗,但敬请不要将iptables和Netfilter等同,假设你要抓元凶,请直接说iptables,而不要说成Netfilter!     ...