Java三大修饰符
1、static静态的
静态成员 = 静态属性+静态方法
- 修饰属性
:被 static 修饰的属性称为 静态属性、静态变量、类变量,全类共有
语法:static 与访问权限修饰符的顺序无要求,都要在 数据类型之前
class 类型{
static 数据类型 属性名;
}
语法:对象.类变量
类名.类变量 —推荐使用 更符合类变量的特性
静态变量/静态属性/类变量是 依赖于类的变量,和创建多少对象没有关系,被每一个对象共享。
实例属性:属性的值跟随着对象走,每一个对象的这个属性值是不一样的
静态类属性:用来描述整个类的特征的
static 属性和实例属性的差别:
static 属性在整个类中只有一份值,实例属性有多少个对象就有多少个值;
static 属性在类加载的时候被实例化,实例属性在生成对象的时候被实例化;
对静态属性的访问,直接通过类名去访问。
- 修饰方法
:静态方法,静态方法中不能直接访问非静态的方法和属性
静态方法只能被静态方法覆盖,并且没有多态
静态的方法或者属性不依赖于对象:类名.方法名(属性名直接访问)
静态方法中不能使用 this 和 super 关键字
父类中的静态方法可以被子类继承 子类类名.父类静态方法名(实参);
- 修饰静态代码块
:在类加载下执行 定义在类以内,方法以外,被 static 修饰的
static{
可执行代码:给静态属性赋值,声明局部变量,打印内容,调用静态方法…
}
作用:在一个类进行类加载时,会按照静态初始化代码块的声明顺序,依次执行里面
类加载:JVM第一次使用一个类的时候,通过classPath(类路径)找到所需要的 类对应的 .class 文件,
读取并获取类对应信息(包名、类名、属性、构造方法、成员方法、父类等信息),将类的信息保存到JVM内存中,
一个类类加载进行一次。
-
第一次使用一个类:
a. 第一次调用类中静态成员(静态属性和静态方法) b. 第一次创建一个类的对象:先进行类加载,再完成对象的创建 c. 子类类加载 会 先 导致其父类进行类加载 注意:只是声明引用,不会导致类加载
2、final最终的
- 修饰变量
:变量包含:局部变量 成员(实例)变量 (静态)类变量
final修饰的变量,具有不可变性,也被成为常量:
不可变性:只可以被赋值一次
a.final修饰八种基本数据类型时,只能被赋值一次,值不可变
b.final修饰引用类型的变量时,只能被赋值一次,地址不可改,对象中的内容可改常量(值不可以改变,只能赋值一次),
修饰属性时,要么直接给初始值,或者在构造方法中赋值
- 修饰方法:
final修饰的方法,被称为最终的方法,可以重载(依然遵循方法重载的语法要求),可以被继承 但不可以被 覆盖
- 修饰类
:final修饰的类,被称为最终类(断子绝孙类) 不能被继承
3、abstract:抽象的
- 修饰类
:
语法: abstract class 类名{
}
抽象类类名 引用名 = new 子类类名(形参);强制使用多态
抽象类在编译过后也会生成.class文件
有构造方法,但是不能创建对象
抽象类可以有属性 也可以有普通的非抽象方法
抽象类可以被继承 但是其子类必须实现它所有的抽象方法,否则其子类仍然是一个抽象类
- 修饰方法
:
语法:
修饰符 abstract 返回值类型 方法名();
抽象方法,只有声明,没有实现public abstract void m1();
访问权限修饰符 和 其他修饰符 都是修饰符所以没有顺序要求,但是都要写在方法的返回值类型之前
在子类中重写抽象方法时,和重写普通成员方法的语法要求是一致的
注意:
①抽象类中可以没有抽象方法
②如果一个类中有抽象方法,那么他必须是抽象类
③如果一个类继承了抽象类,但不想成为抽象类,那么这个类必须实现抽象类中的所有抽象方法
总结
:
-
(1) abstract 、static 、final 可以修饰哪些内容?
abstract: 可以修饰类、方法 static:可以修饰属性、方法、静态代码块 final:可以修饰 变量(局部变量、实例变量、静态变 量)、方法、类
-
(2) abstract 、static 、final 都不能用于修饰构造方 法。
① abstract:抽象方法只能有方法的声明,没有方法实 现,实现部分让子类完成; 但是构造方法是不能被子类继承,如果构 造方法被 abstract修饰,则子类无法完成构造方法的实现内 容。 ② static:static 和对象没有关系,但是构造方法是 用于创建对象的,相互矛盾; 同时static修饰的方法可以直接通过 类名.静态方法名(实参);但是构造方法不允许手动调 用。 ③ final:final方法是约束子类不能覆盖,但是构造方 法本身就不允许子类继承,谈不上覆盖。
-
(3) private、abstract、static、final是否能联合修饰成 员方法?
-
a. private 和 abstract:
private 修饰的方法不能被 子类继承,asbtract修饰的方法需要通过子类覆盖给与方法的实现部 分,联合修饰一个成员方法,矛盾。
-
b. static 和 abstract::
static 修饰方法可以直接 通过类名调 用, 如果通过类名调用的是一个抽象方法 (半成品),jvm无 法执行,不能 联合修饰一个成员方法。
-
c. final 和 abstract:
final修饰的方法可以被子类 继承,但是不允 许被覆盖;而 abstract修饰的方法的实现需要通过子类 覆盖时给与实现。所以不能联合使用