java关键字总结?

  3. transient使用细节——被transient关键字修饰的变量真的不能被序列化吗?

  我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

用法:类修饰符的一种,可以用来修饰类,方法,被修饰的类不能够实例化(即不能用new关键字得到对象),被修饰的方法不能够实现。一个抽象类中不一定要有抽象方法,但是一个类里面有抽象方法就一定是抽象类。如果由类要继承抽象类的话,必须要实现里面的抽象方法。构造方法和静态方法不可以修饰为抽象。

abstract关键字可以修改类或方法。

abstract类可以扩展(增加子类),但不能直接实例化。

abstract方法不在声明它的类中实现,但必须在某个子类中重写

采用abstract方法的类本来就是抽象类,并且必须声明为abstract。abstract类不能实例化。

仅当abstract类的子类实现其超类的所有abstract方法时,才能实例化abstract类的子类。这种类称为具体类,以区别于abstract类 。

abstract抽象用在类的声明中来指明一个类是不能被实例化的,但是可以被其他类继承。一个抽象类可以使用抽象方法,抽象方法不需要实现,但是需要在子类中被实现。它的用途是向子类提供通用的信息。抽象类可以包含正常的类包含的任何东西,也就是说,类和实例变量,以及带有任何修饰词的方法。只有抽象类可能有抽象方法。如果一个不是抽象的类包含一个抽象方法,那么将会出现编译错误。 
例子:如果下列的一个成立,那么一个有抽象方法:

 b.它从它的直接父类继承了一个抽象方法。 
c.一个直接的类的父借口声明或继承了它的一个方法(这因此必须是abstract) 

static方法总是可用的,因此必须有一个实现;static abstract将永远没有实现。

用法:一个类继承另一个类的关键字,当出现了这个关键字,两个类就有了继承关系,extends前面的类,我们称之为父类。

extends后面的类,我们称之为子类。有了继承关系之后,我们就说子类拥有父类继承下来的所有非私有的成员(包括了属性,方法),但是不包括构造方法 。

解释:最终的,决定性的 
用法:修饰符的一种,它可以用来修饰类,方法,属性。当一个属性被修饰成final的之后,这个属性变成了常量,它的值必须在定义的时候初始化,并且后面的代码不能对其进行修改,它的命名应该全部都是大写。当一个方法被修饰成final的之后,这个方法在继承中是不能够被进行覆盖的。当一个类被修饰成final的之后,这个类不能再有子类。

final 关键字可以应用于类,以指示不能扩展该类(不能有子类)。 final 关键字可以应用于方法,以指示不能重写任何子类中的方法。

<2>final用于对象应用时,final使应用恒定不变。一旦引用被初始化指向一个对象,就无法再把它指向另一个对象。

<3>final方法:一是把方法锁定,以防止继承类修改它的含义,二是确保继承中使方法行为保持不变,并且不会被覆盖。类中所有的private方法都隐式地指定为是final。 
<4>final参数:对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,以为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句的对象变量,当你在方法中不需要改变作为参数的变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。 
<5>final类:当将某个类的整体定义为final时,就表明了该类不允许被继承。

解释:最后,终于,不可更改地 
用法:在异常处理机制当中,它的作用就像是人吃饭一样,必须得做的,不论有异常还是没有异常都要执行的代码就可以放到finally块当中去。finally块,必须要配合try块一起使用,不能单独使用,也不能直接和catch块一起使用。 
finally 关键字用来定义始终在 try-catch-finally 语句中执行的块。finally 块通常包含清理代码,用在部分执行 try 块后恢复正常运行。

用法:用来让一个类实现一个接口的关键字,实现接口的这个类必须实现接口里面所有的方法。 

最后,终于,不可更改地

在异常处理机制当中,它的作用就像是人吃饭一样,必须得做的,不论有

异常还是没有异常都要执行的代码就可以放到

不能单独使用,也不能直接和

块通常包含清理代码,用在部分执行

解释:接口,界面 
用法:它本质上是一个类,一个完全抽象的类,里面没有任何实现的方法。它不是用来继承的,是用来实现的。某个类如果实现了接口就必须要实现接口里面的所有方法。并且接口是不能用来实例化的,它也是不能通过new关键字获得对象。 
interface 关键字用来声明新的 Java 接口,接口是方法的集合。 接口是 Java 语言的一项强大功能。任何类都可声明它实现一个或多个接口,这意味着它实现了在这些接口中所定义的所有方法。 
实现了接口的任何类都必须提供在该接口中的所有方法的实现。 一个类可以实现多个接口。

用法:修饰符的一种,能够用来修饰属性和方法。需要注意的是被修饰的属性和方法,不再属于对象所有,而是属于类,意味着,要访问这些属性和方法不再通过对象而是直接用类名来访问。另外,静态的方法不能够访问非静态属性,非静态的方法能够访问静态的属性。 
static 关键字可以应用于内部类(在另一个类中定义的类)、方法或字段(类的成员变量)。 
通常,static 关键字意味着应用它的实体在声明该实体的类的任何特定实例外部可用。 
static(内部)类可以被其他类实例化和引用(即使它是顶级类)。在上面的-示例-中,另一个类中的代码可以实例化 MyStaticClass 类,方法是用包含它的类名来限定其名称,如 MyClass.MyStaticClass。 
static 字段(类的成员变量)在类的所有实例中只存在一次。可以从类的外部调用 static 方法,而不用首先实例化该类。这样的引用始终包括类名作为方法调用的限定符。在上面的示例中,MyClass 类外部的代码以 MyClass.getNumObjects() 的形式调用 getNumObjects() static 方法。 
通常用于声明可以在类的外部使用的类常量。在引用这样的类常量时需要用类名加以限定。在上面的-示例-中,另一个类可以用 MyClass.MAX_OBJECTS 形式来引用 MAX_OBJECTS 常量。 
1>通常在一个类中定义一个方法为static,就是说无须本类的对象就可以直接调用。 
2>静态变量和静态方法类似。所有此类实例共享此静态变量,也就是说类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final就另当别论了。

3>static定义的变量会优先于任何其他非static变量,不论其出现顺序如何。

 4>static{}着是用来显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。

5>在涉及到继承的时候,会先初始化父类的static变量,然后是子类的。

 6>通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需要实例一个外部类。

synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。  
 在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。

synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变

量的代码放到专门的方法中,

为我们提供了更好的解决办法,

四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

用法:transient 关键字可以应用于类的成员变量,以便指出该成员变量不应 在包含它的类实例已序列化时被序列化。 
java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。 
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想    
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

用法:volatile 关键字用于表示可以被多个线程异步修改的成员变量。 
volatile 的目标用途是为了确保所有线程所看到的指定变量的值都是相同的。 
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。      
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。   
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。    
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

最后,终于,不可更改地

在异常处理机制当中,它的作用就像是人吃饭一样,必须得做的,不论有

异常还是没有异常都要执行的代码就可以放到

不能单独使用,也不能直接和

块通常包含清理代码,用在部分执行

最后,终于,不可更改地

在异常处理机制当中,它的作用就像是人吃饭一样,必须得做的,不论有

异常还是没有异常都要执行的代码就可以放到

不能单独使用,也不能直接和

块通常包含清理代码,用在部分执行

1、final修饰类 被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现细节也无法改变,无法被扩展。final类中的所有成员方法都会被隐式地指定为final方法,final类中的成员变量可以根据需要设为final。

一个类中的方法如果被final关键字修饰,则其子类无法覆写该方法,只能被子类继承。如果父类中的某个方法不想被其子类所覆写,可将该方法定义为final类型,另外,父类中的私有方法(即被private关键字修饰的方法)也不允许被子类所覆写,所以父类中被private关键字修饰的方法默认为final类型,被final关键字修饰的方法有如下特质:

该方法被锁定,可以防止任何继承类修改它的意义和实现;
高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率;
另外,使用final修饰的静态方法在其所属类的子类中不能被隐藏(hide);

3、final修饰变量 final这个关键字的含义是“这是无法改变的”或者“终态的”;
那么为什么要阻止改变呢?
java语言的发明者可能由于两个目的而阻止改变:
jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,
 用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;
众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递。
有人说final变量在赋值后就不可变,
那么这个不变到底指的是什么呢?
这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。
就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。
(1)被final关键字修饰的基本数据类型,则其数值一旦在初始化之后便不能更改;
(2)如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但该引用所指向的对象的内容是可以发生变化的。原因为:引用数据类型存储的引用对象在堆内存中的地址,final修饰引用类型之后,要求该引用指向的堆内存空间(或者说该引用存储的堆内存地址)不能改变。
当用final修饰类的非静态成员变量时,成员变量的初始化有两种方式:
(3)在声明时进行初始化
(4)在声明变量时可以不进行初始化,该变量被称为blank final,即final空白,但是要在这个变量所在的类的所有的构造方法中对这个变量赋初值。
当用final修饰类的静态成员变量时,静态成员变量的初始化方式也有两种:
(5)在声明时进行初始化
(6)在静态初始化块中进行初始化
当用final修饰接口的静态变量时,其初始化方式只有一种:
(7)在声明时进行初始化
当用final修饰局部成员变量时,只需要保证在使用之前被初始化赋值即可。
总之,被final关键字修饰的变量在声明时可以不进行初始化,但必须保证该变量在使用之前被初始化,一旦被初始化赋值之后,就不能再被重新赋值了。试分析一下程序的输出结果:


当方法参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。该变量在方法调用时被创建,同时初始化为对应实参值,在方法体(body)执行结束前,其值不能改变。用final关键字修饰的基本数据类型的参数,其参数值无法改变,用final关键字修饰的引用数据类型,无法是该引用指向其他对象或再次赋值为null,但可以使用该引用改变引用对象的内容。final用于修饰参数的目的并非防止在调用的方法内部对参数的操作改变方法外部对应变量的值,只是防止在该方法内对该参数进行重新赋值操作,影响该参数传递时的初始值。而且将方法中的参数用final关键字修饰并不能防止从方法外部所传递的参数的值的内容不被改变。具体可参考final修饰引用数据类型的解释。

我要回帖

更多关于 java关键字的用法 的文章

 

随机推荐