3Q先~,不废话,上菜鸟我的问题:1。怎么理解is-a和is-like-a这一节,作者是想表达继承应该是is-a而非is-like-a是吧,若为后者,说明你的基类没有设计好?2。怎么理解多态,这里的“态”指什么,为什么java的态可以是“多”的3。String s = "abc";与String s = new String("abc");的区别,为什么可以有这两种写法,从内存分配上解释下4。对象的创建和生命周期一节中,怎么理解堆、栈等在java中的分配5。基本类型的包装类怎么理解
调试欢乐多
先在栈中创建一个引用 s ,然后 在 【字符串缓存区】 搜索,
1.如果已经有"abc"字符串, 直接指向它,也就是在s所在的栈中保存下“abc"的地址
2.如果没有"abc",那就在【字符串缓存区】中创建它, 并在s中存储它的地址string s = new string("abc")
1.先在栈中创建 一个引用s ,然后是在【堆】 中 开辟一块内存存储"abc",并将s 指向这块区域 ,将该区域的地址,存储在s中
按图纸的这个理解,“多”应该是相对比 1张图设计一个具体物体 而说的吧
多态而实现的具体事物,具有一些相似的特性
多态的实现方法:通过接口 (父接口 (共性) ----子接口(特性))
可以通过方法的重写或重载扩展出不同的功能
学java没多久,理解有限,希望给我扩充下
“2。怎么理解多态,这里的“态”指什么,为什么java的态可以是“多”的”不只是Java的态是“多”的,而是:多态是面向对象语言的基本特征之一。
多态可以简述如下:
有一个父类Father,含有方法diap;
然后写一个子类Son,继承了Father。
然后编写以下代码:
Father fat = new Son();//Son向上转型为Father
fat.disp();//这里调用的是子类的方法也就是说多态可以把一个派生类当做基类使用(向上转型)。
菜鸟回答,请指教。
打错了,应该是“有一个父类Father,含有方法disp;”
is-a:继承关系;is-like-a:继承关系或覆写(接口)关系 。
2。怎么理解多态,这里的“态”指什么,为什么java的态可以是“多”的
“态”指的是当前对象在继承链上所充当的角色。“多”并不是多继承的意思,而是父类(接口)可以被多个子类继承(覆写),也指父类充当多种“身份”。
3。String s = "abc";与String s = new String("abc");的区别,为什么可以有这两种写法,从内存分配上解释下
String s = "abc":字符串"abc"是被存放在数据段的,并没有真正创建一个对象。而String s = new String("abc");是在堆里创建了一个字符对象。
4。对象的创建和生命周期一节中,怎么理解堆、栈等在java中的分配
堆里一般存放对象实体,栈里一般存放对象的引用。当对象没有任何引用时,就会被虚拟机回收内存。
5。基本类型的包装类怎么理解
基本类型不用new来创建变量,而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”,并置于堆栈中,因此更加高效。
为了能将基本类型视为对象来处理,并能连接相关的方法,Java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了。
4。对象的创建和生命周期一节中,怎么理解堆、栈等在java中的分配
这个太复杂,不大容易说清楚
5。基本类型的包装类怎么理解基本类型的包装就是宝基本数据类型编程引用数据类型,现在的话有了自动装箱拆箱机制,可以直接实现,我承认自己是个很低级很烂的程序员(现在转做c#了)
技术这玩意看透了就像看M片,大家都喜欢看(当然有例外,呵呵),研究起来挺爽的,可是真正等到自己去用的时候就不是那么回事了,就像你跟你gf上床时候你发现你根本没有能力像M片上的男主角一样任意自由发挥,只是凑凑合合,尽快结束而已
为何?
很多人都在推荐这本书,自己看了看也觉得还可以,虽然学习基础的时候根本没怎么看Thinking in java 。
火龙果大哥为何如此反感此书呢?
is-like-a 可以当XXX看待
是核心思想,确实好用。
子类重写父类的方法
把父类类型作为参数传入
然后就是Java虚拟机自己判断了具体匹配那个
重载:一个对象的同一种行为同过接收不同的参数而产生不同的结果.
重写:父类引用指向子类的实例,将子类当做父类来使用,在JVM运行期间JVM自动寻早相应的子类实例匹配.
2.对于多态就是同一类事物用一个基类表示,具体的这些事物的行为(在基类的抽象行为,而在具体的子类中有具体的行为)可以以基类身份(抽象的结果)但这个或那个具体事物的形态去执行,如
一个抽象父类Father和一个子类Son
Father father = new Son(); // Father的身份,Son的形态的体现
Son.doMethod(); 以上是多态的典型体现;
3.String s = 'abc'; 和 String s = new String('abc'); 前者是赋值,后者是在堆中创建一个对象,并将对象给变量s指向;4.本人认为虚拟机的行为,编程思想只是大概讲了讲,要研究对象的创建和生命周期需要研究Java虚拟机的实现,对于刚入门的学生来说先不急于理解,要想理解其复杂的算法,数理模型基础首先要搞懂;5.Java是一个面向对象的语言,所以基本类型的操作也要纳入对象操作,但基本类型并不是继承自Object,于是将他们包装起来,用对象的形式操作,当然这有一点性能的影响
以上是我的认识
我是有点反感,原因:1:作者是什么火就去写什么,写过很多的 Thinking in XXXX 系列,不是一位专注某个领域的技术作者
2:此书看似很高深,有些语言晦涩难懂不知道在说什么,我不知道是作者故意的,还是本来就是这样
3:看过此书的人,成天就纠结于什么东西放在 JVM 内存栈上,什么东西放在 JVM 内存堆上,new String 产生了多少个对象之类,一直问这些问题就算不反感这本书,也会变得反感的。如果认为这本书好的人,那就问一下,看完这本书之后,领悟了 Java 中的哪些思想?
我认为 String i = new String("哈哈");
哈哈..本身就是一个String 的匿名实例化.所以比"哈哈"多了一个实例~
string s = "abc"; 它是先在常量池中找,找不到就创建
我还是不太明白 “红字”这段 , string s = new String("abc"); 按你的说话它的步骤是这样的:
1.在堆中new 一个“abc”出来
2.再到常量 池中找"abc", 有则指向,无则创建
那这个时候,意思就是在2个地方存有“abc” (堆,常量池) 是吧
在别的贴子里看到这样一个问题:
String s = new String("abc"); 这个语句 是创建了几个对象?
按上面的说话 应该是2个对象了
或者说是编者不知道怎么去表达。我想大都程序员是先用再理解的吧!很苦恼。
一直没有去看什么教程之类的东西正准备看看think in java和core java。
按以下理解行不行?String s="abc"; 栈 堆 常量池
s--> "abc"
s直接指向"abc"String s=new String("abc"); 栈 堆 常量池
s--> new String()--> "abc"
s指向newString(),new String()再指向"abc"
core java俺觉着挺好,内容详实,相当于一个精华版api。我是从core java开始学习的,看完之后确实觉得没有看thinking in java的必要了,可以针对性的看看其他类型的书了。
方法区主要放 方法的字节码与静态变量。堆区放对象包括实例变量。栈区是方法调用栈,里面是栈帧,栈帧里面包括方法的局部变量,参数等。
去看 孙卫琴的 java面向对象编程好了,比较符合中国人的阅读习惯。