精华内容
下载资源
问答
  • java 参数传递

    2011-01-18 14:54:43
    java中参数的传递类型 ...方法调用时,实际参数的引用(地址,而不是参数的值)传递给方法中相对应的形式参数,方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响...

    java中参数的传递类型

     

    首先说明一下什么是值传递, 什么是引用传递。

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
    引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

     

    我认为java中所有函数调用都是值传递。

     

    java中有两种数据类型: 1 基本数据类型, 2 引用类型。

     

    对基本数据类型: 大家都知道是值传递。

     

    对引用类型: 也是值传递

     

     

    下面举例说明

     

    例一:

     

    public class Test{

     

             Integer i1 = new Integer(1);

     

             Integer i2 = new Integer(2);

     

     

             void swap(Integer a, Integer b) {

     

                          Integer temp = a;

     

                         a = b;

     

                         b = temp;

     

     

                        //b = a+b;

     

                        //System.out.println(b + " "+ temp + (temp==b));     //Integer的数据结构就是一个private final int value;因此temp != b

     

              }

     

     

           public static void main(String[] args) {

     

                        Test test = new Test();

     

                        test.swap(test.i1, test.i2);

     

                       System.out.println("i1 = "+test.i1 + " i2 = "+test.i2);

     

             }

     

    }

     

     

     

    运行结果:

     

    //3 1 false

     

    i1 = 1 i2 = 2

     

    如果是引用传递, 结果应为 i1=2 i2 = 1, 即交换i1与i2的值。

     

     

     

    例二:

     

    class Test{

     java.util.List<Integer> str1 = new java.util.ArrayList<Integer>();

     

    java.util.List<Integer> str2 = new java.util.ArrayList<Integer>();

     

     

    Test() {

     

    for(int i = 1; i< 11; i++) {

     

    str1.add(i);

     

    str2.add(11-i);

     

    }

     

    }

     

     

     

    void swap(java.util.List<Integer> a, java.util.List<Integer> b){

     

    System.out.println("a = "+a+" b = " + b);

     

    java.util.List<Integer> temp = a;

     

    a = b;

     

    b = temp;

     

    a.addAll(str1);

     

    b.addAll(str2);

     

    System.out.println("a = "+a+" b = " + b);

     

    System.out.println("temp = "+temp);

     

    }

     

     

     

    public static void main(String[] args){

     

    Test test = new Test();

     

    test.swap(test.str1, test.str2);

     

    System.out.println("a = " + test.str1+" b = " + test.str2);

     

    }

     

    }

     

    结果:

     

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] b = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

     

    a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

     

    temp = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

     

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] b = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

     

    第二行与第四行输出并不一样., a 与 b 没有交换

     

     

     

    解释:

     

    一个变量就是一个存储位置。也就是一个指针。当我们给一个变量赋值时, 即为把这个变量所指的内容改为所赋的值。

     

    比如, int a 语句, 在内存中申请一个长度为4个字节的连续空间, 并把这一空间的开始位置记为a.

     

    a = 0; 即把a~a+3所指的内容改为0.

     

    例一中:  i1, i2 的内容是指向一个int类型的指针,  swap调用时, 将i1的内容复制给a, i2 的复制给b, 因而交换和改变a, b, i1, i2的内容并没有改变,

    例二中: 可以看到, 交换a, b的值, str1, str2 的值没有被交换而改变a, b, str1, str2也被改变了,

    这是由于在交换了a b的值以后, a, str2 指向同一位置, b,str1指向同一个位置,而ArrayList中有一个Object[]即Object*类型的变量用来存储数据, 改变str2中存储的值就是改变Object[], 从而a 也被改变了。 

     

    更多请参考, 谭浩强版C语言中关于值传递的描述和java ArrayList 中的属性及ensureCapacity方法的实现。

     

    展开全文
  • 可达性分析算法一般认为GC回收采用可达性分析算法::从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。 java可以作为GC Roots的对象有以下几种:...

     接上一篇的java内存模型,这一篇记录一下GC垃圾回收的算法,说道垃圾回收,首先说说什么情况下会被回收。

    一 垃圾回收算法

    1.可达性分析算法

    一般认为GC回收采用可达性分析算法::从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。

     

    在java中可以作为GC Roots的对象有以下几种:

    虚拟机栈中引用的对象、方法区类静态属性引用的对象、方法区常量池引用的对象、本地方法栈JNI引用的对象

    虽然这些算法可以判定一个对象是否能被回收,但是当满足上述条件时,一个对象 不一定会被回收。当一个对象不可达GC Roots时,这个对象并不会马上被回收,而是处于一个死缓的阶段,若要被真正的回收需要经历两次标记。如果对象在可达性分析中没有与GC Roots的引用链,那么此时就会被第一次标记并且进行一次筛选,筛选的条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者已经被虚拟机调用过,那么就认为是没必要的。

    2.标记/清除算法

     标记清除算法是垃圾处理器最初的清理算法,也是最基础的清理算法,了解了这个后边两个基本就清楚了。

    标记,清除算法,字面意思就是先标记,再清除

    标记阶段:标记所有GC roots不可达的对象,进行标记

    清除阶段:对上面标记过的对象进行清除回收

    回收前状态:

    回收后状态:

    缺点:

        1.回收时需要先停止虚拟机的工作,就是stop the world.

        2.标记清除要遍历整个堆,效率低

      3.清除后会产生大量碎片区域,无法为大对象分配连续的内存


    3 复制算法

    复制算法是在标记清除的基础上改进的,把内存区域平分为两个部分,每次新建对象只在一个区域内操作,

    分为两个阶段

    1.复制阶段:当堆内存不足时,先停掉jvm工作,把GCRoots可达的对象(即不可回收的对象)复制到另一半内存空间,在新的区域按顺序排列,重新分配对象的引用。

    2.清楚阶段:原来的内存区域都是需要回收的对象,对整个区域进行一次full gc


    优点:不会产生大量的碎片空间

    缺点:内存使用率只有一半,确实挺浪费的,垃圾回收时同样要 stop the world,如果老年对象多,则每次要复制大量对象。

    改进:

    现代的商用虚拟机一般都采用这种方法回收新生代,IBM的研究表明,新生代有98%的内存都是需要回收的,大部分都是朝生夕死。内存不必1:1分配,将内存划分为一块较大的Eden空间和两块较小的Survivor空间每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活的对象一次性地复制到另外一块Survivor空间,最后清理掉Eden和刚才用过的Survivor空间,清理完成后,刚刚被清理的Eden和另一块在回收时放入存活对象的Survivor空间作为使用内存,刚被清理的Survivor作为保留空间,以便后面用来回收之用。

    这种改进的收集算法也有一个问题,就是在回收时,那块空的Survivor空间能否放得下Eden和使用的Survivor空间中还存活的对象,如果Survivor空间不够存放上一次新生代收集下来的存活对象,此时就需要向老年代“借”内存,那些剩余未放下的对象就通过分配担保机制进入老年代。
    复制算法的执行过程如下:
    回收前的状态:

    回收后的状态:



    4.标记整理算法

    复制算法如果在对象存活率较高时,就需要进行较多次的复制操作,效率也会变低。而对于老年代中的对象,一般存活率都较高,因此需要选用其他收集算法:标记 - 整理算法。标记过程仍然与“标记-清除”算法中一样,但是在标记完成后并不直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。算法示意图如下:
    回收前状态;

    回收后状态:

    5.分代收集算法

    当前商业虚拟机都采用这个“分代收集”算法(Generation Collection),它根据对象存活周期的不同将内存划分为几块,一般是把java堆分为新生代和老年代,根据各个年代的特点选用不同的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,因此可以选用“复制算法”,此时只需要付出少量存活对象的复制成本即可;对于老年代,因为对象存活率较高、也没有额外空间为期分配担保,就必须使用“标记-清除”或“标记-整理”算法来进行回收。


    二 垃圾收集器总结

    这部分摘自网络

    如果说上面介绍的收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现,按照上面的介绍,目前垃圾收集器基本都采用分代收集,因此一个垃圾收集器中一般都存在多种垃圾回收算法。不同的虚拟机提供的垃圾收集器也有很大差异,如下是HotSpot虚拟机基于JDK1.7版本所包含的所有垃圾收集器:

    HotSpot中共有7中不同的垃圾收集器,如果两个收集器之间存在连线,说明它们之间可以搭配使用,其中,Serial、ParNew、Parallel Scavenge属于新生代收集器,CMS、Serial Old、Parallel Old属于老年代收集器,G1是最新的一种收集器,在新生代和老年代中都可使用。

    3.1 Serial(串行)收集器

    最基本、发展历史最悠久的一种收集器。看名字就知道,这个收集器是一个单线程的收集器,只使用一个CPU或一条收集线程去完成垃圾收集工作,最重要的是,在它进行垃圾收集的时候,必须暂停其他所有的工作线程,知道它收集结束。虽然有这个缺点,但是依然是虚拟机运行在Client模式下的默认新生代收集器。优点是:简单而高效,没有线程交互的开销。运行过程如图:

    新生代采用的是“复制算法”,老年代采用的是“标记-整理”算法。

    3.2 ParNew收集器

    ParNew收集器其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其他行为和Serial收集器一样。ParNew是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关的重要原因,除了Serial收集器外,目前只有ParNew能与老年代的CMS收集器配合使用。ParNew是一种并行的收集器。在垃圾回收中,并行是指:多条垃圾收集线程并行工作,用户线程处于等待状态;并发是指:用户线程和垃圾收集线程同时执行(不一定并行,可能交替执行)。

    3.3 Parallel Scavenge收集器

    Parallel Scavenge收集器使用的是复制算法,也是一个并行的多线程收集器。和ParNew相似,但是Parallel Scavenge的关注点不同,CMS收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量,吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)。

    上面三种都是新生代收集器,下面介绍老年代收集器。

    3.4 Serial Old收集器

    Serial Old收集器是新生代Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理”算法,Serial Old的主要意义也是在于给Client模式下的虚拟机使用。

    3.5 Parallel Old收集器

    Parallel Old是新生代收集器Prarllel Scavenge的老年代版本,使用多线程和“标记-整理”算法。运行流程如下:


    3.6 CMS收集器

    CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。对于互联网站或者B/S系统的这种注重响应速度的服务端来说,CMS是很好的选择。从名字Mark Sweep可以看出,CMS是基于“标记-清除”算法实现的,分为四个步骤:
    (1)初始标记(CMS initial mark):仅仅标记一GC Roots能直接关联到的对象,这个步骤需要“stop the world”;
    (2)并发标记(CMS concurrent mark):就是GC Roots进行可达性分析阶段,可并发执行;
    (3)重新标记(CMS remark):修正并发标记期间发生变动的那一部分对象,这个步骤需要“stop the world”;
    (4)并发清除(CMS concurrent sweep):执行清除阶段。
    执行过程如下:

    可以看到,初始标记和重新标记阶段都是并行的,需要暂停用户线程(过程比较短);在并发标记和并发清除阶段是并发的,可以和用户线程一起工作。

    CMS的优点:并发收集、低停顿
    CMS的缺点:
    (1)对CPU资源非常敏感,面向并发设计程序的通病,虽然不至于导致用户线程停顿,但是会降低吞吐率;
    (2)无法清理“浮动垃圾”,由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断出现,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次的GC;
    (3)会产生大量空间碎片,因为CMS是基于“标记-清除”算法,这种算法的最大缺点就是会产生大量空间碎片,给分配大对象带来麻烦,不得不提前触发Full GC。为了解决这个问题,CMS提供了一个“-XX:+UseCMSCompaceAtFullCollection”的开关参数(默认开启),用于在CMS收集器顶不住要进行Full GC时开启内存碎片的合并整理过程

    3.7 G1收集器

    G1收集器是最新的一款收集器,JDK1.7才发布,是一种面向服务端应用的垃圾收集器,有如下特点:
    (1)并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间;
    (2)分代收集:分代概念在G1中依然得以保留。虽然G1可以不需其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果;
    (3)空间整合:与CMS的“标记-清理”算法不同,G1从整体看来是基于“标记-整理”算法实现的收集器,从局部(两个Region之间)上看是基于“复制”算法实现,无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存;
    (4)可预测的停顿时间;

    使用G1收集器时,Java堆的内存布局与就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。

    G1的收集过程分为以下几个步骤:
    (1)初始标记(Initial Marking)
    (2)并发标记(Concurrent Marking)
    (3)最终标记(Final Marking)
    (4)筛选回收(Live Data Counting and Evacuation)
    前几个步骤和CMS有很多相似之处。运行示意图如下:


    (以上图片来源于:


    展开全文
  • 1、JAVAObject的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,需要大量复制对象的情况,使用clone创建对象比new效率高; 补充下深拷贝和浅拷贝,深拷贝是通过拷贝内存(包括引用的...

    一、什么是原型模式

    通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型;

    二、补充说明

    1、JAVA中Object的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,在需要大量复制对象的情况,使用clone创建对象比new效率高;

    补充下深拷贝和浅拷贝,深拷贝是通过拷贝内存(包括引用的对象)实现对象的创建;浅拷贝不拷贝引用的对象,但拷贝了引用的值,如果类的成员属性中都是基本类型,不含对象,也是可以达到深拷贝的效果;深拷贝可以通过将对象序列化成字节流以及反序列化实现,浅拷贝直接调用clone即可;

    2、使用原型模式创建对象是没有调用类的构造方法的;

    三、角色

    原型角色(ps,也可以搞成两个,如抽象原型角色以及各个具体实现原型角色)

    四、JAVA实现例子

    java已经很好的支持原型模式了,使用很简便,如下类,实现了Cloneable接口,即成了一个原型;

    复制代码
    package com.pichen.dp.creationalpattern.prototype;
    
    public class Cell implements Cloneable{
        private int cellId;
        public int getCellId() {
            return cellId;
        }
        public void setCellId(int cellId) {
            this.cellId = cellId;
        }
        public Cell(int id) {
            this.cellId = id;
        }
        @Override
        public Object clone() throws CloneNotSupportedException
        {
            System.out.println("clone a cell obj.");
            return (Cell) super.clone();
        }
    }
    复制代码

    使用原型,复制10个拷贝:

    复制代码
    package com.pichen.dp.creationalpattern.prototype;
    
    public class Main {
    
        public static void main(String[] args) throws CloneNotSupportedException {
            Cell prototypeCell = new Cell(888);
            for(int i = 0; i < 10; i++){
                Cell copyCell = (Cell) prototypeCell.clone();
                System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId());
            }
        }
    }
    复制代码

    观察打印结果,hashcode不同,对象成员属性一致,复制成功:

    复制代码
    clone a cell obj.
    25840096:888
    clone a cell obj.
    33040770:888
    clone a cell obj.
    23930419:888
    clone a cell obj.
    15142448:888
    clone a cell obj.
    22316618:888
    clone a cell obj.
    3969559:888
    clone a cell obj.
    10175206:888
    clone a cell obj.
    21307627:888
    clone a cell obj.
    24389376:888
    clone a cell obj.
    11317592:888
    复制代码

     

    本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5183688.html,如需转载请自行联系原作者
    展开全文
  • C语言编程要点

    2017-09-18 00:10:37
    5.11. 程序加入注释的最好方法什么? 83 5.12. #include 和#include“file”有什么不同? 84 5.13. 你能指定编译时包含哪一个头文件吗? 85 5.14. 1包含文件可以嵌套吗? 85 5.15. 包含文件最多可以嵌套几层? 85...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    声明为final的变量必须声明时给定初值,而以后的引用中只能读取,不可修改。声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,...
  • 声明方法的存在而不去实现它的类叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能该类实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三...
  • c#学习笔记.txt

    热门讨论 2008-12-15 14:01:21
    委托实例封装一个或多个方法,每个方法被称为可调用实体。对于实例方法,可调用实体由一个实例和该实例上的方法组成。对于静态方法,可调用实体仅由一个方法组成。给定委托实例和适当的参数集,便可以用该参数集...
  • C#微软培训资料

    2014-01-22 14:10:17
    11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三...
  • windows 程序设计

    2011-07-24 21:16:30
    Windows上执行的程序可共享在称为「动态链接库」的文件的例程。Windows包括一个机制,能够执行时连结使用动态链接库例程的程序。Windows自身基本上就是一个动态链接库的集合。 Windows是一个图形接口,...
  • SessionBeanJ2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。  对于客户机,SessionBean是一种非持久性对象,它实现某些服务器...
  • HowNet,也被称为知网,它并不只是一个语义字典,而是一个知识系统,词汇之间的关系是其一个基本使用场景。知网包含词语 8 余条。 国际上对词语相似度算法的评价标准普遍采用 Miller&Charles 发布的英语词对集的...
  • java 面试题 总结

    2009-09-16 08:45:34
    SessionBeanJ2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些服务器上...
  • 如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统断点或者当前中断点。很多 UNIX? 系统,为了指出当前系统断点,必须使用 sbrk(0) 函数。sbrk 根据参数给出的字节数移动当前系统断点,...
  • 操作系统(内存管理)

    热门讨论 2009-09-20 12:55:25
    如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统断点或者 当前中断点。很多 UNIX® 系统,为了指出当前系统断点,必须使用 sbrk(0) 函数。 sbrk 根据参数给出的字节数移动当前系统断点,...
  • 那么主项目如何调用组件ApplicationLike的生命周期方法呢,目前采用的是基于编译期字节码插入的方式,扫描所有的ApplicationLike类(其有一个共同的父类),然后通过javassist主项目的onCreate插入调用...
  • 软件工程知识点

    2012-12-02 21:34:25
    为了方便用户系统确认期间能够积极参入,也为了系统以后的运行过程能够用户正确使用,这个时期往往还需要以一定的方式对用户进行必要的培训。 完成对软件的验收之后,软件系统可以交付用户使用,并需要以...
  • A) 如果想使程序能够正常运行,(1)处必须填写super()方法,并且super中传参给父类且同时该语句必须为Test()构造方法中的第一句。 B) 如果想使程序能够正常运行,(1)处必须填写super()方法,但是该...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    用例只描述参与者和系统交互过程做些什么,并不描述怎么做。 用例图 关联关系 用例图 泛化关系 用例图 泛化关系 用例图 用例图 用例图 用例用于什么情况? 不知道什么情况不用用例 如果没有用到用例,...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    MFC对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法: 代码如下 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd...
  • ThreadLocal通常用来共享数据,当你想多个方法中使用某个变量,这个变量是当前线程的状态,其它线程不依赖这个变量,你第一时间想到的就是把变量定义方法内部,然后再方法之间传递参数来使用,这个方法能解决...
  • 并利用具体的例子来全面介绍每个特性,不仅讨论了各个特性是什么,还说明了它是如何工作的,如何使用这个特性来开发软件,以及有关的常见陷阱。  本书面向所有oracle 数据库应用开发人员和dba。 作译者 作者  ...
  • 面向对象的需求分析方法中,建立动态模型是最主要的任务。(×) 5. 加工小说明是对系统流程图中的加工进行说明。(×) 6. 判定表的优点是容易转换为计算机实现,缺点是不能够描述组合条件。(×) 7. 需求分析的...
  • 但是文档没有实战用例,没有告诉我们哪些可行或者哪些不可行,什么情况下可行或者什么情况下不可行,为什么可行或者为什么不可行,它只是“公事公办”为你呈上厚厚的一摞文字,告诉你情况就是这样,你自己看着办吧...
  • 面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。 面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体--...
  • Karen Morton及其团队本书提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并工作加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...
  • Karen Morton及其团队本书提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并工作加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

引用在说明方法中被称为什么