1. abstract(抽象)java
用法:类修饰符的一种,能够用来修饰类,方法,被修饰的类不可以实例化(即不能用new关键字获得对象),被修饰的方法不可以实现。一个抽象类中不必定要有抽象方法,可是一个类里面有抽象方法就必定是抽象类。若是由类要继承抽象类的话,必需要实现里面的抽象方法。构造方法和静态方法不能够修饰为抽象。node
例子:数组
public abstract class Animal {并发
public abstract void cry();异步
public void run(){ide
System.out.println(“跑的方法……”);函数
}oop
}优化
abstract关键字能够修改类或方法。this
abstract类能够扩展(增长子类),但不能直接实例化。
abstract方法不在声明它的类中实现,但必须在某个子类中重写
-示例-
public abstract class MyClass{}
public abstract StringmyMethod();
采用abstract方法的类原本就是抽象类,而且必须声明为abstract。abstract类不能实例化。
仅当abstract类的子类实现其超类的全部abstract方法时,才能实例化abstract类的子类。这种类称为具体类,以区别于abstract类 。
final 类的方法都不能是 abstract,由于 final 类不能有子类。
< 1> abstract抽象用在类的声明中来指明一个类是不能被实例化的,可是能够被其余类继承。一个抽象类可使用抽象方法,抽象方法不须要实现,可是须要在子类中被实现。它的用途是向子类提供通用的信息。抽象类能够包含正常的类包含的任何东西,也就是说,类和实例变量,以及带有任何修饰词的方法。只有抽象类可能有抽象方法。若是一个不是抽象的类包含一个抽象方法,那么将会出现编译错误。
例子:若是下列的一个成立,那么一个有抽象方法:
a.它显式的声明了一个abstract方法。
b.它从它的直接父类继承了一个抽象方法。
c.一个直接的类的父借口声明或继承了它的一个方法(这所以必须是abstract)
<2>若是用户声明private,static,和final方法为abstarct,编译错误将出现。
不可能重设一个private方法,由于一个abstarct private永远不能被实现。
static方法老是可用的,所以必须有一个实现;static abstract将永远没有实现。
final方法不能被重设,所以不回有final abstract方法的实现。
2.extends 解释:扩充,扩展
用法:一个类继承另外一个类的关键字,当出现了这个关键字,两个类就有了继承关系,extends前面的类,咱们称之为父类。
extends后面的类,咱们称之为子类。有了继承关系以后,咱们就说子类拥有父类继承下来的全部非私有的成员(包括了属性,方法),可是不包括构造方法 。
extends 关键字用在 class 或 interface 声明中,用于指示所声明的类或接口是其名称后跟有 extends 关键字的类或接口的子类。
-示例-
public class Rectangle extends Polygon{ }
-注释-
在上例中,Rectangle 类继承 Polygon 类的全部 public 和 protected 变量和方法。
Rectangle 类能够重写 Polygon 类的任何非 final 方法。 一个类只能扩展一个其余类。
3.final
解释:最终的,决定性的
用法:修饰符的一种,它能够用来修饰类,方法,属性。当一个属性被修饰成final的以后,这个属性变成了常量,它的值必须在定义的时候初始化,而且后面的代码不能对其进行修改,它的命名应该所有都是大写。当一个方法被修饰成final的以后,这个方法在继承中是不可以被进行覆盖的。当一个类被修饰成final的以后,这个类不能再有子类。
final 关键字能够应用于类,以指示不能扩展该类(不能有子类)。 final 关键字能够应用于方法,以指示不能重写任何子类中的方法。
-示例-
public final class MyFinalClass{ }
public class MyClass{
public final String myFinalMethod() {
<statements> } }
例子:
public final class Math{ private final float PI = 3.1415926;
public final int abs(int i){ return i>=0?i:-I;
} } -注释-
一个类不能同时是 abstract 又是 final。abstract 意味着必须扩展类,final 意味着不能扩展类。
一个方法不能同时是 abstract 又是 final。abstract 意味着必须重写方法,final 意味着不能重写方法。
<1>对于基本类型前加以final修饰,表示被修饰的变量为常数,不能够修改。一个既是static又是final的字段表示只占据一段不能改变的存储空间。
<2>final用于对象应用时,final使应用恒定不变。一旦引用被初始化指向一个对象,就没法再把它指向另外一个对象。
<3>final方法:一是把方法锁定,以防止继承类修改它的含义,二是确保继承中使方法行为保持不变,而且不会被覆盖。类中全部的private方法都隐式地指定为是final。
<4>final参数:对于基本类型的变量,这样作并无什么实际意义,由于基本类型的变量在调用方法时是传值,也就是说你能够在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,觉得对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句的对象变量,当你在方法中不须要改变做为参数的变量时,明确使用final进行声明,会防止你无心的修改而影响到调用方法。
<5>final类:当将某个类的总体定义为final时,就代表了该类不容许被继承。
3.finally
解释:最后,终于,不可更改地
用法:在异常处理机制当中,它的做用就像是人吃饭同样,必须得作的,不论有异常仍是没有异常都要执行的代码就能够放到finally块当中去。finally块,必需要配合try块一块儿使用,不能单独使用,也不能直接和catch块一块儿使用。
finally 关键字用来定义始终在 try-catch-finally 语句中执行的块。finally 块一般包含清理代码,用在部分执行 try 块后恢复正常运行。
-示例- try{
<可能引起异常的块> }
catch (<java.lang.Exception 或子类> e){
<处理异常 e 的代码>
} finally{
<有异常或无异常状况下都执行的语句> } -注释-
开始和结束标记 { 和 } 是 finally 子句语法的一部分,即便该子句只包含一个语句,也不能省略这两个标记。
每一个 try 块都必须至少有一个 catch 或 finally 子句。
若是执行 try 块的任何部分,不管是否出现异常,也不论 try 或 catch 块是否包含 return、continue 或 break 语句,都必定会执行 finally 块中的代码。 若是不出现异常,控件将跳过 try 块,进入 finally 块。 若是在执行 try 块期间出现异常,而且相应的 catch 块包含 break、continue 或 return 语句,控件将首先穿过 finally 块,以后再执行 break、continue 或 return。
五、implements(接口)
用法:用来让一个类实现一个接口的关键字,实现接口的这个类必须实现接口里面全部的方法。
implements 关键字在 class 声明中使用,以指示所声明的类提供了在 implements 关键字后面的名称所指定的接口中所声明的全部方法的实现。
-示例-
public class Truck implements IVehicle{ } -注释-
在上例中,Truck 类必须提供在 IVehicle 接口中所声明的全部方法的实现。
不然,Truck 类将是独立的;它能够声明其余方法和变量,并扩展另外一个类。 一个类能够实现多个接口。
finally
解释:
最后,终于,不可更改地
用法:
在异常处理机制当中,它的做用就像是人吃饭同样,必须得作的,不论有
异常仍是没有异常都要执行的代码就能够放到
块,
必需要配合
try
块一块儿使用,
不能单独使用,也不能直接和
catch
块一块儿使用。
finally
关键字用来定义始终在
try-catch-finally
语句中执行的块。
finally
块一般包含清理代码,用在部分执行
try
块后恢复正常运行。
-
示例
-
try{
<
可能引起异常的块
>
}
catch (<java.lang.Exception
或子类
> e){
<
处理异常
e
的代码
>
六、instanceof
用法:instanceof 关键字用来肯定对象所属的类。
-示例-
if (node instanceof TreeNode){ <statements> } -注释-
在上例中,若是 node 是 TreeNode 类的实例,或者是 TreeNode 的子类的实例,则 instanceof 表达式的值将为 true。
instanceof 一般是用于判断父类或者接口的引用是不是某个子类的实例,例如:
class Animal{}
class Bird extends Animal {} class Dog extends Animal {} Animal a= new Bird();
System.out.println( a instanceof Bird); System.out.println( a instanceof Dog);
七、interface
解释:接口,界面
用法:它本质上是一个类,一个彻底抽象的类,里面没有任何实现的方法。它不是用来继承的,是用来实现的。某个类若是实现了接口就必需要实现接口里面的全部方法。而且接口是不能用来实例化的,它也是不能经过new关键字得到对象。
interface 关键字用来声明新的 Java 接口,接口是方法的集合。 接口是 Java 语言的一项强大功能。任何类均可声明它实现一个或多个接口,这意味着它实现了在这些接口中所定义的全部方法。
-示例-
public interface IPolygon{
public float getArea(); public int getNumberOfSides(); public int getCircumference(); } -注释-
实现了接口的任何类都必须提供在该接口中的全部方法的实现。 一个类能够实现多个接口。
八、static 解释:静态的
用法:修饰符的一种,可以用来修饰属性和方法。须要注意的是被修饰的属性和方法,再也不属于对象全部,而是属于类,意味着,要访问这些属性和方法再也不经过对象而是直接用类名来访问。另外,静态的方法不可以访问非静态属性,非静态的方法可以访问静态的属性。
static 关键字能够应用于内部类(在另外一个类中定义的类)、方法或字段(类的成员变量)。
-示例-
public class MyPublicClass{ public final static int MAX_OBJECTS = 100; static int _numObjects = 0; static class MyStaticClass{ }
static int getNumObjects(){ } } -注释-
一般,static 关键字意味着应用它的实体在声明该实体的类的任何特定实例外部可用。
static(内部)类能够被其余类实例化和引用(即便它是顶级类)。在上面的-示例-中,另外一个类中的代码能够实例化 MyStaticClass 类,方法是用包含它的类名来限定其名称,如 MyClass.MyStaticClass。
static 字段(类的成员变量)在类的全部实例中只存在一次。能够从类的外部调用 static 方法,而不用首先实例化该类。这样的引用始终包括类名做为方法调用的限定符。在上面的示例中,MyClass 类外部的代码以 MyClass.getNumObjects() 的形式调用 getNumObjects() static 方法。
模式:
public final static <type> varName = <value>;
一般用于声明能够在类的外部使用的类常量。在引用这样的类常量时须要用类名加以限定。在上面的-示例-中,另外一个类能够用 MyClass.MAX_OBJECTS 形式来引用 MAX_OBJECTS 常量。
1>一般在一个类中定义一个方法为static,就是说无须本类的对象就能够直接调用。
2>静态变量和静态方法相似。全部此类实例共享此静态变量,也就是说类装载时,只分配一块存储空间,全部此类的对象均可以操控此块存储空间,固然对于final就另当别论了。
3>static定义的变量会优先于任何其余非static变量,不论其出现顺序如何。
4>static{}着是用来显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。
5>在涉及到继承的时候,会先初始化父类的static变量,而后是子类的。
6>一般一个普通类不容许声明为静态的,只有一个内部类才能够。这时这个声明为静态的内部类能够直接做为一个普通类来使用,而不须要实例一个外部类。
九、synchronized
用法:synchronized 关键字能够应用于方法或语句块,并为一次只应由一个线程执行的关键代码段提供保护。当它用来修饰一个方法或者一个代码块的时候,可以保证在同
一时刻最多只有一个线程执行该段代码
-示例-
public class MyClass{
public synchronized static String mySyncStaticMethod(){ }
public synchronized String mySyncMethod(){ } }
public class MyOtherClass{
Object someObj;
public String myMethod(){
<statements>
synchronized (someObj){
<statements affecting someObj> }}}
synchronized 关键字可防止代码的关键代码段一次被多个线程执行。 若是应用于静态方法(如上例中的 MySyncStaticMethod),那么,当该方法一次由一个线程执行时,整个类将被锁定。
若是应用于实例方法(如上例中的 MySyncMethod),那么,当该方法一次由一个线程访问时,该实例将被锁定。
若是应用于对象或数组,当关联的代码块一次由一个线程执行时,对象或数组将被锁定。
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)的一些理解
1、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程获得执行。另外一个线程必须等待当前线程执行完这个代码块之后才能执行该代码块。package ths;
public class Thread1 implements Runnable { public void run() { synchronized(this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
} } }
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");ta.start();
tb.start(); } }
2、当一个线程访问object的一个synchronized(this)同步代码块时,另外一个线程仍然能够访问该object中的非synchronized(this)同步代码块。
3、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另外一个线程仍然能够访问该object中的非synchronized(this)同步代码块。
尤为关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其余线程对object中全部其它synchronized(this)同步代码块的访问将被阻塞。
4、第三个例子一样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就得到了这个object的对象锁。结果,其它线程对该object对象全部同步代码部分的访问都被暂时阻塞。
十、transient
用法:transient 关键字能够应用于类的成员变量,以便指出该成员变量不该 在包含它的类实例已序列化时被序列化。
-示例-
public class MyClass{
private transient String password; }
java语言的关键字,变量修饰符,若是用transient声明一个实例变量,当对象存储时,它的值不须要维持。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,咱们不想
用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,能够在这个域前加上关键字transient。
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
十一、volatile
用法:volatile 关键字用于表示能够被多个线程异步修改的成员变量。
注意:volatile 关键字在许多 Java 虚拟机中都没有实现。 -示例-
public class MyClass{
volatile int sharedValue; } -注释-
volatile 的目标用途是为了确保全部线程所看到的指定变量的值都是相同的。
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。并且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任什么时候刻,两个不一样的线程老是看到某个成员变量的同一个值。Java语言规范中指出:为了得到最佳速度,容许线程保存共享成员变量的私有拷贝,并且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必需要注意到要让线程及时的获得共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,没必要使用。
因为使用volatile屏蔽掉了VM中必要的代码优化,因此在效率上比较低,所以必定在必要时才使用此关键字。
finally
解释:
最后,终于,不可更改地
用法:
在异常处理机制当中,它的做用就像是人吃饭同样,必须得作的,不论有
异常仍是没有异常都要执行的代码就能够放到
块,
必需要配合
try
块一块儿使用,
不能单独使用,也不能直接和
catch
块一块儿使用。
finally
关键字用来定义始终在
try-catch-finally
语句中执行的块。
finally
块一般包含清理代码,用在部分执行
try
块后恢复正常运行。
-
示例
-
try{
<
可能引起异常的块
>
}
catch (<java.lang.Exception
或子类
> e){
<
处理异常
e
的代码
>
finally
解释:
最后,终于,不可更改地
用法:
在异常处理机制当中,它的做用就像是人吃饭同样,必须得作的,不论有
异常仍是没有异常都要执行的代码就能够放到
块,
必需要配合
try
块一块儿使用,
不能单独使用,也不能直接和
catch
块一块儿使用。
finally
关键字用来定义始终在
try-catch-finally
语句中执行的块。
finally
块一般包含清理代码,用在部分执行
try
块后恢复正常运行。
-
示例
-
try{
<
可能引起异常的块
>
}
catch (<java.lang.Exception
或子类
> e){
<
处理异常
e
的代码
>