美文网首页程序员
Java学习16:final关键字、抽象类和接口

Java学习16:final关键字、抽象类和接口

作者: 苦难_69e0 | 来源:发表于2020-10-15 13:24 被阅读0次

final关键字

final是java语言中的一个关键字。

final表示最终的,不可变的。

final可以修饰变量以及方法,还有类等。

final修饰的类无法被继承。

final修饰的方法无法被覆盖,被重写。

final控制不了能不能调用的问题。final修饰的表示最后的,不能变的,不能改的。

final修饰的局部变量,一旦赋值,不能重新赋值。

*final修饰的变量,只能赋一次值。

final修饰的变量,如果这个变量是一个“引用”会怎样?
final修饰的引用:该引用只能指向1个对象,并且它只能永远指向该对象,无法再指向其他对象。并且再该方法执行过程中,该引用指向对象之后,该对象不会被垃圾回收器回收。直到当前方法结束,才会释放空间。
虽然final的引用指向对象A后,不能再重新指向对象B,但是对象A内部的数据可以被修改。

final修饰的实例变量,系统不负责赋默认值,要求程序员必须手动赋值。这个手动赋值,再变量后面赋值可以,再构造方法中赋值也可以。

实例变量在堆中,一个对象一份,一百个对象一百份。
实例变量既然使用final修饰了,说明该实例变量值不会随着对象的变化而变化。
实例变量前面应该在添加:static关键字,变为静态的,存储在方法区。节省内存空间。

final修饰的实例变量一般添加static修饰。
static final联合修饰的变量称为“常量”。
常量名建议全部大写,每个单词之间采用下划线衔接。

实际上常量和静态变量一样,区别在于:常量的值不变。
常量和静态变量,都是存储在方法去,并且都是在类加载时初始化。

抽象类

类到对象是实例化,对象到类是抽象。
抽象类是类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。
类本身是不存在的,所以抽象类无法创建对象(无法实例化)。

抽象类的理解.png

抽象类也属于引用数据类型。

抽象类的语法:
[修饰符列表] abstract class 类名{
类体;
}

抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。

final和abstract不能联合使用,这两个关键字是对立的。

抽象类的子类也可以是抽象类。

抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

抽象方法表示没有实现的方法,没有方法体的方法。例如:
public abstract void dosome();
抽象方法的特点是:
1.没有方法体,以分号结尾。
2.前面修饰符列表中有abstract关键字。

抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。

一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。
这是java语法上强行规定的,必须的,不然编译器就报错了。
这里的覆盖/重写,也可以叫做实现。(对抽象的实现)

java语言中凡是没有方法体的方法都是抽象方法,对么?
不对。错误的。Objec类中就有很多方法都没有方法体,都是以";"结尾的,但他们都不是抽象方法,例如:public native int hashCode();
这个方法底层调用了C++写的动态链接库程序。
前面修饰符列表中没有abstract,有一个native。表示调用JVM本地程序。

接口

接口也是一种引用数据类型。编译之后也是一个class字节码文件。

接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。

语法格式:
[修饰符列表] interface 接口名{
}

接口支持多继承,一个接口可以继承多个接口。

接口中只包含两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其他内容 了,只有这两部分。

接口中所有的元素都是public修饰的。(都是公开的。)

接口中的抽象方法定义时:public abstract 修饰符可以省略。

接口中抽象方法都是抽象方法,所以接口中的方法不能有方法体。

接口中的常量的public static final 可以省略。

类和类之间叫做继承,类和接口之间叫做实现。(理解:把实现看做继承)
继承使用extends关键字完成。
实现使用implements关键字完成。

当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(重写/覆盖)。

一个类可以同时实现多个接口。

这种机制弥补了java中的一个缺陷。
java中类和类只支持单继承、实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷。

接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转。但是一定要注意,运行时可能会出现ClassCastException异常。

继承和实现都存在的话:extends关键字在前,implements关键字在后。

使用接口写代码的时候,可以使用多态(父类型引用指向子类型对象。)

接口在开发中的作用

注意:接口在开发中的作用,类似于多态在开发中的作用。

但凡是满足has a 的表示都以属性(实例变量)的形式存在。

面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。
接口可以解耦合,解开的是调用者和实现者的耦合。
调用者面向接口调用。
实现者面向接口编写实现。

以后进行大项目的开发,一般都是将项目分离成一个模块一个模块的,模块和模块之间采用接口衔接,降低耦合度。

is a:
Cat is a Animal(猫是一个动物)
凡是能够满足is a的表示“继承关系”
A extends B

has a:
I has a Pen(我有一支笔)
凡是能够满足has a关系的表示“关联关系”
关联关系通常以“属性”的形式存在。
A{
B b;
}

like a:
Cooker like a FoodMenu(厨师像一个菜单一样)
凡是能够满足like a 关系的表示“实现关系”
实现关系通常是:类实现接口。
A implements B

抽象类和接口在语法上的区别

在这里我们只说一下抽象类和接口在语法上的区别。
至于以后抽象类和接口应该怎么进行选择,通过项目去体会学习。
抽象类是半抽象的。
接口是完全抽象的。
抽象类中有构造方法。
接口中没有构造方法。
接口和接口之间支持多继承。
类和类之间只能单继承。
一个类可以同时实现多个接口。
一个抽象类只能继承一个类(单继承)。
接口中只允许出现常量和抽象方法。

以后接口使用的比抽象类多。一般抽象类使用的还是少。
接口一般都是对“行为”的抽象。

相关文章

网友评论

    本文标题:Java学习16:final关键字、抽象类和接口

    本文链接:https://www.haomeiwen.com/subject/tazmuktx.html