之前我们不止一次在语法中写到修饰符,但是之前因为没有介绍,所以每次涉及到修饰符时基本都是不写或者用static。
final
修饰符final 最终的,不可修改的
可以修饰:变量、属性、方法、类。
修饰变量
用final修饰变量只能赋值一次,之后不可以再次赋值,即用final修饰的变量值不可以被修改,因此用final修饰的变量也叫常量。
语法:final 数据类型 变量名;
修饰属性
属性也是变量的一种,属性也叫成员变量。属性用final修饰之后也只能复制一次,即属性初始化之后不可被修改。
语法:访问权限修饰符 final属性名 = 值;
由于创建对象时会给属性赋默认值,但是final修饰的属性名只能赋值一次,所以如果jvm给属性赋默认值之后我们将无法再修改,因此在创建对象时需要我们手动赋值,可以在声明属性的同时赋值,也可以在构造函数中赋值,但必须赋值。
修饰方法
final修饰的方法不能被重写。
语法: 访问权限修饰符 final 返回值类型 方法名(形参列表){
方法体
}
修饰类
final修饰的类不可被继承
语法: 访问权限修饰符 final class 类名{ }
abstract
修饰符abstract代表抽象的,不可描述的。可以用来修饰方法或类。
修饰方法
abstract修饰的方法称为抽象方法,抽象方法没有方法体,需要重写才能执行。
而且抽象方法必须放在抽象类中,所以有抽象方法的类一定是抽象类。
修饰类
abstract修饰的类称为抽象类,抽象类不能直接创建对象,需要子类继承于它,创建子类对象。
继承抽象类时必须重写抽象类中所有的抽象方法或继承后的子类也是抽象类。
static
修饰符static代表静态的,公共的。可以修饰内部类,方法,代码块,属性。static修饰内部类后成为静态内部类,后面在介绍内部类的时候介绍
修饰属性
用static修饰的属性称为静态属性,静态属性由该类的所有对象所共有,一个对象修改这个属性的值,所有的对象对应的属性值都会发生变化。
静态属性的调用可以通过对象名.属性名调用,也可以通过类名.属性名调用。
语法:访问权限修饰符 static 数据类型 属性名;
修饰代码块
用static修饰的代码块称为静态代码块,只能放在类中方法外,在这个类加载的时候会执行静态代码块中的内容。
修饰方法
用static修饰的方法称为静态方法,静态方法也可以像静态属性那样直接用类名.方法名调用。
在静态方法中,可以使用静态属性、调用静态方法,但是静态方法中不能直接使用非静态属性,不能直接调用非静态方法,因为在静态方法中,不能使用this和super关键字。
代码块
用{}包裹的一串代码称为代码块,代码块分为局部代码块,构造代码块,静态代码块,同步代码块,这里简单介绍一些前三个。
局部代码块
局部代码块主要定义在类中方法中,语法就是一对大括号,其唯一作用就是限制局部变量的作用域,初次之外没有任何作用
public class Test{
public static void main(String[] args){
int i = 0;
{
System.out.println(i)
//变量i的作用域是整个main函数中。
//在这个代码块中定义的局部变量只能在当前代码块中使用
String str = "代码块内部的变量";
}
//在此处就不可以再次使用变量str了
}
}
构造代码块
构造代码块又叫实例代码块。
构造代码块的语法与局部代码块一致,用一对大括号包裹,只是定义的位置在类中方法外。
一个类每调用一次构造函数,都会执行一次实例代码块中的内容,不管这个构造函数是无参构造、有参构造还是全参构造,而且其执行顺序是在属性赋初始值之后,调用构造函数之前。
静态代码块
用static修饰的代码块就是静态代码块,定义位置在类中方法外。
一个类在加载的时候回执行一次静态代码块中的内容,所以程序运行过程中,静态代码块只会执行一次。
public class Test{
//静态属性
private static int num;
static{
//静态代码块
}
{
//构造代码块
}
public Test(){
//构造函数
}
public static void method(){
//静态方法
}
public void method2(){
{
//局部代码块
}
}
}
执行顺序
- 属性
- 静态代码块
- 构造代码块
- 构造函数