final关键字
final可以修饰类、属性、方法和局部变量
当不希望类被继承时,可以用final修饰当不希望父类的某个方法被子类覆盖/重写(overrid时,可以使用final关键字修饰当不希望类的某个属性的值被修改,可以使用final修饰
当不希望某个局部变量被修改,可以使用final修饰
使用细节注意事项:
final修饰的属性又叫常量,一般用XX_XX_XX来命名final修饰的属性在定义时,必须赋初值,并且以后不能修改,赋值可以在如下位置在定义时在构造器中在代码块中如果final修饰的属性是静态的,则初始化的位置只能是定义时在静态代码块不能在构造器中赋值final类不能继承,但是可以实例化对象如果类不是final类,但是含有final方法,则该方法虽然不能重写但是可以被继承一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法final不能修饰构造方法(即构造器)final和static往往搭配使用,效率更高,底层编译器做了优化处理包装类(Integer,Double,Float,Boolean等都是fina,String也是final类
抽象类
用abstract关键字来修饰一个类时,这个类就叫做抽象类用abstract关键字来修饰一个方法时,这个方法就是抽象方法
注意事项:
抽象类不能被实例化抽象类不一定要包含抽象(abstract)方法,也就是说抽象类可以没有abstract方法一旦一个类包含了abstract方法,那么这个类必须声明为抽象类abstract只能修饰类和方法,不能修饰其他的抽象类可以有任意成员[抽象类还是类],比如:非抽象方法、构造器、静态属性等抽象方法不能有主体,即不能实现如abstractvoidaaa(){}不能有大括号如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类
abstract class E{
public abstract void hi();
}
/*可以这样继承*/
abstract class F extends E{
}
/*也可以这样继承*/
class G extends E{
@override
public void hi(){
}
}
抽象方法不能使用privatfinal和static来修饰,因为这些关键字都是和重写相违背的
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据实际情况把这些方法写出来
语法:
interface 接口名{
//属性
//方法(抽象方法,默认实现方法,静态方法)
}
class 类名 implements 接口{
自己属性;
自己方法;
必须实现的接口的抽象方法
}
注意事项:
接口不能被实例化接口中所有的方法是public,接口中抽象方法,可以不用abstract修饰一个普通类实现接口,就必须将该接口的所有方法都实现抽象类实现接口,可以不用实现接口的方法一个类同时可以实现多个接口classAimplementsIA,IB{}接口中的属性,只能是final的,而且是publicstaticfinal修饰符
int a=1;实际上是public satic final int a=10;
接口中属性的访问形式:接口名.属性名一个接口不能继承其他的类,但是可以继承多个别的接口
接口的修饰符,只能是public和默认,这点和类的修饰符是一样的
接口和继承比较:
继承的价值在于:解决代码的复用性和可维护性接口的价值在于:设计好各种方法(规范),让其它类去实现这种规范,即更加灵活接口比继承更加灵活:继承是满足is-a的关系,而接口只需要满足like-a的关系接口在一定程度上实现了代码解耦
文章为作者独立观点,不代表观点