如何在Java中使用访问修饰符(为什么使用getter方法?)
我有一个简单但愚蠢的问题。我们在Java中使用访问修饰符来访问类中的变量。我不明白,如果我们可以使用公共类中定义的属性访问类外的私有类变量,那么公共类和私有类之间的区别是什么?它仍然可以在私有类之外访问。我不理解这个公私概念的概念。它被称为。您可以将其视为控制对象的内部状态,并仅显示适合调用方的公共接口或约定。只能从类内访问私有成员和函数还有其他技术,例如从类外访问它们的反射,但现在让我们忽略这些 可以从任何其他类访问公共函数或成员。公共函数可以从自己的类访问私有成员 通常,公共函数是您希望向外部类公开的东西。它们通常定义类做什么,而不是如何做。例如,如果类A有一个名为doSomething的公共函数,那么类B可以调用该函数。它不在乎A是如何做到的,它只在乎它做到了。在内部,doSomething可能访问一些内部私有变量。因为B不依赖于这些变量,所以这些细节可以在不影响方法调用的情况下更改如何在Java中使用访问修饰符(为什么使用getter方法?),java,Java,我有一个简单但愚蠢的问题。我们在Java中使用访问修饰符来访问类中的变量。我不明白,如果我们可以使用公共类中定义的属性访问类外的私有类变量,那么公共类和私有类之间的区别是什么?它仍然可以在私有类之外访问。我不理解这个公私概念的概念。它被称为。您可以将其视为控制对象的内部状态,并仅显示适合调用方的公共接口或约定。只能从类内访问私有成员和函数还有其他技术,例如从类外访问它们的反射,但现在让我们忽略这些 可以从任何其他类访问公共函数或成员。公共函数可以从自己的类访问私有成员 通常,公共函数是您希望向外
这个概念称为封装或信息隐藏。在谷歌上搜索这些术语可以提供更详细的例子。如果我理解正确,你会问:
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();