java中的实例变量是否不允许使用某些访问修饰符?
我有一段代码如下:java中的实例变量是否不允许使用某些访问修饰符?,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
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,因此不是实例变量,也不是真正的默认值(因为如果没有技巧,您无法真正更改
final
基本类型变量的值)
default
修饰符未指定实例变量具有默认值。这就像[accessmodifiers]Type name=value
一样,即intwindowheight=960代码>一个ctor或SETER然后可以用您想要的值覆盖它
相反,default
修饰符用于声明/定义具有默认实现的接口方法
考虑以下示例:
interface IntSet {
Set<Integer> getSet();
default boolean setContains(int x) { return getSet().contains(x); }
}
请注意,这比简单地调用set.contains(x)
更有效。首先,您的变量是静态final,因此不是实例变量,也不是默认值(因为如果没有技巧,您无法真正更改final
基本类型变量的值)
default
修饰符未指定实例变量具有默认值。这就像[accessmodifiers]Type name=value
一样,即intwindowheight=960代码>一个ctor或SETER然后可以用您想要的值覆盖它
相反,default
修饰符用于声明/定义具有默认实现的接口方法
考虑以下示例:
interface IntSet {
Set<Integer> getSet();
default boolean setContains(int x) { return getSet().contains(x); }
}
请注意,这比简单地调用set.contains(x)
更有效,因为您使用了static
,这些实际上不是实例变量。您误解了短语default access modifier,它指的是默认情况下在未指定访问修饰符时假定的访问级别,它是包级别私有的(只有同一个包中的任何东西可以看到它),这并不意味着Literal默认值keyword@Teedeez是正确的;默认值(即包专用)如果不编写访问修饰符,您将获得访问权限。default
关键字不是访问修饰符,它用于switch
语句中的默认情况,以及接口中的默认方法实现。它还用于表示注释的默认值。由于您使用了static
,因此它们是not实际上是实例变量。您误解了短语default access modifier,它意味着默认情况下假定的访问级别,当没有指定访问修饰符时,它是包级别私有的(只有同一个包中的任何东西可以看到它),它并不意味着literal默认值keyword@Teedeez是正确的;默认值(即包专用)如果不编写访问修饰符,您将获得访问权限。default
关键字不是访问修饰符,它用于switch
语句中的默认情况,以及接口中的默认方法实现。它还用于表示注释的默认值。
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; }
}