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。基本类型的包装类怎么理解

解决方案 »

  1.   

    string s = "abc";
    先在栈中创建一个引用 s  ,然后 在 【字符串缓存区】 搜索,
    1.如果已经有"abc"字符串, 直接指向它,也就是在s所在的栈中保存下“abc"的地址
    2.如果没有"abc",那就在【字符串缓存区】中创建它, 并在s中存储它的地址string s = new string("abc")  
    1.先在栈中创建 一个引用s  ,然后是在【堆】 中 开辟一块内存存储"abc",并将s 指向这块区域 ,将该区域的地址,存储在s中 
      

  2.   

    多态,我的理解是:一张设计图纸,稍微修改就可以创建出万千种不同的对象 
    按图纸的这个理解,“多”应该是相对比 1张图设计一个具体物体  而说的吧
    多态而实现的具体事物,具有一些相似的特性
    多态的实现方法:通过接口 (父接口 (共性)  ----子接口(特性))
                     可以通过方法的重写或重载扩展出不同的功能
            
                    
    学java没多久,理解有限,希望给我扩充下
      

  3.   

    楼主的结贴率真赞!
    “2。怎么理解多态,这里的“态”指什么,为什么java的态可以是“多”的”不只是Java的态是“多”的,而是:多态是面向对象语言的基本特征之一。
    多态可以简述如下:
    有一个父类Father,含有方法diap;
    然后写一个子类Son,继承了Father。
    然后编写以下代码:
    Father fat = new Son();//Son向上转型为Father
    fat.disp();//这里调用的是子类的方法也就是说多态可以把一个派生类当做基类使用(向上转型)。
    菜鸟回答,请指教。
      

  4.   


    打错了,应该是“有一个父类Father,含有方法disp;”
      

  5.   

    1。怎么理解is-a和is-like-a这一节,作者是想表达继承应该是is-a而非is-like-a是吧,若为后者,说明你的基类没有设计好?
    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为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了。
      

  6.   

    对象的创建和生命周期一节中,怎么理解堆、栈等在java中的分配??类的生命周期从JVM加载类开始,到类退出JVM为止。这方面的内容如果想理解深刻的话,一定要去看JVM方面的东西。建议看《深入Java虚拟机》,会对整个Java程序的运行有一个本质上的了解,受益匪浅。了解J2SE之后,一定要看看JVM之类的东西,否则就会有没有吃透Java的感觉。
      

  7.   

    请问String.equals和String.compare有啥区别?有啥相同?
      

  8.   

    强烈建议把 Thinking in Java 这本书送人或者扔掉
      

  9.   

    1。怎么理解is-a和is-like-a这一节,作者是想表达继承应该是is-a而非is-like-a是吧,若为后者,说明你的基类没有设计好?我比较反感类似的文字游戏,面向对象设计中首先要考虑到组合而非继承(淡然也不是绝对的),继承就不多说了,extends。组合的基本思想就是把一个类对象作为另一个类的成员(属性),淡然好处之一就是没有打破继承带来的封装这一特性,2。怎么理解多态,这里的“态”指什么,为什么java的态可以是“多”的多态我的理解就是因为继承之后实现的,比如一个人,有某些共同的特性,然后“人”这个类可以派生出“学生”“工人”“农民”等等,这些派生出来的类有“人”的共同特点,当然也有自己的特点,这样你就可以把“人”用“学生”实例化,当然也可以用“工人”……等实例化,这不是多态吗?人可以是学生,工人,农民3。String s = "abc";与String s = new String("abc");的区别,为什么可以有这两种写法,从内存分配上解释下string s=“abc”是在堆内存的字符串常量池中声明的一个字符串(若常量池中有这个字符串的话就直接式s指向它),而String s = new String("abc");现在堆内存中声明出来一个abc,然后在字符串常量池中找有没有这样一个字符串,有的话直接使s指向常量池中的那个字符串,没有的话在常量池中创建一个相同的字符串,ok,这两个创建的过程对比一下发现后者多在对内存中创建了一个字符串,这个字符串就是个垃圾,等待没回收,前者则没有这个缺点
    4。对象的创建和生命周期一节中,怎么理解堆、栈等在java中的分配
    这个太复杂,不大容易说清楚
    5。基本类型的包装类怎么理解基本类型的包装就是宝基本数据类型编程引用数据类型,现在的话有了自动装箱拆箱机制,可以直接实现,我承认自己是个很低级很烂的程序员(现在转做c#了)
    技术这玩意看透了就像看M片,大家都喜欢看(当然有例外,呵呵),研究起来挺爽的,可是真正等到自己去用的时候就不是那么回事了,就像你跟你gf上床时候你发现你根本没有能力像M片上的男主角一样任意自由发挥,只是凑凑合合,尽快结束而已
      

  10.   


    为何?
    很多人都在推荐这本书,自己看了看也觉得还可以,虽然学习基础的时候根本没怎么看Thinking in java 。
    火龙果大哥为何如此反感此书呢?
      

  11.   

    is-a 本质上
    is-like-a 可以当XXX看待
      

  12.   

    多态是面向对象语言的基本特征之一。
    是核心思想,确实好用。
    子类重写父类的方法
    把父类类型作为参数传入
    然后就是Java虚拟机自己判断了具体匹配那个
      

  13.   

    在Java中多态应该有两种:重载与重写
    重载:一个对象的同一种行为同过接收不同的参数而产生不同的结果.
    重写:父类引用指向子类的实例,将子类当做父类来使用,在JVM运行期间JVM自动寻早相应的子类实例匹配.
      

  14.   

    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。基本类型的包装类怎么理解1.对于is-a和is-like-a的处理,就是选择继承和复合的关系判断标准,继承和复合各有各的好处,但一般比较倾向于复合,这种情况较常用;
    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,于是将他们包装起来,用对象的形式操作,当然这有一点性能的影响
    以上是我的认识
      

  15.   


    我是有点反感,原因:1:作者是什么火就去写什么,写过很多的 Thinking in XXXX 系列,不是一位专注某个领域的技术作者
    2:此书看似很高深,有些语言晦涩难懂不知道在说什么,我不知道是作者故意的,还是本来就是这样
    3:看过此书的人,成天就纠结于什么东西放在 JVM 内存栈上,什么东西放在 JVM 内存堆上,new String 产生了多少个对象之类,一直问这些问题就算不反感这本书,也会变得反感的。如果认为这本书好的人,那就问一下,看完这本书之后,领悟了 Java 中的哪些思想?
      

  16.   

    我是菜蛋我成长..
    我认为 String i = new String("哈哈");
    哈哈..本身就是一个String 的匿名实例化.所以比"哈哈"多了一个实例~
      

  17.   


    string s = "abc"; 它是先在常量池中找,找不到就创建 
    我还是不太明白 “红字”这段 , string s = new String("abc"); 按你的说话它的步骤是这样的:
    1.在堆中new 一个“abc”出来  
    2.再到常量 池中找"abc", 有则指向,无则创建 
     那这个时候,意思就是在2个地方存有“abc” (堆,常量池) 是吧  
      
    在别的贴子里看到这样一个问题: 
              String s = new String("abc"); 这个语句 是创建了几个对象?
      按上面的说话 应该是2个对象了
      

  18.   

    恩 !不知道为什么java很简单的东西给文字弄得很复杂。
    或者说是编者不知道怎么去表达。我想大都程序员是先用再理解的吧!很苦恼。
      

  19.   

    看到你的评论,不知有何其他推荐?
    一直没有去看什么教程之类的东西正准备看看think in java和core java。
      

  20.   


    按以下理解行不行?String s="abc";    栈              堆              常量池
        s-->                         "abc"
            s直接指向"abc"String s=new String("abc");    栈              堆              常量池
        s-->      new String()-->    "abc"
          s指向newString(),new String()再指向"abc"
      

  21.   


    core java俺觉着挺好,内容详实,相当于一个精华版api。我是从core java开始学习的,看完之后确实觉得没有看thinking in java的必要了,可以针对性的看看其他类型的书了。
      

  22.   

    多态:一种形式多种表现,其实跟变态差不多。jvm运行时,有一个 运行时数据区就是在内存中开辟的由虚拟机管理的空间。他分为  栈区,堆区,方法区。
    方法区主要放 方法的字节码与静态变量。堆区放对象包括实例变量。栈区是方法调用栈,里面是栈帧,栈帧里面包括方法的局部变量,参数等。
    去看 孙卫琴的 java面向对象编程好了,比较符合中国人的阅读习惯。