abstract、static、final关键字

走远了吗. 提交于 2020-02-11 18:59:39

关键字

abstract关键字

抽象的,可以用来修饰类和方法

1、修饰类

抽象类,抽象类是为了模型化那些父类无法确定全部实现,而是由子类提供具体实现的对象的类

a、不可被实例化,因为可能含有抽象方法,如果由此类的对象来调用时就无法调用未完成的抽象方法

b、抽象类有构造器,还可以自定义构造器

2、修饰方法

抽象方法

a、格式:没有方法体,以及{};例:public abstract void eat();

b、实现:抽象方法只保留此方法的功能,具体的实现交给子类来实现,由子类来重写这个方法

c、抽象方法所在的类一定是抽象类,抽象类中可以没有抽象方法

d、若子类继承了抽象类,并重写了抽象类里所有的抽象方法,那么该子类可以被实例化,如果没有重写抽象类里的所有抽象方法,那么该类必须声明为抽象类

3、冲突

a、不可用来修饰属性:被abstract修饰的都是暂未实现的,比如类和方法,而属性不存在未被实现的状态

b、不可用来修饰构造器:构造器不可被重写

c、不可以修饰声明为private的方法:子类不能覆盖或者重写private方法

d、不可以和final共用:final用于类之前,表示类不能被继承,final用于变量前则只能赋值一次,如果初始化了那就是常量,和abstract搭配无意义(final不能被重写,根本就不可能被abstract的实现类重写)

e、不可以和static共用:static修饰的是静态方法和静态属性,可以直接被类调用,而abstract修饰的类中只有方法名,无方法体,不可以被直接调用。

static关键字

静态的,可以用来修饰属性,方法,代码块(初始化块),内部类

修饰属性(类变量)

a、由类创建的所有对象,都共用这一属性,共享数据

b、当其中一个对象对此属性进行修改,会影响其他对象对其调用

c、实例变量,每个对象都有一个副本

e、类变量是随着类的加载而加载的,类变量的加载是早于对象的,所有有了对象后,对象也可以调用类变量

f、通过"类.实例变量"是不可以的

修饰方法(类方法)

a、随着类的加载而加载,在内存中也是独一份

b、可以通过类.类方法来进行调用

c、类方法可以调用静态的属性和静态的方法,而不能调用非静态的属性和方法,反之非静态的可以调用静态的属性和方法。

d、在静态方法内是不可以有this(当前对象)和super(当前对象)关键字的

e、静态方法不可被重写,只能重新定义因为静态方法无需创建对象即可使用。没有对象,重写所需要的“对象所属类型,这一要素不存在,因此无法被重写。

f、static不可以修饰构造方法

修饰代码块

代码块类的第四个成员(属性,方法,构造器)、初始化块(代码块)

代码块分类:

i:非静态代码块

1、 可以对类的属性(是否静态的都可以)进行初始化操作,同时也可调用本类的方法。(是否静态的都可以。

2、 里面可以有输出语句。

3、 一个类中可以拥有多个代码块,按照书写顺序来执行。

4、 每创建一个类的对象,非静态代码块就执行一次。

5、 非静态代码块的执行,要早于构造器。

ii:静态代码块:

1、 里面可以有输出语句。

2、 随着类的加载而加载,而且只加载一次,并且最先加载。

3、 多个静态代码块按照其书写顺序来执行。

4、 静态代码块的执行顺序要早于非静态代码块。

5、 静态代码块中只可以执行静态的结构(类属性,类方法,或者输出语句。)

关于属性赋值的操作

①默认的初始化 ②显示的初始化==③代码块 ④构造器 ⑤通过方法对对象的相应属性进行修改

·········显示的初始化 或 代码块 此处的两个结构按照 书写顺序来执行

static修饰内部类(仅限内部类)

a、普通类是不可以被static修饰的,只有内部类才可以

b、被static修饰的内部类可以直接作为一个普通类来使用,而不需先实例一个外部类

final关键字

最终的,可以用来修饰类属性方法

final修饰类:

① 这个类就无法被继承,例如:String类,StringBuffer类,System类。

final修饰方法:

② 此方法就无法被重写。例如:Object类中的 getClass方法。适合功能确定的方法。

final修饰属性:

③ 此属性就是一个常量,一旦被初始化后就无法修改,不可在被赋值。

a) 习惯上使用大写字母来定义常量。

b) 此常量在哪里赋值??

​ i. 此常量不可以使用默认初始化。

​ ii. 可以显示化的赋值,代码块,构造器。

​ iii. 当一个变量被static 和 final 共同修饰,这个变量称为全局常量:(final 和 static 的先后顺序 无关。但是通常上规定static 在final前面,例如:Math类中的πpublic static final double PI = 3.14159265358979323846;)

final 修饰对象:

c) 如果final修饰的变量是对象类型,那么不可更改指的是该变量不可以再指向别的对象,但是对象的值是可以更改的

final 、finally和finalize() 的区别:

a) final修饰符(关键字)详情见上方。

b) finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行**。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。**finally块则是无论异常是否发生,都会执行finally块的内容,**所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。**流是一种稀有的资源,所以各种流的关闭必须放在,finally块中。

c)finalize是方法名

java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!