在继承的类中使用私有变量 - Java

Posted

技术标签:

【中文标题】在继承的类中使用私有变量 - Java【英文标题】:Using a private variable in a inherited class - Java 【发布时间】:2013-03-11 02:17:40 【问题描述】:

需要对私有变量和继承有更多的了解。早些时候我的理解是,如果一个类中有字段,并且当我继承该类时,不受访问(私有变量)限制的字段将存在于继承的类中。但如果有公共 g/setter 方法,我可以在基类中使用私有变量。

我怎么能想象基类中的私有变量?

【问题讨论】:

我不完全确定问题到底是什么。当然你可以在 getter 和 setter 中使用私有字段,这就是 getter 和 setter 的用途。 我不明白这个问题。展示您的问题的示例可能会有所帮助。 我不知道你的意思是什么。请尝试再次解释。 (而“变量”在 Java 类中称为“字段”。) What does it mean for a method to be public/private/other in java? 的可能重复项 【参考方案1】:
class A 
  private int a;
  public A(int a)  this.a = a; 
  public int getA() return a;


class B extends A 
  public B(int b)  super(b); 
  public int getB() return getA();


int result = new B(10).getA();

结果将是 10。A 类中的私有字段 a 有点继承给 B,但 B 不能直接访问它。仅通过使用 A 类中定义的公共/默认/受保护访问器方法。B 是 A,因此它始终具有 A 中的所有相同字段,并且可能在 B 类中定义一些新字段。

【讨论】:

【参考方案2】:

Java 教程http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html 是这么说的:

子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法

不过,看看这个

class A 
   private int i;


class B extends A 


B b = new B();
Field f = A.class.getDeclaredField("i");
f.setAccessible(true);
int i = (int)f.get(b);

它工作正常并从 B 实例返回字段 i 的值。也就是说,B 有i

【讨论】:

当然可以,但是当您使用反射时,各种语言保证都会消失。 :) 私有字段变为公开,最终字段变为可变(对于引用类型),世界就是你的牡蛎。 我们可以说 B 不继承 A 的私有字段,但事实是 B 的一个实例具有其所有超类的所有字段 这是一个应该被禁止的黑客行为。你应该有充分的理由在这里使用反射。【参考方案3】:

私有变量/成员不被继承。这是唯一的答案。

提供公共访问器方法是封装的工作方式。您将数据设为私有并提供获取或设置其值的方法,以便控制访问。

【讨论】:

以上是关于在继承的类中使用私有变量 - Java的主要内容,如果未能解决你的问题,请参考以下文章

在java中,如果没有给变量指定是公有或是私有,默认是啥?

继承的基本概念: Java不支持多继承,也就是说子类至多只能有一个父类。 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类中定义的成员变量和父类中

私有成员变量可以被子类继承吗

您可以在 Java 中访问私有变量,而无需来自非内部类的类的 getter [重复]

如何访问其子类中的类的私有变量?

extends 继承