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虚拟机加载类时,便会执行静态代码块,如果类里有多个静态代码块,则按照出现的顺序依次执行,且只执行一次。静态代码块和静态方法一样,不能直接访问类的实例变量和实例方法,而必须通过实例的引用来访问它们。