java修饰符
- 1. 修饰符
- 2. 访问控制修饰符
- 3. abstract修饰符
- 4. final修饰符
- 4.1 final类
- 4.2 final方法
- 4.3 final变量
- 5. static修饰符
- 5.1 static变量
- 5.2 static方法
- 5.2.1 静态方法可访问的内容
- 5.2.2 静态方法必须被实现
- 5.2.3 static代码块
1. 修饰符
修饰符 | 类 | 成员方法 | 构造方法 | 成员变量 | 局部变量 |
abstract(抽象的) | √ | √ | × | × | × |
static(静态的) | × | √ | × | √ | × |
public(公共的) | √ | √ | √ | √ | × |
protected(受保护的) | × | √ | √ | √ | × |
private(私有的) | × | √ | √ | √ | × |
synchronized(同步的) | × | √ | × | × | × |
native(本地的) | × | √ | × | × | × |
transient(暂时的) | × | × | × | √ | × |
volatile(易失的) | × | × | × | √ | × |
final(不可改变的) | √ | √ | × | √ | √ |
2. 访问控制修饰符
面向对象的基本思想之一是封装实现细节并且公开接口。java中是通过访问控制修饰符来控制类、类的方法、类的属性的访问权限,以达到只暴露接口,隐藏实现细节的目的。
访问控制修饰符分为4种级别:
访问控制修饰符 | 访问级别 | 同类 | 同包 | 子类 | 不同的包 |
Public | 公开 | √ | √ | √ | √ |
Protected | 受保护 | √ | √ | √ | × |
Default(一般不写) | 默认 | √ | √ | × | × |
Private | 私有的 | √ | × | × | × |
类只能用public或者default修饰,局部变量只能在方法内部被访问,不能用public、default、private、protected修饰。
3. abstract修饰符
abstract可以修饰类和成员方法:
- 用abstract修饰的类表示抽象类,抽象类不能被实例化,没有用abstract修饰的类为具体类,可以被实例化。
- 用abstract修饰的方法表示抽象方法,抽象方法没有方法体。没用abstract修饰的方法称为具体方法,具有方法体。
使用abstract修饰符需要遵守下列语法规则:
- 抽象类中可以没有抽象方法,但包含了抽象方法的类里一定得是抽象类。如果子类没有实现父类的所有抽象方法,子类也必须定义为抽象类,否则编译出错
- 没有抽象静态方法,static和abstract是不可以共存的,因为静态方法是可以直接通过类名调用的,抽象方法是没有方法体的,所以静态抽象方法没有存在的意义。但抽象类里可以有静态方法
- 抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法。抽象类不能被实例化,但可以创建一个抽象类的引用变量,指向非抽象的子类对象。
- 抽象类及抽象方法不能被final修饰。因为抽象类只有创建子类,抽象方法才能被实现。而final修饰的类不允许有子类,用final修饰的方法不允许被子类覆盖。
- 抽象方法不能被private修饰。理由同上。
4. final修饰符
final可以修饰非抽象类、非抽象成员方法和变量:final类不能被继承;final方法不能被子类方法覆盖;final变量表示常量,只能被赋一次值。final不能修饰构造方法,因为“方法覆盖”只适用于类的成员方法,父类的构造方法和子类构造方法不存在覆盖关系。private类型的方法默认是final类型的。
4.1 final类
java里的String类就是final类
4.2 final方法
java.lang.Object类的getClass()方法就是final方法
4.3 final变量
- final可以修饰静态变量、成员变量和局部变量
- 类的成员变量可以不用显式初始化,但final成员变量必须显式初始化或者在构造方法中初始化。final类型静态变量可以在定义的时候初始化或者在静态代码块里初始化。
public class Sample{
final int var1;//编译报错
final static int var2;//编译报错
final int var3;//编译通过
Sample()
{
var3=8;
}
final static int var4;//编译通过
static{
var4=9;
}
int var4;//合法,初始化值为0
static int var5;//合法,初始化值为0
}
- final变量只允许被赋值一次,否则编译报错
- 如果将引用类型的变量用final修饰,那么该变量始终只能引用一个对象,但是可以改变对象的内容
public class Test332 {
public int var;
public Test332(int x)
{
this.var=x;
}
public static void main(String[] args)
{
final Test332 test=new Test332(3);//合法
test.var=2;//合法
test=new Test332(5);//编译报错
}
}
5. static修饰符
static修饰符可以修饰成员变量、成员方法和代码块。静态成员变量和静态成员方法都是归某个类所有,而不依赖类的特定实例,被所有实例共享。静态代码块在java虚拟机加载类时,就会执行该代码块,且只执行一次。
5.1 static变量
类的成员变量有两种:一种被static修饰,叫类变量,或者静态变量;一种是没有被static修饰的变量,叫实例变量。在类的内部,可以在任何地方内直接访问静态变量;在其他类中则可以通过类名访问静态变量。如果类的所有实例都包含一个相同的常量属性,就可以把这个属性定义为静态常量类型,可以节省内存空间。
5.2 static方法
成员方法分为静态方法和实例方法。
5.2.1 静态方法可访问的内容
静态方法不需要通过类的实例即可调用,因此在静态方法里不能使用this关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态实例和静态方法。因为Java虚拟机在执行静态方法时,能顺利从该类的方法区找到静态变量,但却无法在方法区找到实例变量,实例变量都存放在堆区。如果静态方法中一定要访问某个对象实例的成员变量,则可以通过该对象的引用来访问该实例变量,。静态方法中也不能使用super关键字,因为super和this一样,都是和类的特定实例相关。
5.2.2 静态方法必须被实现
static和abstract是不可以共存的。作为程序入口的main()方法就是静态方法,这样可以使得Java虚拟机只要加载了main()方法所在的类,就会执行main方法,而不用去创建这个类的实例。
5.2.3 static代码块
java虚拟机加载类时,便会执行静态代码块,如果类里有多个静态代码块,则按照出现的顺序依次执行,且只执行一次。静态代码块和静态方法一样,不能直接访问类的实例变量和实例方法,而必须通过实例的引用来访问它们。