Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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中的可见性问题 我来自C++,实际上我还没有在大学里使用过课堂继承,所以我自己学习。我将用一个例子来说明我的疑问:_Java_Visibility - Fatal编程技术网

Java中的可见性问题 我来自C++,实际上我还没有在大学里使用过课堂继承,所以我自己学习。我将用一个例子来说明我的疑问:

Java中的可见性问题 我来自C++,实际上我还没有在大学里使用过课堂继承,所以我自己学习。我将用一个例子来说明我的疑问:,java,visibility,Java,Visibility,假设我有一个名为Entity的类。该实体类包含两个整数,表示某些X和Y坐标(这不相关,它可以是任何其他字段)。然后我有我的类播放器,扩展实体。看起来很平常,我希望Player也使用x和y字段,实体类中的一些代码也引用这些字段 现在我开始怀疑了。x和y是公共的、私有的还是受保护的?我觉得它们应该受到保护,因为public不是一个选项(其他类不应该访问它),private不允许我使用扩展(Player)类的x和y字段。但我在别处读到,类字段永远不应该受到保护,而应该只保护方法 除了将变量设置为pro

假设我有一个名为Entity的类。该实体类包含两个整数,表示某些X和Y坐标(这不相关,它可以是任何其他字段)。然后我有我的类播放器,扩展实体。看起来很平常,我希望Player也使用x和y字段,实体类中的一些代码也引用这些字段

现在我开始怀疑了。x和y是公共的、私有的还是受保护的?我觉得它们应该受到保护,因为public不是一个选项(其他类不应该访问它),private不允许我使用扩展(Player)类的x和y字段。但我在别处读到,类字段永远不应该受到保护,而应该只保护方法

除了将变量设置为protected之外,其他解决方案是使用超类中的getter和setter(我认为这不仅是一种糟糕的做法,而且是完全冗余和不必要的),或者在新类中重新声明这些属性,这让我想到,如果我从继承中得到任何奖励,如果我必须键入所有字段声明两次。实际上,我甚至不知道最后一件事是否可行,因为我不太了解Java,不知道它如何处理这种可见性问题

在这个问题上的任何帮助都将不胜感激


谢谢。

如果您想通过
子类
访问变量,您需要使它们
受到保护。但这些仍然可以从其他
中访问,但在相同的
包中
。但是,除了那些继承了定义了变量的类的类之外,这些类将受到包外类的保护


是的,您应该定义
setters
来访问变量,而不是将变量本身设置为私有变量。这并不是一个坏习惯,事实上它是所有面向对象编程的最佳实践。

如果您希望通过
子类
访问变量,您需要使它们受到
保护。但这些仍然可以从其他
中访问,但在相同的
包中
。但是,除了那些继承了定义了变量的类的类之外,这些类将受到包外类的保护

是的,您应该定义
setters
来访问变量,而不是将变量本身设置为私有变量。这并不是一个糟糕的实践,事实上,它是所有面向对象编程的最佳实践

[使用getter和setter]。。。在我看来,这不仅是一种不好的做法,而且是完全多余和不必要的

事实上,这通常被认为是最好的方法。从可维护性到安全性,都有人支持它。您可以将字段
设置为私有
,并在基类中声明方法来访问和更改它们

[使用getter和setter]。。。在我看来,这不仅是一种不好的做法,而且是完全多余和不必要的


事实上,这通常被认为是最好的方法。从可维护性到安全性,都有人支持它。您可以将字段
设置为私有
,并在基类中声明访问和更改它们的方法。

在这种情况下,您不能使用无访问说明符吗?使用
protected
(除非我弄错了)允许所有子类(包括来自不同包的子类)都可以访问。在大多数(但不是所有)情况下,您只是为自己编写一个小程序,如果您希望子类能够访问超类的变量,那么您可以不使用访问说明符

这张图片应该为您提供有关所有不同访问说明符的信息。“包”列是指同一包中的子类,“子类”列是指与包无关的子类。

在这种情况下,您不能使用无访问说明符吗?使用
protected
(除非我弄错了)允许所有子类(包括来自不同包的子类)都可以访问。在大多数(但不是所有)情况下,您只是为自己编写一个小程序,如果您希望子类能够访问超类的变量,那么您可以不使用访问说明符

这张图片应该为您提供有关所有不同访问说明符的信息。“包”列是指同一包中的子类,“子类”列是指与包无关的子类。

这实际上取决于实体类的目的。如果它只是x和y的持有者——因为你的很多同学都会使用它们,那么让它们受到保护是完全正确的

如果有任何逻辑绑定到这些坐标,特别是验证,则在更改时会发生一些事件。然后,您需要使用getter/setter将此逻辑封装到实体类中


没有什么是一成不变的,只要其他开发人员不依赖于此,您就可以一直重写它。如果你有其他依赖于你的代码-你必须设计更安全。但不要过度设计。

这实际上取决于实体类的目的。如果它只是x和y的持有者——因为你的很多同学都会使用它们,那么让它们受到保护是完全正确的

如果有任何逻辑绑定到这些坐标,特别是验证,则在更改时会发生一些事件。然后,您需要使用getter/setter将此逻辑封装到实体类中


没有什么是一成不变的,只要其他开发人员不依赖于此,您就可以一直重写它。如果你有其他依赖于你的代码-你必须设计更安全。但是不要过度设计。

好吧,你说得对,我觉得这不再是多余的,但肯定要访问一个方法来访问一个属性