1、关键字可以修饰的说明:
static | 是 | 是 | 是 |
final | 是 | 是 | 是 |
abstract | 否 | 是 | 是 |
2、关键字的意义:
static | 表示属于该类。 | 1. 修饰变量:属于该类 2. 修饰方法:子类可覆盖为static,但不可覆盖为非static。 3. 修饰类:属于该类 | 见下面详细的补充说明 |
final | 表示一旦赋值不能改变。 | 1. 修饰变量:一旦赋值不能改变; 2. 修饰方法:不能被其子类覆盖; 3. 修饰类:不能被继承; | 不会有继承的问题,因为其代表不可变。 |
abstract | 抽象,表示只是定义。 | 1. 修饰变量:不可以 2. 修饰方法:抽象方法没有实现,只能被子类继承并实现 3. 修饰类:抽象类不能生成对象实例,只能被子类继承并实例化子类。。 | 完全为了继承而生。 |
interface | abstract 的特例 | 1.8之前: - 变量默认是 public static final 类型; - 方法默认是 public abstract 类型; 1.8 之后: - 方法:可定义一个或多个静态(static)方法(就是一static方法而已,只是定义改变了) - 方法:可用 default 修饰符定义(就是一普通方法而已,只是定义改变了) | ?后续补充 |
注意:
注:不能放在一起的修饰符:final,private,static,因为 abstract 修饰的方法必须在子类中实现(覆盖),才能以多态方式调用,而以上修饰符在修饰方法时期子类都覆盖不了这个方法。
final 是不可以覆盖,private 不能够继承到子类也就不能覆盖,static 虽然可以被覆盖,但调用时会调用编译时类型的方法,因为调用的是父类的方法,而父类的方法又是抽象的方法,又不能够调用,所以上的修饰符不能放在一起。
3、static的继承和覆盖说明:
注:下面只是测试,实际不建议通过实例对象访问静态变量。编译期会提示不建议,但实际可执行。
子(类B)覆盖(static) | A.na / a.na表示:父类中的变量; B.na / b.na表示:子类中的变量; | 如下图 |
子(类B)覆盖(非static) | A.na / a.na表示:父类中的变量; B.na:编译错误; b.na:B 中的普通成员变量 | 如下图 |
子(类B)不覆盖 | A.na / a.na / B.na / b.na 代表的是同一个变量 |
上面没有考虑另一种情况:子类对象赋值给父类对象的情况。此时:输出的还是父类中的内容(方法和变量都是如此)。
方法覆盖的测试如下图: