Java编译器在看到关键字extends时会做什么?

时间:2014-04-18 11:39:44

标签: java inheritance protected

请考虑以下代码。

A.java,主要包裹:

package pkgs.main;

public class A {
    protected int x;
}

B.java,测试包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {
}

运行javac编译器时,它是否大致如下:

A.java,主要包裹:

package pkgs.main;

public class A {
    protected int x;
}

B.java,测试包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {  
    // Some "flag/code" that says:
    // Must be aware that the following new and seperate copy of x 
    // has originated from class A, which is inside a package called main.
    protected int x;
}

我之所以要问的是,我试图了解子类必须知道所有"属性/属性"是否必不可少。其继承成员,以便运作。如果这是真的,那么这种编程继承会与现实世界中的继承略有不同吗?例如,我从父母那里继承了各种属性,但我完全不知道所有这些信息。 (如果我的父母要去世,我可以继续操作。)然而,我想知道Java的继承在这个意义上是否是独立的,如果一个子类必须始终知道它的位置它的继承成员,为了正确操作。

问题是,在阅读编程书籍中的继承时,我感到困惑。他们提供了涉及动物,猫和狗等现实世界物体的例子,但根据上面的段落,我想知道是否存在微妙的机制差异" Java继承和Java书籍中提供的涉及这些类型的现实世界对象的继承示例。

我与Java有关的问题是我不明白为什么我可以做以下事情。下面的代码是一些简单的"调用代码"在"主要班级"涉及上面已经定义的两个类(A和B)。

Main.java,主要包:

package pkgs.main;
import pkgs.test.B;

// Just some method inside the "main class"
void method() {
    B b = new B();
    b.x ++;  //   <--- why is this allowed?
}

这个&#34;呼叫代码&#34;在一个名为main的包中,类B在一个名为test的不同包中定义。这个调用代码没有扩展B类,那么为什么Java允许访问B&#39受保护的成员x?

解释是因为受保护的成员x最初是在A类中声明的,在与调用代码相同的包中?如果是真的,这大致符合我之前的想法,我在这里谈到了B类:

public class B extends A {  
    // Some "flag/code" that says:
    // Must be aware that the following new and seperate copy of x 
    // has originated from class A, which is inside a package called main.
    protected int x;
}

2 个答案:

答案 0 :(得分:4)

  

Java编译器在看到关键字extends时会做什么?

你的情况没什么。

  

这个调用代码没有扩展B类,所以为什么Java允许   访问B的受保护成员x?

这是关于可访问性的。根据Java语言规范(参见JLS7:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

  

6.6.1确定可访问性

     

...

     

否则,如果成员或构造函数被声明为protected,   只有在满足下列条件之一时才允许访问:

     
      
  • 在包中发生对成员或构造函数的访问   包含受保护成员或构造函数所在的类   声明。

  •   
  • 访问是正确的,如§6.6.2。

  • 中所述   
     

...

您可以从同一个包中访问受保护的字段“x”。 但是如果你在类'B'中声明一个新字段'x'(隐藏'A.x'),那么你就无法从'main'包中访问'x'(格式为b.x++;)。

答案 1 :(得分:3)

// Some "flag/code" that says:
// Must be aware that the following new and seperate copy of x 
// has originated from class A, which is inside a package called main.
protected int x;

没有。没有'新的和单独的x'。它是从A类继承的'x'。它是一样的。这可以解释你所有的困惑。

  

如果子类必须知道从

获取其继承成员的位置

当然。

  

解释是因为受保护的成员最初是在A类中声明的吗?