2013-06-05 21 views
0

我有两个班,父母与子女用以下代码:如何为Java中的继承字段赋值?

public class Parent { 
    public String word; 
} 

父类仅包含一个公共领域。

public class Child extends Parent { 

//super.word = "Simple field assignment."; 
{ 
    System.out.println(word); 
} 
String word2 = super.word = "Field assignment."; 

{ 
    System.out.println(word); 
    super.word = "Initialization block."; 
    System.out.println(word); 
} 

public Child(){ 
    super.word="Constructor."; 
    System.out.println(word); 
} 
} 

我想问的问题是,为什么简单的赋值“super.word =‘字’”是不允许的,但下面的双重任务是确定。有人可以指定后者究竟发生了什么吗?

此外,为什么在初始化块内允许分配?

如果我运行主要有以下几个程序:

public class FieldTest { 
public static void main (String[] args) 
{ 
    Child c = new Child(); 
    System.out.println("1: "+c.word); 
    System.out.println("2: "+c.word2); 
} 
} 

的结果是:

null 
Field assignment. 
Initialization block. 
Constructor. 
1: Constructor. 
2: Field assignment. 
+0

删除'super'。所有你需要的是'this.word'或者只是'word'。该字段被继承。 –

+0

删除'super'或用'this'替换它不会改变任何内容。 – Pertti

+0

这是*评论*而不是答案。 –

回答

1

声明

super.word = "Simple field assignment."; 

外侧的构造,初始化或方法不是有效的Java句法。宣布它

public class Parent { 
    public String word = "Don't use mutable public fields!" 
} 

时,您可以初始化一个领域,在子类的构造函数或初始化程序修改这些

public class Child extends Parent { 
    public Child() { 
     super(); 
     this.word = "Don't mutate parent state like this..."; 
    } 
} 

当你是隐藏的变量组合super关键字与领域是唯一有用的超:

public class Child extends Parent { 
    public String word = "Only for demonstration purposes - do not hide fields!"; 

    public Child() { 
     super.word = "Mutating the hidden field."; 
    } 
} 

正如你可以从这个代码中看到的是不是应该在生产结束了 - 我不记得使用super.someField曾经在我的职业生涯中。如果您不确定某些结构,请使用CheckStyle和FindBugs。如果您需要解决具体继承问题的任何提示,请继续发布。

P.S .: Hiding Fields in the Java Tutorials

0

如果你指的是你的注释掉的行

super.word = "Simple field assignment."; 

该行是因为它是一个陈述直接发生“裸”直接wi瘦身课。在那个位置只允许声明。一个实例初始化器就是这样一个例子。

在另一点上,您对super的使用是完全多余的。您可以删除它,而不会影响语义,或者可以使用this代替,同样的结果。

0

尝试改变儿童的定义为以下

public class Child extends Parent { 
{ 
    super.word = "Simple field assignment."; 
    System.out.println(word); 
} 
String word2 = super.word = "Field assignment."; 

{ 
    System.out.println(word); 
    super.word = "Initialization block."; 
    System.out.println(word); 
} 

public Child(){ 
    super.word="Constructor."; 
    System.out.println(word); 
} 
} 

即地方super.word =“简单字段赋值”区块之中 - 所有的代码,是不是一个声明有去的初始化器块内。见here

0

第一个任务是不允许的,因为它直接在类的内部,另一个在块内,所以没关系。

要回答第二个问题,让我们来看看发生了什么:

  1. Child被实例化,所以在执行第一个块,印刷word,它尚未初始化,所以它的null
  2. 属性word2的值为word,它的值为Field assignment.,它们都包含此字符串。
  3. word印刷:Field assignment.
  4. word给出打印Initialization block.
  5. word值:Initialization block.
  6. Child的构造函数被调用,word被赋予值Constructor.和正在被打印。
  7. 正在打印的word值:Constructor.
  8. 正在打印的word2值:Field assignment.
0
class Check { 
    //static block 
    static { 
     System.out.println("hello from Static"); 
    } 
    //object block 

    { 
     System.out.println("This is my object block"); 
    } 

    public static void main(String args[]) { 
     System.out.println("hello from main"); 
     Check obj = new check(); 
    } 
} 

这是输出:

hello from Static 
hello from main 
This is my object block 

每当类被装入JVM执行静态块。而在创建所述对象的实例时将运行对象块或构造块。

欲了解更多信息,请访问

http://www.jusfortechies.com/java/core-java/static-blocks.php http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html