Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用访问修饰符(为什么使用getter方法?)_Java - Fatal编程技术网

如何在Java中使用访问修饰符(为什么使用getter方法?)

如何在Java中使用访问修饰符(为什么使用getter方法?),java,Java,我有一个简单但愚蠢的问题。我们在Java中使用访问修饰符来访问类中的变量。我不明白,如果我们可以使用公共类中定义的属性访问类外的私有类变量,那么公共类和私有类之间的区别是什么?它仍然可以在私有类之外访问。我不理解这个公私概念的概念。它被称为。您可以将其视为控制对象的内部状态,并仅显示适合调用方的公共接口或约定。只能从类内访问私有成员和函数还有其他技术,例如从类外访问它们的反射,但现在让我们忽略这些 可以从任何其他类访问公共函数或成员。公共函数可以从自己的类访问私有成员 通常,公共函数是您希望向外

我有一个简单但愚蠢的问题。我们在Java中使用访问修饰符来访问类中的变量。我不明白,如果我们可以使用公共类中定义的属性访问类外的私有类变量,那么公共类和私有类之间的区别是什么?它仍然可以在私有类之外访问。我不理解这个公私概念的概念。

它被称为。您可以将其视为控制对象的内部状态,并仅显示适合调用方的公共接口或约定。

只能从类内访问私有成员和函数还有其他技术,例如从类外访问它们的反射,但现在让我们忽略这些

可以从任何其他类访问公共函数或成员。公共函数可以从自己的类访问私有成员

通常,公共函数是您希望向外部类公开的东西。它们通常定义类做什么,而不是如何做。例如,如果类A有一个名为doSomething的公共函数,那么类B可以调用该函数。它不在乎A是如何做到的,它只在乎它做到了。在内部,doSomething可能访问一些内部私有变量。因为B不依赖于这些变量,所以这些细节可以在不影响方法调用的情况下更改


这个概念称为封装或信息隐藏。在谷歌上搜索这些术语可以提供更详细的例子。

如果我理解正确,你会问:

public class A {
    public int x;
}

不同之处在于,在第一种情况下,您可以按原样访问类成员,而无需附加逻辑。在第二种情况下,由于您正在调用一个方法,因此可能会有额外的逻辑。例如:

public class A {
    private int x;

    public int getX() { return x; }
    public void setX(int x) { if(x > 0) this.x = x; }
}  
在这种情况下,仅当提供的值大于0时,才为x设置新值


这个概念称为封装。它允许您透明地处理各种特殊情况,而不会将逻辑暴露在课堂之外。

如果我正确理解了您的问题,您会问为什么有人会这样写:

public class MyClass {
    private int value;
    public int getValue() {
        return value;
    }
    public int setValue(int val) {
        value = val;
    }
}
而不是简单地:

public class MyClass {
    public int value;
}
主要原因是对客户端代码隐藏MyClass的内部结构。这样做的好处是,您可以更轻松地修改MyClass的内部结构。例如,您可能决定在值更改时需要更新MyClass中的另一个字段。如果对值的访问分散在代码中的每一个地方,这将很难实现而不会出错,如果您的代码充当其他代码的库,这几乎是不可能的


其他好处是,如果需要,您可以重写getValue和setValueint以同步对值的访问、记录对值的写入或执行任何其他操作。

类变量或字段被声明为私有的原因有很多,所有这些都基于一个名为的概念

一个原因是您可能希望控制对字段的访问,例如过滤某些值

例如

第二个原因是,我们可能希望隐藏正在使用的类的特定实现。接口列表指定用于访问有序元素集合的约定。ArrayList和LinkedList是List的两种不同实现。在内部,您可以使用ArrayList作为实现,但只希望公开您使用的列表。这意味着,如果您随后发现LinkedList是一个更好的实现,那么您不会破坏任何依赖于您的类的实现

以B类为例

public class B {

    private ArrayList<String> list;

    // constructor

    public List<String> getList() {
        return list;
    }

    public ArrayList<String> getListTheBadWay() {
        return list;
    }

}
我可以像这样轻松地使用B类

B b = new B();
List<String> list1 = b.getList();
ArrayList<String> list2 = b.getListTheBadWay();

如果类B更改为使用LinkedList,则使用getList的行Badway将中断,而使用getList的行将继续工作。

问题不够清楚。您可以给出一个简短的源代码示例吗?为什么不阅读文档或java书籍呢?如果你在这里得到一些答案,它们与书中所写的没有什么不同。这个私有类是内部类吗?@YvesMartin源代码?你想说什么?他甚至没有阅读概念,这个问题与源代码无关。你在开玩笑吗?非常感谢。你是对的。
public class B {

    private ArrayList<String> list;

    // constructor

    public List<String> getList() {
        return list;
    }

    public ArrayList<String> getListTheBadWay() {
        return list;
    }

}
B b = new B();
List<String> list1 = b.getList();
ArrayList<String> list2 = b.getListTheBadWay();