【问题标题】:Private class property visible私有类属性可见
【发布时间】:2013-06-13 13:28:37
【问题描述】:

private itemset 属性怎么可能在复制构造函数中可见?

import java.util.List;
import java.util.ArrayList;

public class Itemset {

    private List<Integer> itemset = new ArrayList<Integer>();
    private static long count = 0;

    // copy constructor
    public Itemset(final Itemset other) {
        count++;
        this.itemset = other.itemset;
    }
}

【问题讨论】:

  • 有点有趣的问题,问得不好。
  • 您是否阅读过 Java 语言规范中关于访问控制 (6.6) 的部分?它应该使事情变得非常清楚。您问题最后一段中的敌意在这里欢迎。
  • 是的,我继续修改,因为它完全不合适。让我们在这里变得专业。
  • 感到困惑是可以理解的,我很确定这里的每个人都会对你乍一看无法理解的事情感到沮丧,但我很确定你的最后一次编辑会喂给 SO 的仇恨机器帮助你。

标签: java class visibility private


【解决方案1】:

复制构造函数是该类的成员,那么为什么不应该从它可以访问itemset 变量?类中的所有变量成员对成员函数都是可见的。


为了消除混淆,是的,您仍然可以跨所述类的实例访问私有成员,因为它们仅在所述类的范围之外“不可见”

这就是为什么通过调用另一个实例的复制构造函数来访问other 实例的itemset 成员是完全有效的。

【讨论】:

  • 不,我说的是other.itemset,其中other 是外国的。
  • 同样的原因。您正在班级中访问它,因此您被授予访问私有成员的权限。但是,私有成员在类之外是不可见的。
  • 同一个班。请注意,由于您在该类的范围内,因此所有成员都变得可见,即使跨所述类的实例也是如此。
【解决方案2】:

因为您使用的是复制构造函数;)

更严重的是:private 变量具有类级别的可见性;你的 other 对象是一个不同的实例,但它是相同的;因此,该对象的实例成员被授予在构造函数中可见。

注意“班级级别”。这意味着来自内部类的实例变量对外部类可见,反之亦然:

class A {
    private int a; // instances of B see this

    class B {
        private int b; // instances of A see this
    }
}

【讨论】:

  • 不,我说的是other.itemset,其中other 是外国的。
  • 不,不是! otherItemSet!
  • 这很奇怪!我认为传入的 Itemset 对象 other 对于当前的对象来说是陌生的!
  • 这是一个“外部实例”,但它是相同的(不是外部的)类
  • 它是另一个实例,是的,但它属于完全相同的类;并且可见性规则适用:private 成员是类可见的,对于同一类的所有实例
【解决方案3】:
  • 作为班级成员,即使private 对班级也是可见的
  • 类的每个成员在同一个类中都是可见的
  • 即使是内部类也可以访问属于同一类的私有成员

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2018-08-13
    • 2010-09-23
    • 1970-01-01
    • 2013-07-26
    • 2023-03-07
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多