文章目录

  • 简介
  • 访问修饰符
  • 类的访问修饰符
  • 接口的访问修饰符
  • 非访问修饰符
  • 类的非访问修饰符
  • 接口的访问修饰符


简介

Java关键字:java关键字是对Java编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、方法、类特性等信息。其中就包含了访问控制符(public、default、protect、private)和非访问控制符(static、、final、abstract)。本文主要讲java常用的7种修饰符

访问修饰符

类的访问修饰符

java 最终的修饰符 java常用的修饰符_构造函数


注意,即便是public 定义的变量,也不能当做全局变量被其他不同包,不同类的方法使用

可以通过以下方法访问不同包的不同类的公共变量

  1. new 一个其他类的对象出来,调用该类的公共变量(public)
  2. 把其他类的变量设置为public static,即静态公共变量,直接用类名.变量名获取。但是这个方法最好只用于基础数据变量,否则会造成内存泄漏。

如下:

java 最终的修饰符 java常用的修饰符_接口_02


java 最终的修饰符 java常用的修饰符_构造函数_03


可以看出,当你在不同包不同类中调用其他类变量时,变量的权限必须是public,否则即便生成了实例对象,也调用不了。

接口的访问修饰符

  1. 接口本身的默认访问权限(default)和其他类并无区别,都是只能被包内其他类访问,并不是那些人所说的public。
  2. 只有在接口前写上public 接口才能被任意包的类使用
  3. 接口中的方法都是public权限,包括默认方法(默认方法中的default 只是表明该方法为默认方法,没有default的方法是抽象方法)

非访问修饰符

类的非访问修饰符

java 最终的修饰符 java常用的修饰符_接口_04


注意:

  1. static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
  2. static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
  3. static只能修饰内部类,而不能修饰普通类,被修饰的内部类可以直接new OuterClass.InnerClass();不需要先实例化外部类,然后通过外部类对象再实例化内部类。
  4. final 修饰符通常和 static 修饰符一起使用来创建类常量
  5. final用来修改对象的引用,则引用的对象的地址不能发生变化 ,但是该对象的属性可以发生变化
  6. 如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。
  7. 抽象方法不能被声明成 final 和 static。

Q:final修饰的属性变量为什么必须在定义的时候或者构造函数中被初始化呢?
A:final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。因此final修饰的成员变量只能在声明时赋值||在构造函数中显式赋值,final修饰的局部变量在使用前赋值即可
Q:构造函数为什么不能被static、final、abstract修饰?
A:
引用:为什么java构造函数不能被static,final,abstract修饰

  • static修饰函数时,可以说函数是属于类而不是属于一个具体的对象。而每个对象被创建时构造函数都会被调用,所以一个static的构造函数是没有用的。
    另一个问题是,子类不能访问static函数。而子类的对象被创建时,父类的构造函数会被自动调用。所以构造函数不能用static修饰。
    如果用static修饰构造函数,编译器会报modifier static not allowed的错误。
  • java中,构造函数是不能被继承的,也不能被重写。final修饰函数的主要目的是避免函数被重写。构造函数内在地具有不能被重写的特性,所以没必要用final修饰。
    如果用fianl修饰构造函数,编译器会报modifier final not allowed的错误。
  • abstract修饰函数时,这个函数应当在子类中被实现。然而,在new被使用时,构造函数会被自动调用,因此必须要有一个函数体(而abstract函数没有函数体)。此外,构造函数不能被重写,因此也不可能在子类中被实现。

接口的访问修饰符

final:
接口存在的意义就是被实现的,同样抽象类存在的意义就是被继承的,和final的“不可被继承”相违背,所以接口和抽象类不可以用final修饰
abstract:接口中本来就有抽象方法,不需要用
static:没听说过。