Java中常用的修饰符(abstract,static,final)
1、abstract
1. abstract既可以修饰类(抽象类),又可以修饰方法(抽象方法)
- abstract修饰类时,表示该类为抽象类,所谓抽象类就是指该类只是一个抽象的概念,不对应显示中的具体实例,所以abstract类不能实例化(例如,动物Animal是一个抽象类,他不能特制某一个具体的动物实体(例如狗,猫…)它只是所有动物抽象出来的一个概念)
- abstract修饰的类只能被继承(例如,狗和猫等都继承自Animal类)
- 被Abstract修饰的抽象方法(有abstract修饰的,方法体为空的方法)必须定义在抽象类中
- 抽象类中的方法不一定都是抽象方法(例如get和set方法)
- 抽象类的子类必须重写父类的抽象方法,除非子类也是抽象类(如果子类也是抽象类则可以不必实现父类抽象方法)
- 当父类的抽象类中没有抽象方法时,子类直接继承不用做任何操作。
常见的不能被继承的类有:
String StringBuffer Scanner
2、final:
final关键字既可以修饰方法,又可以修饰类还可以修饰属性
- final修饰的类称为常量类,不能被继承。可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生。
- final修饰的方法不能被子类重写
- final修饰属性(变量),表示此属性为常量
JAVA利用final定义常量(注意在JAVA命名规范中常量需要全部字母都大写):
Final int AGE=10;
常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。
对基本类型来说是其值不可变,而对对象属性来说其引用不可再变。
3、static修饰类、属性和方法
java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。
-
在static方法中不能调用对象的属性和方法(因为对象的属性和方法在直接调用时还没有初始化,但static修饰的属性和方法不需要初始化)
-
static修饰的方法是静态方法(同静态代码块一样)是在类加载时就已经完成了初始化(甚至执行),而类的非静态属性和方法的 初始化是在对象分配内存、初始化零值以及设置对象头之后才执行的。
-
对象的方法可以调用static修饰的属性和方法
注意:被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类:
public class OuterClass {
public static class InnerClass{
InnerClass(){
System.out.println("============= 我是一个内部类'InnerClass' =============");
}
}
}
public class TestStaticClass {
public static void main(String[] args) {
// 不需要new一个InnerClass
new OuterClass.InnerClass();
}
}
当一个内部类没有使用static修饰的时候,是不能直接使用内部类创建对象,须要先使用外部类对象点new内部类对象及(外部类对象.new 内部类())
public class OuterClass {
public class InnerClass{
InnerClass(){
System.out.println("============= 我是一个内部类'InnerClass' =============");
}
}
}
public class TestStaticClass {
public static void main(String[] args) {
// OutClass需要先生成一个实例,然后再new一个InnerClass();
OuterClass oc = new OuterClass();
oc.new InnerClass();
}
}
注意:如果内部类没事有使用static 修饰,是不能创建实例否则会报错
public class SyncDubbo2 {
static class Main {
public int i = 10;
public synchronized void operationSup(){
try {
i--;
System.out.println("Main print i = " + i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Sub extends Main { //没有使用static修饰的内部类不能直接创建对象
public synchronized void operationSub(){
try {
while(i > 0) {
i--;
System.out.println("Sub print i = " + i);
Thread.sleep(100);
this.operationSup();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
Sub sub = new Sub(); //此处内部类没用static修饰会报错误The value of the local variable sub is not used
//没有使用static修饰的内部类不能直接创建对象
} }); t1.start(); } }