final
final关键字,最终,通常代表不能修改的属性
可以修饰类,方法,变量
final 类:最终类,不能被继承的类
final 方法:最终方法,不能被重写的方法
final 变量:最终变量,只能被赋值一次,不能被修改的变量
修饰基本类型变量时,变量存储的数据不能被改变
修饰引用类型的变量时,变量存储的地址不能被改变,但内容可变
final关键字可以确保对象的唯一性和不可修改性
抽象类
一种特殊的类,不能被实例化,只能被继承,抽象类的存在就是为了被其他类继承,提供了一种模版或者蓝图给子类,规定其应该具有的方法或者属性
抽象类的定义
使用关键字abstract定义
抽象类中可以包含抽象方法和非抽象方法
抽象方法只有方法声明没有方法体,将方法交由子类去实现
非抽象方法子类可以直接继承,提高代码的复用性
public abstract class Abstract {
private int a;
private int b;
public abstract void show();
public abstract void aaaa();
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
抽象类的应用
模版方法设计模式
像是一个定义算法框架的模版,包含了一些步骤,但步骤的具体实现是可以稍后交由子类去完成的
举个例⼦,你有⼀个做蛋糕的模板,其中包含了⼀些基本的步骤,⽐如准备材料、混合材料、烘烤 等。但是,具体的蛋糕种类和材料可以由⼦类来决定。⽐如,⼦类可以是做巧克⼒蛋糕的类,可以决 定使⽤什么样的巧克⼒和添加什么样的调料。
在这个例子中,蛋糕模版就可以用抽象类实现,而其中的具体制作过程则交由继承抽象类的子类完成
1,提高代码复用性:将算法框架和具体实现分离,以免重复编写相同代码
2,简化代码维护:修改和扩展在抽象类中进行,减少维护工作
3,提高代码可读性
接口
一种规范,规定了一个类应该有哪些方法以及如何使用这些方法,接口定义了一组方法的集合,但是没有具体的实现代码
接口可以看做一份说明书,告诉其他类需要实现的方法清单,但并不关心方法具体实现的细节,实现接口的类必须提供接口中定义方法的具体实现.
接口提供了多态的特性,增强了代码的灵活性和可扩展性
public interface Interface {
public abstract void method1();
public abstract void method2();
}
class interfacetest1 implements Interface{
@Override
public void method1() {
}
@Override
public void method2() {
}
}
接口和抽象类的对比
1,定义方式
抽象类使用abstract定义,可以包含抽象方法和具体方法
接口使用关键字interface定义,只能包含抽象方法和常量
2,继承关系
一个类只能继承一个抽象类,但可以实现多个接口
3,构造方法
抽象类可以有构造方法,但接口不能有构造方法
4,方法实现
抽象类中可以存在抽象方法也可以存在具体方法,但接口中只能有抽象方法
5,成员变量
抽象类中可以有成员变量,但接口中只能设置常量
为什么有了接口还需要存在抽象类
1,接口是一种规范,定义了一组抽象方法的集合,用于定义类的行为规范,促使类之间的解耦合,提高代码的可维护性和扩展性.
解耦合:减少模块与模块间的耦合度
2,抽象类是一种特殊的类,不能被实例化,只能被继承,抽象类中既可以有抽象方法,也可以有非抽象方法.主要用于作为父类为子类提供通用的属性和方法,提高代码的复用性.也可以通过继承来提高代码的扩展性.
3,一个项目中可以同时存在接口和抽象类,并且他们可以互相配合使用.
可以先定义接口来规范类的行为,再通过抽象类来实现接口中的方法
jdk8之后的接口新特性
1,引入默认方法,可以在接口中定义带有方法体的方法,这些方法将在实现类中默认实现
2,引入接口静态方法,可以在接口中定义静态方法,与默认方法类似,但不需要实现类来提供他们的实现,可以通过接口名称直接调用,甚至不需要创建接口实例.
3,引入私有方法,可以在接口中定义私有方法,私有方法可以在接口内部被其他默认方法或是静态方法调用,但不能在接口的实现类或者其他类中使用,私有方法的存在是为了在接口中重复使用公共逻辑,提高代码复用性.
4,引入私有静态方法,只能在接口内部被其他静态方法或者是私有方法调用,同时和私有方法一样不能被实现类或是其他类中调用