三个修饰符(abstract、static、final)

abstract

abstract修饰类

(1) 被abstract修饰的类是抽象类,编译后生成独立class文件
(2) 抽象类不能单独new对象,但可以声明引用
(3) 抽象类可以定义成员变量和成员方法
(4) 抽象类可以有构造,但不用于new对象,而是用于子类创建对象jvm默认创建父类对象应用

abstract修饰方法

(1) 被 abstract 修饰的方法称为抽象方法
(2) 抽象方法只有声明部分,没有方法实现
(3) 抽象方法只能定义在抽象类中;但是抽象类中既可以定义抽象方法,也可以定义非抽象方法

抽象类的子类

(1) 如果一个类继承抽象类,此类为抽象类的子类
(2) 如果子类不想定义为抽象类,必须覆盖父类中所有的抽象方法,否则子类必须定义为抽象类。
(3) 抽象类强制使用多态
抽象类类名 引用名 = new 子类类名(形参);

static

static修饰属性

(1) 被 static 修饰的属性称为静态属性、静态变量、类变量,被每一个对象共享
使用方法:
引用名.静态属性名
类名.静态属性名

static 可以修饰成员方法

(1) 被static修饰的方法为静态方法
使用方法:
类名.静态方法名(实参)
对象名.静态方法(实参)

注意:
(1) 静态方法中不能直接访问本类的非静态成员(实例变量+成员方法)
(2) 静态方法中可以直接访问本类的静态成员(静态变量+静态方法)
(3) 非静态方法中既可以直接访问 本类非静态的成员,也可以直接访问本类的静态成员。
(4) 静态方法中不能使用 this 和 super 关键字
(5) 父类中的静态方法可以被子类继承
(6) 如果子类覆盖父类中的静态方法,则子类覆盖的方法也必须是静态的(静态方法只能被静态方法覆盖);以父类型的引用调用静态方法,直接访问父类中静态方法,没有体现多态的覆盖结果。

static 可以修饰初始化代码块

初始化代码:也称为动态代码块

(1) 定义在类以内,方法以外的 {}
(2) 作用:创建对象时,按照和属性(实例变量)定义的先后
顺序完成对属性初始化工作

静态初始化代码块

(1) 定义在类以内,方法以外,被 static 修饰的 {}static{}
(2) 作用:在类加载的时候,按照和静态属性定义的先后
顺序完成静态属性的初始化工作。

类加载

① 类加载:JVM第一次使用一个类的时候,通过classPath(类路径)找到所需要的类对应的 .class 文件,读取并获取类对应信息(包名、类名、属性、构造方法、成员方法、父类等信息),将类的信息保存到JVM内存中,一个类类加载进行一次。
② 第一次使用一个类:
(1). 第一次调用类中静态成员(静态属性和静态方法)
(2). 第一次创建一个类的对象:先进行类加载,再完成对象的创建
(3). 子类类加载会先导致其父类进行类加载(注意:只是声明引用,不会导致类加载)。

带有类加载创建对象的过程

(1) 先类加载
-> 先加载父类
父类静态属性完成初始化(父类的静态代码块)
-> 再加载子类
子类静态属性完成初始化(子类的静态代码块)
(2) 再创建对象:
执行子类构造方法第一行遇到super(),代表先完成父
类对象的创建
-> 先完成父类对象的创建:
–> 执行父类属性初始化内容(父类属性赋值语句+动
态代码块)
–>父类构造方法中的内容
->再完成子类对象的创建:
–> 执行子类属性初始化内容(子类属性赋值语句+动
态代码块)
—> 子类构造方法中内容

final

final修饰变量(局部变量、实例变量、静态变量)

(1) final修饰的变量是作用范围内的常量,只允许一次赋值,不允许更改(final修饰的变量 通常以全大写字母作为名字)
(2) final修饰实例变量 ,jvm不再分配默认值

final 修饰实例变量初始化的位置:

1 在声明的同时 给其初始化
2 可以在构造方法中对其初始化,但是必须保证每一个构造方法中都有对其初始化的语句。
(3) final 修饰 静态变量,jvm不再分配默认值

final修饰的静态变量初始化位置:

1 声明的同时为其初始化
2 可以在静态代码块中完成对其初始化
(4) 如果 引用被 final修饰,代表引用中存储的对象地址不可
以改变,但是可以通过引用对对象中的属性进行改变。

final修饰方法

被final修饰的方法能被子类继承,但是不允许子类覆盖

final修饰类

被final修饰的类不能被继承,即没有子类。

发布了2 篇原创文章 · 获赞 0 · 访问量 8

猜你喜欢

转载自blog.csdn.net/weixin_44837710/article/details/105453450