本篇是Java关键字的一个小总结
static,final,abstract,extends,throw,throws,volatile等
Static
static翻译为静态的
可以修饰①类②变量③方法④导入一个包⑤代码块
静态内部类
在java中如果一个类被声明为静态的,那么只有一种情况,即这个类是内部类,外部类不能被声明为静态的。
- 静态内部类只能访问静态的成员变量和方法,不能访问非静态的方法和属性。
- 静态内部类可以声明普通成员和方法,而普通内部类不能声明静态成员和方法。
- 静态内部类可以单独初始化。
静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建的时候会考虑采用静态内部类的设计。
静态变量和方法
当一个变量或方法被static修饰的时候,那么这个变量或方法是属于这个类的,相当于这个类的一部分。
修改这个变量将会影响所有引用它的地方
导包
import static java.lang.Math.*;
那么当我们用Math下的所有函数是时可以直接使用,而不用去Math.max()来调用这个max静态方法。
例如
int max = max(1, 2);
静态代码块
static{
//write code..
}
静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
final
final意为最终的,不可修改的。
用来修饰数据
包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化。对于static类型变量在这个阶段会为其赋值为默认值,比如public static int v=5,在这个阶段会为其赋值为v=0。而对于static final类型的变量,比如public static final int v=5,在这个阶段会为其赋值为v=5在准备阶段就会被赋值为正确的值
public class FinalTest {
/* ... */
public void finalFunc(final int i, final Value value) {
// i = 5; 不能改变i的值
// v = new Value(); 不能改变v的值
value.v = 5; // 可以改变引用对象的值
}
}
用来修饰方法参数
表示在变量的生存期中它的值不能被改变;
修饰方法
表示该方法无法被重写;
修饰类
表示该类无法被继承。
abstract
abstract可以修饰类和方法
abstract类
-
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
abstract方法
- 抽象方法只包含一个方法名,而没有方法体。抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
- 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。
extends
这个关键字大家都非常了解了,这里想表达的一点是接口也可以被继承,第一反应肯定是接口怎么能被继承呢?
但是接口确实是可以被接口继承的。
throw和throws
throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。用在方法声明后面,跟的是异常类名,可以跟多个异常类名,用逗号隔开,表示抛出异常,由该方法的调用者来处理,throws表示出现异常的一种可能性,并不一定会发生这些异常。
throw:则是用来抛出一个具体的异常类型。用在方法体内,跟的是异常对象名,只能抛出一个异常对象名,表示抛出异常,由方法体内的语句处理,throw则是抛出了异常,执行throw则一定抛出了某种异常。
public static void throwChecked(int a) throws Exception{
if (a > 0){
//自行抛出Exception异常
//该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}