子类和父接口 本帖最后由 c4a4s4d4 于 2010-09-17 15:06:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道说的对不对噢:接口可以看做是以个抽象类,它其实也是个类,由于Java是单继承,为了实现多继承,以接口的形式实现多继承。 1 javac 自动处理依赖关系。2 常量是静态连接的。 能具体解释一下第二点么?是说,编译的时候,就把接口中的常量值 放到了子类的class文件中了么? 1)当用javac Test.java时 其实现的接口也会被编译因为接口是一种特殊的抽象类 里面的变量默认为public static final 里面的方法默认为public abstract 个人认为可以理解为继承了一个抽象类 当你继承一个类的时候 当然也会编译这个抽象类啦。因为你继承了它的属性和方法2)当你只修改并编译MyInterface的时候 这时Test.class没有被改变通过反编译工具可以查看得到 它会将变量test变为字符串内容打印出来Test.class 内容:import java.io.PrintStream;public class Test implements MyInterface{ public static void main(String[] paramArrayOfString) { System.out.println("test"); }}修改MyInterface之后 这个Test.class文件并没有改变 所以还是打印出 test 字符串但是不能把MyInterface.class删除 能从理论上 讲讲第二点么?重新编译MyInterface,但是打印出来的值还不变。还不能删除,这是什么原因?期待中... ... 6楼打错字?还是?System.out.println("test");不是打印test还能再打印什么?我试验重新编译MyInterface根本没有楼主说的这种情况。不知道你们都运行过没?还是我的理解错误了。 无语给你· 改了接口的代码之后··编译··然后执行子类的文件1!!!!!首先·你的第一个问题··为什么生成了两个class文件(接口的class文件也编译了)?这是因为子类对象本身包含了一个父类的对象··即使是接口也是一样的··当你编译子类的文件的时候··内存里堆空间里有一个子类的对象··它内部包含有一个父类对象··所以会产生两个class文件··然后·你的第二个问题···编译它javac MyInterface.java,然后执行java Test依旧显示:test为什么?你去编译了父接口··然后执行了子类文件··你说··会改变吗?重新编译和执行子类的文件·· 因为接口中声明的变量时pubic static final 不可改变其值的 修改一下Test类如下:import java.lang.reflect.Field;public class Test implements MyInterface{ public static void main(String[] args){ Test t = new Test(); Class c = t.getClass(); Class[] classes = c.getInterfaces(); for (int i = 0; i < classes.length; i++) { Field[] fields = classes[i].getFields(); for (int j = 0; j < fields.length; j++) { try { System.out.println(fields[j].get(null)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } }}如果这样,我该接口中的常量,只编译接口,执行子类。就能得到变化。楼上两位大虾 能解释一下原因么? 一直用eclipse还没有发现这个问题呢! XML文件 java的抽象类 select下拉框如何保存已经提交的值 线程这样写合适么? 关于置顶窗体的问题 各位大侠救命啊~~文件存取的问题!~ 简单问题,选D还是E呢 一个关于HashMap的算法 在JAVA中怎样打jar包?怎样把自己得东西发布,让别人共享呢? 提问:用Corba作开发都需要准备什么。 白痴问题:请问装tomcat时为什么需要安装jdk啊? Java Application如何制作QQ好友列表那种窗体??
是说,编译的时候,就把接口中的常量值 放到了子类的class文件中了么?
因为接口是一种特殊的抽象类
里面的变量默认为public static final
里面的方法默认为public abstract 个人认为可以理解为继承了一个抽象类
当你继承一个类的时候 当然也会编译这个抽象类啦。因为你继承了它的属性和方法2)当你只修改并编译MyInterface的时候 这时Test.class没有被改变
通过反编译工具可以查看得到 它会将变量test变为字符串内容打印出来Test.class 内容:import java.io.PrintStream;public class Test
implements MyInterface
{
public static void main(String[] paramArrayOfString)
{
System.out.println("test");
}
}修改MyInterface之后 这个Test.class文件并没有改变 所以还是打印出 test 字符串但是不能把MyInterface.class删除
重新编译MyInterface,但是打印出来的值还不变。
还不能删除,这是什么原因?
期待中... ...
System.out.println("test");
不是打印test还能再打印什么?
我试验重新编译MyInterface根本没有楼主说的这种情况。
不知道你们都运行过没?
还是我的理解错误了。
首先·你的第一个问题··为什么生成了两个class文件(接口的class文件也编译了)?
这是因为子类对象本身包含了一个父类的对象··即使是接口也是一样的··当你编译子类的文件的时候··内存里堆空间里有一个子类的对象··它内部包含有一个父类对象··所以会产生两个class文件··
然后·你的第二个问题···编译它javac MyInterface.java,然后执行java Test依旧显示:
test
为什么?
你去编译了父接口··然后执行了子类文件··你说··会改变吗?重新编译和执行子类的文件··
如下:import java.lang.reflect.Field;
public class Test implements MyInterface{
public static void main(String[] args){
Test t = new Test();
Class c = t.getClass();
Class[] classes = c.getInterfaces();
for (int i = 0; i < classes.length; i++) {
Field[] fields = classes[i].getFields();
for (int j = 0; j < fields.length; j++) {
try {
System.out.println(fields[j].get(null));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
如果这样,我该接口中的常量,只编译接口,执行子类。就能得到变化。
楼上两位大虾 能解释一下原因么?