首页 > 解决方案 > 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,代码编译没有错误。

替换defaultprivate也编译成功。

我认为没有指定访问修饰符的实例变量default默认具有修饰符。

我很难理解为什么有default修饰符会给我错误,但没有它不会。

解释将不胜感激=)

标签: java

解决方案


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)


推荐阅读