Java:为什么接口中的声明不够?
大类包含格式实例和格式类。Format类包含方法,接口包含字段的值。我可以将字段设置为类格式,但目标是使用接口。那么,我是否只是创建虚拟变量来消除错误、设计问题或其他问题 键:声明与初始化Java:为什么接口中的声明不够?,java,interface,initialization,declaration,Java,Interface,Initialization,Declaration,大类包含格式实例和格式类。Format类包含方法,接口包含字段的值。我可以将字段设置为类格式,但目标是使用接口。那么,我是否只是创建虚拟变量来消除错误、设计问题或其他问题 键:声明与初始化 用术语解释,为什么必须在接口中初始化 背后的逻辑是什么 它会导致什么样的问题使用接口 出现init接口问题的示例代码 import java.util.*; import java.io.*; public class FormatBig { private static class Fo
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
中,这样您只需编辑和编译一个文件。那是懒惰。或者,如果您这样做是为了组织代码,请学习如何使用Java包FormatBig
- @汤姆已经回答了你的直接问题。基本上,您不能在接口中声明实例级属性(或类级变量)。实例级属性必须在类中声明
如果希望多个类共享相同的属性声明,可以