Java中的修饰符

来源:互联网 发布:php蜘蛛强制劫持跳转 编辑:程序博客网 时间:2024/05/21 07:56

Java语言主要提供了两类修饰符:访问修饰符和非访问修饰符.

访问修饰符:

Java中,访问修饰符可以用来控制对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限:

  • private(当前类访问权限),使用了private的成员只能在该类中被访问
  • default(包访问权限),如果类里的成员(成员变量,方法,构造器)或者一个外部类不被任何访问修饰符修饰,那就是包访问权限,只能被相同包下的类访问
  • protected(子类访问权限),既可以被同一个包下的类访问,也可以被不同包下的子类访问.通常用于希望子类重写该方法
  • public(公共访问权限),可以被所有类访问

非访问修饰符:

  • final:用来修饰类、方法和变量.final修饰的类不能被继承;修饰的方法不能被继承类重写;修饰的变量为常量,不能被修改的
  • static:用来创建类方法和类变量.static关键字的作用是把类的成员变成类相关
  • abstract:用来创建抽象类和抽象方法.抽象方法通常用于继承

类可用的修饰符

类主要由成员变量、方法、初始化块、构造器构成.
类可用的修饰符:public、default;final、abstract.

  • private表示可以被该类中访问。所以类使用private是没有意义的
  • final修饰的类不能被子类继承,即不能有子类;abstract修饰的类是抽象类,抽象类不能创建实例,只有被继承重写其中的抽象方法才有意义。所以final不能和abstract同时修饰类
  • 类的上一级程序单元是包,所以不能使用static

成员变量可用的修饰符

成员变量可用的修饰符:public、default、protected、private;static、final

  • private修饰的成员变量在子类中不可见,即使是使用super也不可以访问。多态中调用的成员变量只能是父类中的成员变量,即变量没有多态
  • static修饰的变量是静态变量,也叫做类变量。类变量与类相关,在类初始化时就被初始化创建;可以通过类名调用。当然也可以通过实例调用(不推荐),但是返回的都是同一个变量:不同的实例都是调用的同一个变量。
  • final修饰的变量,一旦赋值,将不会被改变。

在类中变量分为成员变量(实例变量、静态变量)和局部变量。不止是作用域不同,在初始化时它们也有很大的区别:

  • 成员变量在初始化时系统会指定默认值,所以final修饰的成员变量只能在声明时、初始化块或者构造器中显示指定初始值。否则不能在再改变成员变量的值
  • 局部变量在初始化时系统不会指定初始值,所以final修饰的局部变量,在声明时可以不指定默认值,但是当第一次赋值后,不能再改变。

方法中可用的修饰符

方法可用的修饰符:public、default、protected、private;static、final、abstract。

  • private修饰的方法在子类中是不可见的,即使是使用super也不可以访问。所以在子类即使有与父类相同的方法,也不是重写,而是完全不同的两个方法。
  • static修饰的方法是静态方法,也叫做类方法。类方法与类相关,可以通过类调用。在静态方法中不能调用非静态方法,因为当静态方法存在时,非静态还不一定存在。
  • 因为this关键字表示对象,所以在static修饰的方法中不能使用this关键字。
  • final修饰的方法可以被子类调用,但是不能重写.因此final不能与abstract同时修饰方法.
  • abstract修饰的方法是抽象方法.有抽象方法的类一定是抽象类,抽象方法没有方法实例化,只能在子类中重写才有意义.所以abstract不能和private、final、static一起修饰方法。

“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”–《Java编程思想》

static不能和abstract同时修饰方法。两个原因:


  1. static修饰的方法只能通过类调用,abstract修饰方法是抽象方法,不能拥有方法体,即没有后面的花括号.所以当该抽象方法所在的类调用该抽象方法时,会处于没有方法实现的尴尬处境.
  2. static修饰的静态方法在子类中不能被重写,而abstract修饰的抽象方法只有被子类重写才有意义.
    所以static不能和abstract同时修饰方法.

重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。因为静态是类的方法,所以它们在编译阶段就使用编译出来的类型进行绑定。使用对象引用来访问静态方法只是Java设计者给程序员的自由。我们应该直接使用类名来访问静态方法,而不要使用对象引用来访问.

初始化块可用的修饰符

初始化块可用的修饰符:ststatic。
初始化块的修饰符只能是static,使用static修饰的初始化块称为静态初始化块(也称为类初始化块)。静态初始化块是类相关的,系统在类初始化阶段执行静态初始化块,而不是在创建对象是才执行,因此静态初始化块总比普通初始化块先执行。一个类里可以定义多个初始化块,执行顺序与定义顺序相同。
静态初始化块也属于类的静态成员,同样也遵循静态成员不能访问非静态成员(包括Field 和method)的规则。

构造器可用的修饰符

构造器可用的修饰符:public、default、protected、private。
- 构造器不能被继承,而final修饰方法是为了保证该方法不会被子类重写,所以final是没有意义的。
- 同理,一个抽象的构造器将永远不会被实现,所以abstract不能修饰构造器。
- 构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。
- private修饰的构造器只能在类里被调用,常常用于设计模式。

接口中的修饰符

定义接口时可用的修饰符只有public和省略
接口中可用的修饰符: public,static,final,default
在接口中可以包含成员变量(只能是静态常量)、方法(只能是抽象实例方法、类方法和默认方法)、内部类(包括内部接口、枚举)

  • 在接口里所有成员都使用public访问修饰符
  • 在接口里成员变量只能是静态变量,所以系统会默认为成员变量添加public static final修饰符,也就是说在定义变量时,不管是否使用这三个修饰符,系统都会默认使用.因为接口里没有初始化块和构造器,所以接口里定义的成员变量在定义时就需要指定默认值.
  • 抽象方法默认被public abstract修饰。接口里的抽象方法不能有方法体
  • 默认方法必须用default修饰.不能用static修饰,且总是被public修饰.接口中的默认方法不能直接使用接口来调用,且接口不能实例化,所以默认方法只能被接口的实现类的实例来调用
  • 类方法默认被public static修饰,类方法可以被接口调用
  • 内部类、内部接口、内部枚举默认被public static修饰

枚举类中的修饰符

枚举类是一种特殊的类,用关键字enum定义,与普通类相比枚举类有如下特点:

  • 枚举类默认继承了java.lang.Enum类,而不是Object类,所以枚举类不能再继承其他类
  • 非抽象枚举类默认使用final修饰符修饰,所以枚举类不能派生子类
  • 枚举类的构造器只能使用private修饰符.省略修饰符,系统会默认添加private
  • 枚举类的所有实例必须在枚举类第一行显式列出,否则枚举类永远都不能产生实例,系统会默认为所有实例添加public static final修饰符,无需显式添加
原创粉丝点击