在eclipse中

时间:2017-06-26 12:24:06

标签: java

我正在学习java中的继承。在我正在学习的地方编写小代码时,我们无法访问子类中超类的私有成员。

这是我的代码:

class A {
    int i;
    private int j;

    void setij(int x, int y) {

        i = x;
        j = y;
    }

    class B extends A {

        int b;

        void sum() {

            b = i + j;
        }
    }

当我在eclipse中创建一个新类时,我无法在A类中创建一个sublcass B的对象。

class mainclass{

            public static void main(String args[]){
                 B object = new B(); ----error


            }
        }

    }

错误表示需要创建B类。

我可以知道为什么会这样吗?它发生的不是问题,但我想解决并理解它为什么会发生的逻辑。

由于

2 个答案:

答案 0 :(得分:2)

这是因为类B中存在类A,因此需要在A之外创建,例如:

class A {
    int i;
    private int j;

    void setij(int x, int y) {

        i = x;
        j = y;
    }   
}

class B extends A {

     int b;
     void sum() {
        b = i + j;
     }
 }

使用此代码,可以从包内的所有类访问类B(和A)。如果您希望从当前包外部访问这些类,则需要在单独的文件中创建这些类,并将它们标记为public

Here's更多关于类的访问修饰符。

<强> Upate

如果要在B中将类A定义为内部类,那么您将需要封闭类(在我们的示例中为A)的实例来访问B ,例如:

class A {
    int i;
    private int j;

    void setij(int x, int y) {

        i = x;
        j = y;
    }   

    class B extends A {

        int b;
        void sum() {
           b = i + j;
        }
    }
}

现在,要实例化B,您需要执行以下操作:

A a = new A();
B b = a.new B(); 

当然,与访问修饰符相同的规则将应用于内部类实例(除了内部类将能够访问封闭类的私有成员的事实),

答案 1 :(得分:1)

这是因为B类的实例必须与A类的实例相关。因此,您必须首先创建A类的实例,然后创建B类的实例:

    A a = new A();
    a.setij(1,2);
    B b = a.new B();
    b.setij(3,4);
    b.sum();
    System.out.println(b.b);

(如果你想知道,结果是5)