标签:占用 可见 维护 nts tab 先后 div 优先级 线程间通信
文章出处http://www.cnblogs.com/IUbanana/p/7116520.html
关键字:
(1)性质不同
(2)作用不同
定义类:无法被继承,这也就意味着此类在一个继承树中是一个叶子类;类成员是不是final都可以。
(1)使用位置不同
(2)内容不同
(3)作用不同
总结:函数调用时,如果需要向上层抛出异常,就必须在函数头部显式地声明(throws Exception1, Exception2)异常类型;如果仅需要在方法体内部处理异常,方法体内部可自行处理该异常,thorw抛出具体的异常实例(catch(Exception1 e){...})。
static关键字可用来修饰属性、方法、代码块,目的是把对象相关的变成类相关的,即:不加static的成员是对象相关的,归单个对象所有;加static修饰的成员是类成员,可以通过类名直接调用,归所有对象所有。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
(1)static修饰属性(类变量、静态变量)
所以一般在需要实现以下两个功能时使用静态变量:
1).在对象之间共享值时;2).方便访问变量时
(2)static修饰方法(静态方法)
Java中main方法必须为static的原因:
在类加载时无法创建对象,而静态方法可以不通过对象调用,所以在类加载时可以通过main方法入口运行程序。
(3)static修饰代码块(初始化块、静态代码块)
格式: static{...}
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
初始化总结(静态变量->实例变量->按声明初始化->执行构造方法)
1) 首次使用某个类时,JVM查找相应的类文件并加载(Java只有在必要时才会逐步载入相应的类文件)
首先为所有的静态变量分配存储空间并初始化为默认值(全局变量),然后按照声明静态变量时指定的初始化动作的顺序,以及静态初始化块中的语句在类定义中出现的顺序依次执行。这些静态的初始化动作只会在其所属类的类文件加载时执行一次。
2)类文件加载完毕后,如果需要创建类的对象,则进行如下初始化动作
JVM为所有的实例变量分配足够的存储空间并初始化为默认值(局部变量);然后按声明实例变量时指定初值的初始化动作和实例初始化块中的语句在类中出现的顺序依次执行,之后再调用相应的构造方法。
stract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,区别:
Abstract class | Interface | |
实例化 | 不能 | 不能 |
类 | 抽象类一般只能作为其他类的基类。一个类只能有一重继承关系。 | 一个类可以实现多个interface |
数据成员 | 可有私有的,默认是friendly 型,其值可以在子类中重新定义,也可以重新赋值,可以非abstract | 不可有私有的,默认是public static final 型,且必须赋初值,实现类中不能重新定义,不能改变其值。 |
方法成员 | 可以私有的,可以有非abstract方法,必须实现 | 不可有私有的,默认是public,abstract 类型 |
设计理念 | 表示的是“is-a”关系 | 表示的是“like-a”关系 |
实现 | 需要继承,要用extends | 需要实现,用implements |
抽象类(Abstract Class):
(1)只能作为其他类的基类,不能被实例化(new);
(2)抽象类中的成员是不是abstract无所谓,并不是必须的。(可以有抽象成员,也可以没有任何抽象成员)
(3)抽象类不能同时是final的。抽象的总是希望被继承,而final类不可被继承。final和abstract不可同时存在。
(4)非抽象类继承抽象类,必须覆盖其所有的抽象成员。抽象类继承抽象类,可以不覆盖所有的抽象成员。
(5)抽象类允许被声明
接口(interface):
接口的本质是一种特殊的抽象类,用来描述系统对外提供的所有服务。
(1)接口中,所有方法都是公开、抽象的:public abstract。(都必须被继承)
(2)接口中,所有属性都是公开、静态、常量:public static final,且必须赋初值。(所有实现类共享且不可改变)
接口总是希望被实现被访问的,因此所有成员都必须是公开的(public),确保外界可以访问。接口仅仅描述系统可以做什么,但不指明如何去做,具体操作由实现类完成,因此方法都是abstract的,都必须被继承;接口不涉及任何的实现细节,因此无构造方法,接口不能被实例化;无变量,只有静态常量(static final),因为要被所有的实现类共享;类的继承只能单继承,但是接口可以一次实现多个,用“,”隔开。
super:
super可以理解为是指向自己父类对象的一个指针,指的是离自己最近的一个父类。
用法:
this:
this可以理解为指向当前对象自身的一个指针,即当前正在执行本方法的那个对象实例。位于函数体内部。
用法:
引用构造函数时:
this和super都无需声明。
(1)作用范围:volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别;
(2)volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
(3)volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
(4)volatile只能在线程内存和主内存之间同步一个变量的值,而synchronized则同步在线程内存和主内存之间的所有变量的值,通过锁住和释放监听器来实现。
(5)volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
(6)显然,synchronized在性能上将比volatile更加有所消耗
(7)volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
详细的 synchronize 和 volatile用法介绍请见博文:Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集) 第二节【二、线程同步】
标签:占用 可见 维护 nts tab 先后 div 优先级 线程间通信
原文地址:http://www.cnblogs.com/111testing/p/7124467.html