java代码编译遗产扩展

时间:2015-08-18 11:24:33

标签: java access-modifiers

此代码存在编译问题。我如何获得a.f()

class A {
    int i = 1;

    int f() {
        return i;
    }

    static char g() {
        return 'A';
    }
}

class B extends A {
    int i = 2;

    int f() {
        return -i;
    }

    static char g() {
        return 'B';
    }
}

class Test {
    public static void main(String args[]) {
        B b = new B();
        System.out.println(b.i);
        System.out.println(b.f());
        System.out.println(b.g());
        System.out.println(B.g());
        A a = b;
        System.out.println(a.i);
        System.out.println(a.f());
        System.out.println(a.g());
        System.out.println(A.g());
    }
}

这是结果

2
-2
B
B
1
-2
A
A

2 个答案:

答案 0 :(得分:1)

您没有为类成员指定任何访问修饰符,因此它只具有默认或包级别访问权限,并且不可用于子类

Modifier    Class Package Subclass World
public      Y     Y       Y        Y 
protected   Y     Y       Y        N 
no modifier Y     Y       N        N 
private     Y     N       N        N 

有关详细信息,请参阅here

如果您将f()的签名更改为protected int f(),那么它应该可以正常工作

当然,你和班上的其他成员有同样的问题,所以由你来决定如何控制这个

答案 1 :(得分:0)

覆盖仅仅是例如方法,而不是变量。因此,当您从类A的实例中获取变量i时,您将从此类中获取值。与B类实例相同。

但是你可以在构造函数中重新初始化i的值,例如:

class B extends A {

public B() {
    i=2;
}

int f() {
    return -i;
}

static char g() {
    return 'B';
}