0

我最近刚开始学习 Java,来自 C# 背景。

当我开始使用 Collections 时,我注意到Arrays.asList()返回一个ArrayList<T>对象。

但是,我不明白的是,根据“ docjar ”(第 2834 行)的代码清单,将其标记ArrayList<T>private

如何使用已明确标记为对我隐藏的对象?或者(这就是我所怀疑的),private与我假设的含义是否有某种不同的含义?

(另外,我注意到该类被标记为静态,这也让我感到困惑,但我会在一个单独的问题中问这个问题)


编辑:C# 中引发编译器错误的示例:

public class PubClass {
        private class Blah {

        }

        public Blah GetBlah() {
            return new Blah();
        }
}

给出:不一致的可访问性:返回类型“Namespace.PubClass.Blah”比方法“Namespace.PubClass.GetBlah()”更难访问

4

3 回答 3

6

ArrayList返回给您的 实现以及该List接口中包含的所有方法。由于List是公开的,因此您了解这些方法并可以调用它们。

私有的原因是因为它没有理由公开:除了接口提供ArrayList的功能之外,它不提供任何其他功能。List

/edit
你的例​​子没有模仿这里发生的事情:

public interface List<T> {
    /** snip */
}

public class Arrays {
    private static class ArrayList<T> implements List<T> {
        /** snip */
    }

    public <T> List<T> asList(T... arr) {
        return new ArrayList<>(arr);
    }
}

在您的示例中,您试图返回外部调用者不知道的私有类的实例。在这个Arrays例子中,返回的对象实际上是一个List(看看返回类型),而不是一个私有的ArrayList

于 2012-06-10T23:21:04.323 回答
1

私有意味着标记为私有的类/字段/方法只能在当前范围内访问 - 它定义在其中的类。这意味着您从外部无法实例化新的 ArrayList,如 Arrays 类中给出的那样。但是,类中的成员可以像asList(T... a)方法一样使用类。

返回类型实际上是 a List<T>,一个 的超类ArrayList<T>,因此您可以使用它,因为它是一个公共类,具有您的程序已知的方法。

该类被标记为静态,因为它不必是动态的;类的定义不会随着 的每个新实例而改变Arrays

于 2012-06-10T23:23:09.013 回答
0

私有只是意味着它不能通过其接口在类之外访问。例如,您不能执行以下操作:myObject.m_privateVariable. 所发生的只是asList“getter”返回对私有变量的引用,因此通过受控方式公开它。

使用访问器(请参阅mutator 方法)允许类控制对该数据的访问。例如,您可能会在返回私有变量之前对其进行一些操作,如果您让世界直接访问所有成员变量,您将无法在一次调用中完成。

于 2012-06-10T23:24:44.567 回答