Java:为什么接口中的声明不够?

Java:为什么接口中的声明不够?,java,interface,initialization,declaration,Java,Interface,Initialization,Declaration,大类包含格式实例和格式类。Format类包含方法,接口包含字段的值。我可以将字段设置为类格式,但目标是使用接口。那么,我是否只是创建虚拟变量来消除错误、设计问题或其他问题 键:声明与初始化 用术语解释,为什么必须在接口中初始化 背后的逻辑是什么 它会导致什么样的问题使用接口 出现init接口问题的示例代码 import java.util.*; import java.io.*; public class FormatBig { private static class Fo

大类包含格式实例和格式类。Format类包含方法,接口包含字段的值。我可以将字段设置为类格式,但目标是使用接口。那么,我是否只是创建虚拟变量来消除错误、设计问题或其他问题

键:声明与初始化

  • 用术语解释,为什么必须在接口中初始化
  • 背后的逻辑是什么
  • 它会导致什么样的问题使用接口
  • 出现init接口问题的示例代码

    import java.util.*;
    import java.io.*;
    
    public class FormatBig
    {
    
            private static class Format implements Format
            {
                    private static long getSize(File f){return f.length();}
                    private static long getTime(File f){return f.lastModified();}
                    private static boolean isFile(File f){if(f.isFile()){return true;}}
                    private static boolean isBinary(File f){return Match.isBinary(f);}
                    private static char getType(File f){return Match.getTypes(f);}
                    private static String getPath(File f){return getNoErrPath(f);}
                    //Java API: isHidden, --- SYSTEM DEPENDED: toURI, toURL
    
    
                    Format(File f)
                    {
                      // PUZZLE 0: would Stack<Object> be easier?
                            size=getSize(f);
                            time=getTime(f);
                            isfile=isFile(f);
                            isBinary=isBinary(f);
                            type=getType(f);
                            path=getPath(f);
    
                        //PUZZLE 1: how can simplify the assignment?
                            values.push(size);
                            values.push(time);
                            values.push(isfile);
                            values.push(isBinary);
                            values.push(type);
                            values.push(path);
                    }
            }
    
            public static String getNoErrPath(File f)
            {
                    try{return f.getCanonicalPath();
                    }catch(Exception e){e.printStackTrace();}
            }
    
            public static final interface Format
            {
                    //ERR: IT REQUIRES "="
                    public long size;
                    public long time;
                    public boolean isFile=true;   //ERROR goes away if I initialise wit DUMMY
                    public boolean isBinary;
                    public char type;
                    public String path;
                    Stack<Object> values=new Stack<Object>();
            }
    
            public static void main(String[] args)
            {
                    Format fm=new Format(new File("."));
                    for(Object o:values){System.out.println(o);}
            }
    }
    
    import java.util.*;
    导入java.io.*;
    公共类大
    {
    私有静态类格式实现了
    {
    私有静态long getSize(文件f){返回f.length();}
    私有静态长getTime(文件f){return f.lastModified();}
    私有静态布尔值isFile(文件f){if(f.isFile()){return true;}}
    私有静态布尔值isBinary(文件f){return Match.isBinary(f);}
    私有静态字符getType(文件f){return Match.getTypes(f);}
    私有静态字符串getPath(文件f){return getNoErrPath(f);}
    //Java API:isHidden,---依赖于系统的:toURI,toURL
    格式(文件f)
    {
    //谜题0:堆叠会更容易吗?
    size=getSize(f);
    时间=获取时间(f);
    isfile=isfile(f);
    isBinary=isBinary(f);
    type=getType(f);
    path=getPath(f);
    //难题1:如何简化作业?
    值。推送(大小);
    值。推送(时间);
    push(isfile);
    push(isBinary);
    值。推送(类型);
    值。推送(路径);
    }
    }
    公共静态字符串getNoErrPath(文件f)
    {
    尝试{返回f.getCanonicalPath();
    }catch(异常e){e.printStackTrace();}
    }
    公共静态最终接口格式
    {
    //错误:它需要“=”
    公共长尺寸;
    公众参与时间长;
    public boolean isFile=true;//如果我初始化wit DUMMY,错误就会消失
    公共布尔是二进制的;
    公共字符类型;
    公共字符串路径;
    堆栈值=新堆栈();
    }
    公共静态void main(字符串[]args)
    {
    格式fm=新格式(新文件(“.”);
    对于(对象o:values){System.out.println(o);}
    }
    }
    
    接口中的字段是隐式的
    公共最终静态的

    static
    意味着它们独立于实例。这可能不是你想要的

    final
    意味着在类初始化过程中需要精确分配一次,因为字段也是
    静态的
    。这通常意味着在声明中赋值,但可以使用静态初始化器。如果它们是实例字段(非静态),则需要在声明、构造函数(隐式或显式调用超级,而不是“
    ”构造函数)或实例初始化器中分配它们


    您可能应该将实例字段移动到实现类中,并将它们标记为
    final

    接口中的字段隐式地
    公共final static

    static
    意味着它们独立于实例。这可能不是你想要的

    final
    意味着在类初始化过程中需要精确分配一次,因为字段也是
    静态的
    。这通常意味着在声明中赋值,但可以使用静态初始化器。如果它们是实例字段(非静态),则需要在声明、构造函数(隐式或显式调用超级,而不是“
    ”构造函数)或实例初始化器中分配它们


    您可能应该将实例字段移动到实现类中,并将它们标记为
    final

    @Tom已经回答了您的直接问题。基本上,您不能在接口中声明实例级属性(或类级变量)。实例级属性必须在类中声明

    如果希望多个类共享相同的属性声明,可以将它们放入抽象超类中。但最佳实践是将属性声明为
    private
    ,并通过getter和setter访问它们

    您的代码还有几个其他问题:

    • 不能在同一命名空间中声明具有相同名称的类和接口。您有一个名为
      Format
      的类,它实现了一个名为
      Format
      的接口,这两个接口都在
      FormatBig
      的命名空间中声明。即使可以(例如,因为它们是在不同的名称空间中声明的),这也是一种糟糕的做法。为类和接口指定不同的名称

    • 您应该谨慎地使用嵌套类。在我看来,为了方便起见,您可能已经将
      Format
      类和接口嵌套在
      FormatBig
      中,这样您只需编辑和编译一个文件。那是懒惰。或者,如果您这样做是为了组织代码,请学习如何使用Java包


      • @汤姆已经回答了你的直接问题。基本上,您不能在接口中声明实例级属性(或类级变量)。实例级属性必须在类中声明

        如果希望多个类共享相同的属性声明,可以