java - java中的实例变量是否不允许某些访问修饰符?
问题描述
我有一段这样的代码:
import javax.swing.*;
public class TestGUI {
default static final int WINDOW_HEIGHT = 960;
default static final int WINDOW_WIDTH = 540;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
frame.setVisible(true);
}
}
当我编译代码时,编译器说“这里不允许修改器默认值”
如果我删除关键字default
,代码编译没有错误。
替换default
为private
也编译成功。
我认为没有指定访问修饰符的实例变量default
默认具有修饰符。
我很难理解为什么有default
修饰符会给我错误,但没有它不会。
解释将不胜感激=)
解决方案
final
首先,您的变量是静态最终变量,因此不是实例变量,也不是真正的默认值(因为没有技巧就无法真正更改原始类型变量的值)
default
修饰符不指定实例变量具有默认值。这只是作为[access-modifiers] Type name = value
,即int windowHeight = 960;
ctor 或 setter 然后可以用您想要的值覆盖它。
相反,default
修饰符用于声明/定义具有默认实现的接口方法。
考虑以下示例:
interface IntSet {
Set<Integer> getSet();
default boolean setContains(int x) { return getSet().contains(x); }
}
这很有用,因为它允许实现者利用委托,例如:
class MyIntSet implements IntSet {
private TreeSet<Integer> set;
public MyIntSet(Set<Integer> s) {
set = new TreeSet<>(s);
}
@Override Set<Integer> getSet() { return set; }
}
请注意这里的简单性:setContains
通过委托给getSet
.
但它也允许实现者提供更有效的实现:
class MyIntSet implements IntSet {
private TreeSet<Integer> set;
private int lower, upper;
public MyIntSet(int lower, int upper) {
set = new TreeSet<>();
for(int i = lower; i <= upper; i++) { set.add(i) };
this.lower = lower;
this.upper = upper;
}
@Override Set<Integer> getSet() { return set; }
@Override boolean setContains(int x) { return x >= lower && x <= upper; }
}
请注意,这比简单地调用更有效set.contains(x)
。
推荐阅读
- javascript - 我想创建一个始终播放并允许点击的动画圈
- mysql - 常规 SQL 创建表并从另一个表继承
- javascript - 有没有办法在 child_process spawn 设置超时?
- android - 使用 Android 库的 OverrideLibrary 最低版本
- reactjs - 如何将手动模拟与打字稿、反应和开玩笑一起使用?
- dart - Dart 中的命名参数
- php - 将页面中的某些元素限制为登录用户
- javascript - 离线时如何在 PWA 中显示消息?
- django - 我在 django 项目中更改了会话 cookie 名称,但无法登录
- git - git checkout 来自其他分支的不同名称的文件