重新学习一下Java中的几个关键字(final/static/volatile......)
来源:互联网 发布:上海软件学院 编辑:程序博客网 时间:2024/06/01 07:25
1、 final关键字
final关键字可以修饰类,方法和变量,对于每一种修饰都有不同的意义,但目的是相同的,保持完整性防止改变。
例如,在Java中final类不可以被继承,final变量的值不可以修改,final方法不可以被重载。
在Java中,我们无法让对象被修饰为final,而只能修饰对象的引用,这意味着即使你写public final A a = new A(); 事实上a指向的对象的数据依然可以被修改,不能修改的是a本身的引用值,即你不能再对a进行重赋值。同样的情况出现在数组中,比如public final int[] a = {1, 2, 3, 4, 5},事实上a中的数值是可修改的,即可以写a[0] = 3。据目前了解,java中数组内的数据是无法修饰为不可修改的,而C/C++可以。
当一个方法被修饰为final方法时,意味着编译器可能将该方法用内联(inline)方式载入,所谓内联方式,是指编译器不用像平常调用函数那样的方式来调用方法,而是直接将方法内的代码通过一定的修改后copy到原代码中(将方法主体直接插入到调用处,而不是进行方法调用)。这样可以让代码执行的更快(因为省略了调用函数的开销),比如在int[] arr = new int[3]调用arr.length()等。
另一方面,私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,我们可以在它的任何对象创建之前,直接通过类名来访问访问,无需引用任何对象。
静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法,因为实例成员与特定的对象关联。
static代码块也叫静态代码块,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。利用静态代码块可以对一些static变量进行赋值。
this关键字是指当前对象的,具体用法有以下几种:
(1)引用成员变量
如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,而不是指成 员方法的形式参数或者局部变量。
如构造函数常用的this.name=name;
(2)调用类的构造方法
public class Student{ public Student(){ this(“luobo”) } public Student(String name){ this.name=name;} }上面代码中this("luobo")就是调用第二个构造方法。
(3)返回对象的值
如在 代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。
public class Test {public Test(){Object o=getValue();System.out.println(o.toString());}public Object getValue(){return this;}public static void main(String[] args) {new Test();}}
输出:Test@8e3cf254、volatile关键字
用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B)放进线程自己的内存空间里,线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)。
线程在每次使用变量的时候,都会读取变量修改后的最新值。
详细分析在一篇转载的文章中。
java中关键字volatile的作用
http://blog.csdn.net/csummm4/article/details/21026743
5、transient关键字
transient说明一个属性是临时的,不会被序列化。
6、super关键字
通常来讲表示一个父类的引用。
但是以前碰到过一道Java的面试题:
import java.util.Date; public class Test extends Date { public void test() { System.out.println(super.getClass().getName()); } public static void main(String[] args) { new Test().test(); } }输出结果不是Date,而是Test
因为super并没有代表超类的一个引用的能力,只是代表调用父类的方法而已。所以,在子类的方法中,不能这样用System.out.println(super);也不能使用super.super.mathod();
事实上,super.getClass()是表示调用父类的方法。getClass方法来自Object类,它返回对象在运行时的类型。因为在运行时的对象类型是Test,所以this.getClass()和super.getClass()都是返回Test。
为了得到Date改为:
getClass().getSuperClass().getName();
- 重新学习一下Java中的几个关键字(final/static/volatile......)
- java 几个关键字,final,static
- java学习(1).static,volatile,transient,final等关键字
- java学习(2).static,`volatile`,transient,final等关键字
- java中的final,static关键字
- JAVA中的static、final关键字
- java中的final、static关键字
- java中几个关键字 this static final
- Java中的static关键字和final关键字
- java中 static,final,transient,volatile关键字的作用
- java中 static,final,transient,volatile关键字的作用
- java中 static,final,transient,volatile关键字的作用
- java学习笔记 static,final关键字学习
- java中的static和final关键字(讲解很详细)
- java 中的 final 关键字 和 static 用法
- 黑马程序员---java中的final static 关键字
- Java中的static和final关键字
- Java中的this,final,static关键字
- Want to work at a startup? Nail these 9 interview questions
- linux 下安装php
- c语言专家编程,读书笔记
- 局域网内双升游戏的设计(三)--算法
- 单例模式
- 重新学习一下Java中的几个关键字(final/static/volatile......)
- 女儿身何韵诗上男神榜 得分超过谢霆锋吴彦祖
- postgres与pgpool的安装
- Incorrect string value: '' for column '' at row 1 错误分析
- 服务器被黑善后工作
- Thread的run()与start()的区别
- MySQL的重装问题解决方法
- java检测磁盘空间
- 动态绑定的多态的实现原理