java关键字总结

1.
transient:
Q:transient关键字能实现什么?


A:当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;
当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。
例如,当反序列化对象——数据流(例如,文件)可能不存在时,原因是你的对象中存在类型为java.io.InputStream的变量,
序列化时这些变量引用的输入流无法被打开。
java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,
我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,
可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中
,然而非transient型的变量是被包括进去的。


2.final,finally,finalize的区别?
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,
不能重载。 
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,
然后控制就会进入 finally 块(如果有的话)。 
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
如果一个变量是个final修饰的,这必须初始化。




3.java synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
  一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
  另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
       二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,
       另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
        三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,
        其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
        四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,
        它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞


 二.
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 
1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如: 
public synchronized void accessVal(int newVal); 
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,
每个 synchronized 方法都必须获得调用该方法的类实例的锁方能


执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,
此后被阻塞的线程方能获得该锁,重新进入可执行


状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态
(因为至多只有


一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突
(只要所有可能访问类成员变量的方法均被声明为 synchronized)


在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,
以控制其对类的静态成


员变量的访问。 
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为


synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。
当然我们可


以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,
但是 Java 为我们提供


了更好的解决办法,那就是 synchronized 块。  


2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下: 
synchronized(syncObject) { 
//允许访问控制的代码 
}  
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机


制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。 
对synchronized(this)的一些理解 
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线


程必须等待当前线程执行完这个代码块以后才能执行该代码块。  
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized


(this)同步代码块。  
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)


同步代码块的访问将被阻塞。 
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个


object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 


还有一些技巧可以让我们对共享资源的同步访问更加安全:


1. 定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,
对象在外界可以


绕过同步方法的控制而直接取得它,并改动它。这也是JavaBean的标准实现方式之一。


2. 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,
因为当外界对象通过get方法拿到这个instance对象


的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。
 这个时候就需要将get方法也加上synchronized同步,并


且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了






4.final关键字
   (1.final变量:


      当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。


     当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。


     另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用
    (2.final方法


     如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 
使用final方法的原因有二: 
    第一、把方法锁定,防止任何继承类修改它的意义和实现。 
    第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。  
    (3.final类
     final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
   注:static和final一块用表示什么 
 static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 
对于方法,表示不可覆盖,并且可以通过类名直接访问。




5.  static关键字
从以下测试可以看出, static 可以修饰:


  (1. 语句块


  (2. 成员变量(但是不能修饰局部变量)


  (3. 方法


  (4. 接口(内部接口)


  (5. 类(只能修饰在类中的类, 即静态内部类)


  (6. jdk 1.5 中新增的静态导入
那么static 修饰的表示什么呢? 当创建一个类时,就是在创建一个新类型,描述这个类的对象的外观和行为,
除非用new创建出那个类的对象,数据存储空间才被分配,其方法才供外界调用。
那么当声明一个事物为static时,就意味着这个域或者方法不会与包含它的那个类的任何对象关联在一起,
也就是说,它不依赖类特定的实例,被类的所有实例共享,
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。
因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。


  (1. static 修饰语句块:


  static{} 可以有多处,执行顺序按照他们的声明顺序。当JVM加载这个类的时候,就会执行此语句块,并且只执行一次。


  (2. static 变量:


  static 变量,可以被类的所有对象共享,并且它只有一份存储空间,JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配。那么在引用static变量的时候,使用(类名.变量名)是首选的方式,因为他不仅强调它是static结构,而且在某些情况下会为编译器进行优化提供更好的机会。


  使用类名直接引用static变量是比较力荐的,这样就很明确的告诉大家该变量或属性是static结构或是被static修饰。
 类似的形式同样应用在使用static修饰的方法上面(称为静态方法)。它可以像普通方法一样使用对象来引用,也可以通过特殊的语法形式来调用如:“类名”+“ . ”+“方法”();   定义静态方法的方式与定义静态变量一样:
 (3. static方法:


  static方法与非static方法的区别在于: static方法可以用类名直接访问在static内部的变量和方法,而不能引用非static的变量或者方法,但是你可以通过传递参数的方式传递一个引用,让这个引用去调用非静态数据。


  (4. static 接口:


  内部接口(inner interface)本身就默认是static,所以static关键词加与不加都是一样的
 (5. static 修饰类:(后部分会详细说明)


  表示它是一个静态内部类,它在引用外部类的事物时,必须也是static的。而且, 静态内部类在创建自己的对象时, 是不需要外围类的存在。就好像下面的部分:
类方法不能访问实例变量,只能访问类变量
实例方法不但可以访问类变量,也可以实例变量
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。
也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
引用static变量有两种方法。如前例所示,可以通过一个对象去定位它,如m1.classVar; 也可以通过其类名直接引用,如Member.classVar,而对于非静态成员则不行。


  尽管当static作用于某个字段时,肯定会改变数据的创建方式(因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象都有一个存储空间),但是如果static用于某个方法,差别却没有那么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。这一点,对定义main()方法很重要,这个方法是运行一个应用时的入口点。


  static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在类中置入static方法就可以访问其他static方法和static域。


  和其他任何方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法通常拿来做“牧羊人”的角色,负责看护与其奴隶同一类型的实例群。


不过,要是在代码中出现大量的static方法,就该重新考虑自己的设计了。
 访问类变量:类名.类变量;对象名.类变量
 
 1、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?


“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。


Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
static方法跟类的任何实例都不相关,所以概念上不适用。


2、是否可以在static环境中访问非static变量?


static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。
如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。


6.this 属于对象的,不属于类.





































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值