情况是这样的. 如上代码 A a = new B(); B为A的实现类. 那么a指向为B的实体.
但是,A作为一个接口. java规定 接口的指针只能使用自己的抽象方法,不过所有的类的都属于Object的子类.所以都会有Object的方法.
这很像USB接口, A a = null; A只是针对这个接口编程, 至于如何实现那就是B的事情, 我只想用a的某某方法就可以了.
c()方法a是看不见的. 就像USB口的另一端是什么东西. a是不需要关心的.
(接口是否继承Object? 实现类肯定继承Object,所有 a.toString()就不奇怪了.)
你的想法不错,因为new String("hello"); 有时候没人关心到底产生了几个对象(两个). 可是不知道原理.有时候就很难使程序高效运行.
关心内存的变化好像java程序员很少考虑.因为都被垃圾回收器做了.自己调用"析构函数"(GC)还会使程序出问题.
提供程序的效率是编程永恒的主题. 但是用java编程更关心如何实现程序的逻辑. 垃圾回收功能,让编写代码变得简单了. 强制类编程.让程序结构更加严禁.
最牛的就是坚定的开源思想, 各种思想的汇聚成这个参天大树.
我做java开发的总结是, java程序员是幸福的, 因为我们总是看着别人的代码开发程序. java程序员同时也是悲哀的, 因为我们从来都不知道计算机的精华到底是什么!
如有错误请指正.
只要是对象,就能调用Object的一切方法,自然包括toString()的方法。
要调用c()这个方法,只能这样做:
B a=new B();或C a= new B();
我也看了很多的JAVA语法书,的确很少去讨论内存,内存的操纵是属于编译原理的内容,你可以去看相关的书籍。
但我可以简单给你这样说说:
堆是用来动态生成内存,也就是new出来的东西是存放在堆中,栈是用来存放局部变量,data segment是用来存放静态变量和字符串常量的。