我想深入了解下接口 比如如下程序

问题描述

public class demo187{public static void main(String args[]){Comparable c =null;c =30; //因为Integer实现了Comparable接口 30可以自动装箱为IntegerSystem.out.println(c);}}输出结果为:30直接输出c可以输出30,应该可以确定输出是调用了toString()方法,我在想此段程序是通过向上转型实现的那么c是Compareable的实例,那么c是不可以实现非接口里面的方法的,那为什么还可以调用toString()方法输出30呢?照理说toString()方法是Object类中的方法,Object 类又是所有对象的超类,跟接口是没有关系的。 问题补充:那就是说 其实在接口中是有toString()方法的喽?

解决方案

引用而且说接口继承了Object也是不对的,只是说接口引用的对象确实有Object的功能,我们不妨做个测试,你把任何一个类前面加个extends Object,这样是可以的,但是你把接口前面放个extends Object,是编译错误的,所以至少从语义上讲,接口的不是Object的子类,只能说,接口确实拥有Object的任何方法签名。 不是,通过我上面说的这段话,说明接口不是继承object的,只是接口有了object的所有方法签名,然后在接口引用类的时候,在调用toString这种方法签名的时候,运行时动态 后绑定接口指向的类,然后就调用了这个类的toString。就相当于它有这个方法签名而已。
解决方案二:
接口中肯定有toString方法以下代码完全没问题啊:public class TestInterface {public static void main(String[] args) {A a = null;String str = a.toString();}}interface A {}
解决方案三:
javac编译器虽然对接口有限制,但我们还有其他编译器可以用,可以让接口extends Object我们使用javassist如下代码:import javassist.ClassPool;import javassist.CtClass;import javassist.NotFoundException;public class TestCompiler {public static void main(String[] args) throws Exception, NotFoundException {CtClass ctClass = ClassPool.getDefault().makeInterface("MyInterface");ctClass.setSuperclass(ClassPool.getDefault().get("java.lang.Object"));ctClass.writeFile();}}会生成一个MyInterface.class,用jd-gui反编译一下,我们就发现如下结果:public abstract interface MyInterface extends Object{}
解决方案四:
ls说的欠妥,能不能编译完全是编译器在做一些事情,如下面的代码:public class Test{static {i = 10;//System.out.println(i);}private static int i;} 加上sysout就不能编译了,其实如果编译器放宽条件完全是可以编译通过的,且也不会出现运行问题,因为上面i的内存分配肯定是在static块执行之前执行的,但编译器就是不让它通过编译。只从字节码的角度来看,编译后的超类信息就是放在ClassFile的super_class条目中。虽然从接口的Class.getSuperClass返回的结果也是null,但我个人认为这是api给它做了一个限制,这个API有这样的声明(如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null),所以,只要判断是接口,根本就不用去取super_class条目代表的Constant_Class_info了,直接返回null了
解决方案五:
而且说接口继承了Object也是不对的,只是说接口引用的对象确实有Object的功能,我们不妨做个测试,你把任何一个类前面加个extends Object,这样是可以的,但是你把接口前面放个extends Object,是编译错误的,所以至少从语义上讲,接口的不是Object的子类,只能说,接口确实拥有Object的任何方法签名。不知道我的回答你满意不
解决方案六:
引用那么c是不可以实现非接口里面的方法的这句话不对,它假如没有父类(注意 不是父接口),那么默认会继承object,所以就调用了object的toString啦。
解决方案七:
If the value of the super_class item is zero, then this class file must represent the class Object , the only class or interface without a direct superclass.For an interface, the value of the super_class item must always be a valid index into the constant_pool table. Thec onstant_pool entry at that index must be a CONSTANT_Class_info structure representing the class Object .——摘自《JVMS-JavaSE7》4.1The ClassFile Structure中的super_class
解决方案八:
接口,其实也是继承自Object的

时间: 2024-08-04 18:16:49

我想深入了解下接口 比如如下程序的相关文章

解决方案-想做一个新闻接口,可以实现获取新闻频道,获取某频道下的新闻列表,获取新闻详细信息。

问题描述 想做一个新闻接口,可以实现获取新闻频道,获取某频道下的新闻列表,获取新闻详细信息. 想做一个新闻接口,可以实现获取新闻频道,获取某频道下的新闻列表,获取新闻详细信息,但是苦于没有数据源.求各位大神能够给提供一个较全的api接口,或者给一个解决方案. 解决方案 可以通过HTTP抓取你想要的链接,然后处理拿到的HTML,解析得到你想要的内容,放在你的网站上(个人认为这里还是要取得内容所有者的同意比较好).比如PHP,可以用phphttpclient:Java可以用Apache的HttpCl

进制之间的转换-输入为“任意进制+数值”,想输出十进制下该数的数值,但怎么也输出不对,求解答!

问题描述 输入为"任意进制+数值",想输出十进制下该数的数值,但怎么也输出不对,求解答! int main() { int i=0,j,k,s=0,d=0,n=0; int q=1; int a,b; char str1[100]; char str2[100]; int num[100]; cin>>i; gets(str1); k=strlen(str1)-2; while(k>=0) { a=getnum(str1[k]); a=a*q; s=s+a; q=q*

规划网站-一个人开发一个网站,想整体规划下,在动手开发,用什么技术可以整体规划

问题描述 一个人开发一个网站,想整体规划下,在动手开发,用什么技术可以整体规划 如果不规划,容易到后面开发会推翻或修改前面的开发(代码) 经常返工! 解决方案 uml,数据建模,画流程图,前期越详细,后期越ok 解决方案二: 整体规划?确认你的功能点吧 Axure挺不错的快速原型工具 解决方案三: UML建模工具,设计先行.

我想在C#下利用GP工具调用arcgis中toolbox里的一些功能,应该怎么做呢

问题描述 我想在C#下利用GP工具调用arcgis中toolbox里的一些功能,应该怎么做呢 我想在C#下利用GP工具调用arcgis中toolbox里的一些功能,但是刚接触这个,具体编译环境怎么设置,如何调用,有谁知道请指导一下,不胜感激..... 解决方案 ArcGIS Engine中调用GP的两种方法 http://bbs.csdn.net/topics/390978045 解决方案二: ArcGIS Engine中调用GP的两种方法 http://bbs.csdn.net/topics/

即时通讯-刚开始学socket。。有个问题想要请教下

问题描述 刚开始学socket..有个问题想要请教下 我编的是最简单的一个即时通讯,客户端连接,然后服务端接收,客户端中的连接按键有这些代码,但是运行后出现debug assertion failed sockcore.cpp 644,我反复检查了代码感觉没有错误啊 BYTE nFild[4]; CString sIP; UpdateData(); m_ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]); sIP.Format("%d

请教下各位大神 我在用aws s3 bucket~我想让bucket下的文件上传后可以在公网访问~ 但是我开放后访问一直是401.。unauthorized~~

问题描述 请教下各位大神我在用awss3bucket~我想让bucket下的文件上传后可以在公网访问~但是我开放后访问一直是401..unauthorized~~

想用C# wpf做一个多语言切换的程序,要求是可以拷贝语言文件到程序的某个文件夹下,点击程序的语言菜单就会显示出可以切换到这种语言。

问题描述 想用C#wpf做一个多语言切换的程序,要求是可以拷贝语言文件到程序的某个文件夹下,点击程序的语言菜单就会显示出可以切换到这种语言.语言文件是由自己生成的.比如拷贝阿拉伯语言文件,运行程序后,语言下拉菜单就显示多出一个阿拉伯,点击就可以动态切换到阿拉伯语,我想问现在用什么方法做这个好啊.求大虾们指点. 解决方案 解决方案二:参阅上述网页解决方案三:嗯,我先看看

在.NET下编写中文代码程序

程序|中文 在.NET下编写中文代码程序 郑佐2005-3-9 一年前,有一次在用Access数据库编程的时候,通过VS.NET数据设计器向导生成数据层代码,查看生成的代码,发现有许多中文,原来数据库中的表名和字段名用的就是中文,程序正常运行,查看相关文档才知道原来VS.NET默认的编码是UTF-8.不久前在一篇blog上看到讲易语言,所以干脆用VS.NET写一些中文代码来玩一下,结果就像平常写程序一样没有什么区别. 有点怪怪的味道,故把代码贴出来. using System; namespac

注册表-64位操作系统下,如何用程序实现设置管理员权限和兼容性

问题描述 64位操作系统下,如何用程序实现设置管理员权限和兼容性 在线急用.目前有一个需要在U盘上运行的程序,通过注册表来实现管理员权限和兼容性设置,(注册表位置:HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers,需要设置键名称为可执行文件的全路径,键值为WINXPSP3 RUNASADMIN),在win7 32位系统上正常,可执行文件的全路径就是盘符+目录名+文件名,但是在win7 64