private修饰的成员方法默认是final型的?

来源:互联网 发布:爱思苹果助手mac版 编辑:程序博客网 时间:2024/05/29 05:56

private修饰的成员方法默认final型的?

  • 用fianl声明的成员方法是最终方法,最终方法不能被子类覆盖(重写)

从表面上看这个命题是错误的,private访问修饰符修饰的成员方法怎么会跟final型方法有关系呢?但从最终方法的定义可以看出,不能被子类覆盖的成员方法就是最终方法,而private修饰的成员方法就不能被子类覆盖,证明如下:

//证明private修饰的成员方法不能被子类覆盖class Father{    int m = 0;     private void set() {        m += 1;    }    public Father() {        set();    }}public class Son extends Father{     private void set() {        m += 3;    }    public static void main(String[] args) {        Father f = new Son();        System.out.println(f.m);    }}

输出:3

分析:
如果private修饰的set()方法被子类重写了,当执行到 Father f = new Son(); 语句,先执行Father类的构造方法,而构造方法的set()方法会调用子类的set()方法(多态的一种表现),输出结果为:1
而实际输出的结果为:3,因此private修饰的成员方法没有被子类覆盖,也就是说private修饰的成员方法默认是final型的。

  • 在class文件中,有专门描述方法的方法表,方法表第一项就是访问标志access_flags。其中标志值为0x0001的 ACC_PRIVATE代表方法为private;标志值为0x0002的 ACC_PUBLIC代表方法为方法为final,可以通过判断access_flags的值判断方法有哪些访问标志。
public class Test {    private void test(){}    private final void test2(){}}

通过jclasslib bytecode viewer看出,如下图:

这里写图片描述

这里写图片描述

分析:
两个方法一个是只有private修饰,另一个是有private和final 修饰,如果private修饰的成员方法默认是final型的,那两个方法的access_flags值应该一样的,可结果并非如此,由此可以说明private修饰的成员方法默认是final型的是错误的。

阅读全文
0 0