这个答案显示了Java的可见性修饰符及其含义:
Modifier | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public | y | y | y | y
————————————+———————+—————————+——————————+———————
protected | y | y | y | n
————————————+———————+—————————+——————————+———————
no modifier | y | y | n | n
————————————+———————+—————————+——————————+———————
private | y | n | n | n
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么允许所有子类的可见性意味着您必须提供包中所有其他类的可见性?换句话说,为什么Java创建者会这样做,而不是:
Modifier | Class | Subclass | Package | World
————————————+———————+—————————-+——————————+———————
public | y | y | y | y
————————————+———————+—————————+——————————+———————
no modifier | y | y | …Run Code Online (Sandbox Code Playgroud) 由于Jigsaw项目的核心是Java模块系统,因此能够仅限制对特定模块内特定程序元素(类,方法和字段)的访问是很好的.
当模块中的某些元素对于此模块基本上是公共的时,它可能会有所帮助,但不应在此模块外部访问.
所以我说的是"package-local"之后的下一级访问,可以命名为"module-local".
然而,简要介绍Jigsaw规则和早期规范并没有帮助我弄清楚这种功能.更具体地说,该Modifier规范不包含任何新元素.
那么在未来的Java 9中还有其他任何可能吗?
我有两个封装定义,不能适合一个定义.
这两个定义如何讨论相同的概念?
我在Swift 3中阅读了Apple关于访问修饰符的参考资料.我在stackoverflow上也读过同样的内容,但是我没有得到答案.据我所知,有四个层次:
我为自己创建了方案,以了解所有这些修饰符之间的差异并在此处上传.如您所见,公共修饰符和内部修饰符之间没有区别.但是它们处于不同的级别.任何想法将不胜感激!
如果我有一个java类,它是package-private(用"class"声明,而不是"public class"),如果里面的方法被声明为public或protected或package-private,那么确实没有区别,对吧?那么我应该使用哪种,或者何时应该使用哪种?我有点困惑.
我在理解java中的受保护访问修饰符(或其背后的设计)时遇到了一些麻烦.我认为这意味着包访问和访问通过继承包含抽象成员的类的对象.
我写了以下示例代码.我看到如果取消注释,注释掉的行会产生编译错误.为什么我可以通过Second中的Second对象访问pro,但不能通过Second中的First对象访问pro?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
Run Code Online (Sandbox Code Playgroud)
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
Run Code Online (Sandbox Code Playgroud)
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个类,我希望只能为其子对象访问该方法,而不是该包中的其他类.
Modifier | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public | ? | ? | ? | ?
————————————+———————+—————————+——————————+———————
protected | ? | ? | ? | ?
————————————+———————+—————————+——————————+———————
no modifier | ? | ? | ? | ?
————————————+———————+—————————+——————————+———————
private | ? | ? | ? | ?
____________+_______+_________+__________+_______
my Modifier | ? | ? | ? | ?
____________+_______+_________+__________+_______
Run Code Online (Sandbox Code Playgroud)
是否有一种解决方法来拥有这种修饰符?
也许有办法让一个包最终,所以其他程序员不能在我的包中添加任何类?
或者有没有办法获取调用该函数的实例,并检查这个是否是我的super对象的实例?
或者我只需要离开它,只使用受保护的,其他程序员可能会在我的包中添加类...
我的儿子(11岁)正在学习Java,他将输入一个问题和一些代码.他告诉我他无法在网站上找到这个问题的答案.您将阅读我的问题的编辑版本.非常感谢.
如何在java中检测到按键,我的IDE被称为eclipse,我已经创建了一些类.我在互联网的keyconfigofplayer中找到了代码并将其更改为扩展播放器类.我想要它,所以当我按住一个矩形或椭圆形键移动屏幕时,我怎么能这样做?由于某种原因,它不会正确输入代码,这就是为什么我的导入没有星号,看起来很奇怪.对于那个很抱歉.请忽略它.我无法解决这个问题:(.这是我的代码:
窗口代码:
import javax.swing.*;
import java.awt.*;
public class window {
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setSize(600, 600);
player p = new player();
f.add(p);
keyconfigofplayer key = new keyconfigofplayer();
p.add(key);
f.add(key);
}
}
Run Code Online (Sandbox Code Playgroud)
//this class is the player graphic
import javax.swing.*;
import java.awt.*;
public class player extends JPanel {
int x = 50;
int y = 50;
public void paint() {//This is where the graphic …Run Code Online (Sandbox Code Playgroud) 最近我遇到了以下代码:
enum Animals {
DOG("woof"), CAT("meow"), FISH("burble");
String sound;
Animals(String s) {
sound = s;
}
}
class TestEnum {
static Animals a;
public static void main(String[] args) {
System.out.println(a.DOG.sound + " " + a.FISH.sound);//Expected compilation failure
}
}
Run Code Online (Sandbox Code Playgroud)
我希望代码因为这a.DOG.sound部分而无法编译.但令我惊讶的是,事实并非如此.我四处搜索,包括官方文档,以找出访问级别,但一无所获.是公开的还是默认的?
通常,在我自己的项目中,我使用getter和setter进行任何字段访问,然后我按照我的工作做同样的事情.前段时间,我们项目的技术负责人问我为什么这样做,为什么这比仅仅使用字段本身更好(如果需要通过子类访问,可以选择声明它们受保护).我无法得出一个明确的答案.
那么,是否有任何理由在类的自己的字段中使用getter和setter,或者直接使用字段是否更好?
java ×9
oop ×2
public ×2
class ×1
eclipse ×1
enums ×1
inheritance ×1
internal ×1
java-9 ×1
java-platform-module-system ×1
keylistener ×1
keypress ×1
methods ×1
protected ×1
swift ×1
swing ×1
visibility ×1