Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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中的实例变量是否不允许使用某些访问修饰符?_Java - Fatal编程技术网

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; }
}