2011-02-16 70 views
1

如果我的子类和父类使用相同的变量名会发生什么?子类,父类....变量冲突?

父类是八九不离十这样的:

public class things{ 
    private things[] stuff; 
} 

和子类是这样的:

import java.utils.LinkedList; 
public class listOfThings extends LinkedList<things>{ 
    private LinkedList<things> stuff; 
} 

这可以吗?或者链表是否会覆盖数组?

+3

了解Java编码约定 - 您的类名不好。为什么你会同时做同一班的继承和组成? IS-A和HAS-A在同一个对象中。你应该下定决心。 – duffymo 2011-02-16 00:27:54

回答

2

你不延长事情这个例子中,要扩展

LinkedList<things> 

这是不是扩展事情根本不同。

因此,您的代码应该编译。

+0

那么,他的代码不会编译,因为import语句是`java.utils.LinkedList`,它应该是`java.util.LinkedList`。 :) – limc 2011-02-16 00:17:26

+0

好抓...没有注意到我自己;-) – karlgrz 2011-02-16 00:19:19

4

在这种情况下,两个变量都是私有的。这意味着它们只存在于定义类的范围内,并且没有重叠。如果父类声明该变量为protected或public,那么您将得到一个有关已存在的变量的编译器错误。

编辑:
KG回答了您提供的示例的问题。我回答你是否真的在做你在问什么。

1

具有相同名称的变量是可以的。 私人,公共,静态,实例,本地方法,块本地,不管。 Java选择最接近的一个。它比方法更松散。

JLS3#8.3:(这里只有1这是在第一句说限制)

它是一类声明体编译时错误名称相同声明两个领域。方法,类型和字段可能具有相同的名称,因为它们在不同的上下文中使用,并且通过不同的查找过程(第6.5节)进行消歧。

如果类声明了一个具有特定名称的字段,那么该字段的声明被称为隐藏在超类和该类的超接口中具有相同名称的字段的任何和所有可访问的声明。字段声明还隐藏了封闭类或接口中任何可访问字段的声明(第6.3.1节),以及在任何封闭块中具有相同名称的任何本地变量,形式方法参数和异常处理程序参数。

如果一个字段声明隐藏了另一个字段的声明,则这两个字段不必具有相同的类型。

一个类继承自它的直接超类和直接超接口超类和超接口的所有非私有字段,它们都可以在类中被代码访问并且不被类中的声明隐藏。

请注意,超类的专用字段可能可以访问子类(例如,如果两个类都是同一类的成员)。尽管如此,私人领域永远不会被一个子类继承。

一个类可能会继承具有相同名称的多个字段(第8.3.3.3节)。这种情况本身并不会导致编译时错误。但是,任何在类的主体中通过其简单名称引用任何这样的字段的尝试都会导致编译时错误,因为这样的引用是不明确的。

// this is a valid program! 
class $ 
{ 
    $ $; 
    $ $($ $) 
    { 
     class $$ extends $ 
     { 
      $$ $; 
     } 
     return new $$(); 
    } 
}