精华内容
下载资源
问答
  • 封装:指的是将对象实现细节隐藏起来,然后通过一些...多态:多态指的是子类对象可以直接赋给父类变量,但运行时依然表现子类的行为特征,这意味着同一类型的对象在执行同一方法时,可能表现出多种行为特征。 ...

    封装:指的是将对象实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;

    继承:继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;

    多态:多态指的是子类对象可以直接赋给父类变量,但运行时依然表现子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

    展开全文
  • 有效沟通要解决的三个基本方面

    万次阅读 2018-02-27 23:20:15
    首先事先声明:这篇博文是听了王树文老师的项目管理微课程后自己整理...所谓沟通,它是为了一设定的目标,把信息、思想和情感在个体或群体间传递达成共同协议的过程。3.要做到有效沟通,需要注意基本要素:(1...

    首先事先声明:这篇博文是听了王树文老师的项目管理微课程后自己整理的笔记,仅供学习。

    一.沟通

    1.沟通的重要性:

    我们非常清楚,在人与人之间的互动过程中,我们需要经常地与人沟通,但我们并非每一次都能沟通成功,所以沟通在人际关系的处理过程中是非常重要的。

    2.何为有效沟通?

    所谓沟通,它是为了一个设定的目标,把信息、思想和情感在个体或群体间传递达成共同协议的过程

    3.要做到有效沟通,需要注意三大基本要素:

    (1) 要有明确的目标

    所谓要有明确的目标是指,我们在和对方沟通之前,首先要想好我们这次和对方沟通应该达成怎样的目标,或者说我们希望获得怎样的结果。

    (2) 要达成彼此认可的共识

    所谓彼此认可的共识有两个含义,分别如下:

    ①第一层含义是我们和对方所达成的协议,对方是发自内心的认可和认同的。

    ②第二层含义是我们和对方所达成的协议,在当前情况和环境之下是能够被有效执行的。

    达到以上两层才是我们所提到的达成彼此认可的共识。

    (3) 要注意沟通信息、思想和情感

    一般来说,通过语言文字能传递信息,而思想和情感一般需要我们借助于声音的声调和肢体语言。有统计数据显示:语言文字能够达成8%的沟通效果;声音声调能达成37%的沟通效果;而肢体语言能传递出55%的沟通信息。

    所以我们发现:声音声调和肢体语言在人际沟通过程中是相当重要的,在所有的沟通方式中,唯有面对面的沟通方式才能够使得语言、思想、信息和情感以最少的损耗能够传递到对方。所以,这也启发我们在以后的人际沟通中,我们应该尽可能地去探讨、去倡导面对面的沟通。

    二.有效沟通要解决的三个基本方面

    首先我们来看一张图:


    那么有效沟通到底要解决哪三个基本方面呢?第一个方面就是基本问题是心态;第二个方面就是基本原理是关心;第三个方面就是基本要求是主动;那么以下我们就分别从基本问题、基本原理和基本要求这三个方面来做解析。

    1.第一个基本方面:基本问题是心态

    (1) 在人际沟通过程中,由于对方和我们所处的环境、对方所拥有的背景知识和阅历以及对方所站的立场代表的利益集团可能不同,这个时候对方的一些想法或者说对方的一些观点恐怕与我们不一定是相同的,甚至有时可能存在矛盾的地方,这个时候就需要我们以良好的心态来对待对方的一些看法和一些观点,这样我们才能够有效地和对方沟通。

    (2) 其实,在人与人之间的互动和交往甚至是合作的过程中,对方的观点、思想真正能够与我们很大程度上保持一致的时候并不多,所以这个时候我们就要抱着良好的心态去沟通。我们只有抱着良好的心态去沟通,才能够达到真正的有效沟通。另外,如果我们能够抱着良好的心态去沟通,我们就一定能够得到彼此都满意的结果,那么我们首先做一个简单的算术题。

    (3) 下面的图片就是一道简单的算术题,我们取任意一个正整数,所谓正整数就是大于等于1的整数,经过下图所示的几个步骤,我们可以得到一个结果,步骤如下:


    我们可以拿出任何一个正整数,小到1,大到10000甚至100000,甚至更大都可以,只要能够经过我们以上图片中所提到的七个步骤的运算,那么在没有算错的情况下,这个结果都是相同的,这个结果就是数字9。那么这样一个简单的算术题,对我们的沟通有何启发呢?我们做一个简单的剖析。

    (4) 一道算术题给我们的启示:

    首先我们取的数字是不同的,有人取1,有人取5,有人取10000,有人可能取100000。无论取任何数,那取的数不同就表示我们每个人的思想观点、认可和看法是不同的。那我们发现:数字不一样就代表着每个人的思想观点和看法不一样,这些不一样并非很要紧,只要我们经过合理的步骤,也就是以上所说的七个步骤。我们可以把这七个步骤类比成是七次沟通,那只要经过合理的沟通也就是我们这里所提到的合理的计算步骤就能够得到一个相同的结果,这个相同的结果我们就可以把它类比成沟通之后我们达成的共识。

    ①所以这个简单的算术题给到我们的第一个启发就是:每个人的思想观点和对某些事情的看法是不同的,但这并不是问题,我们只要能够经过合理的沟通,就能够达成彼此认可的共识。所以,我们在工作过程中如果遇到对方和我们的观点、思想境界不一样,没有关系,我们只要抱着良好的心态去找别人沟通,我们就很可能能够与对方达成真正的一致,这就是给到我们的第一个启发。

    ②第二个启发就是:我们发现我们取的一个正整数要经过以上的七个步骤的运算才能够得到一个共同的结果,我们可以把这七个步骤看作就是七次沟通,这就告诉我们当我们和对方的观点不一致的时候,我们不要期望只通过一次沟通就能够和对方达成共识,也不要期望只通过一次沟通就能够让对方认同和认可,这是很难的。我们可能需要和对方沟通一次、两次、三次,甚至沟通更多次,才能够与对方达成共识。所以,遇到问题我们需要有一种心态,这个心态就是要知道,通过某一次沟通,我们恐怕很难和对方达成共识,我们可能需要沟通多次。所以,在人际沟通过程中,如果说我们经过某一次或者某两次的沟通还没办法与对方达成共识,这个时候就要抱着一个良好的心态,千万不要逐级上火,我们只要通过正确的步骤再次沟通,多沟通1几次相信就可以和对方达成真正的共识了。

    (5) 我们要始终牢记一句话:“心态比理念更重要,理念比方法更重要,方法比工具更重要,工具比努力更重要”,所以我们刚才所提到的,在人际沟通过程中最基本的问题就是要抱着良好的心态。

    2.第二个基本方面:基本原理是关心

    (1) 作为管理者,我们经常需要和我们的下属沟通,有时也需要和我们的平级沟通、和我们的上司沟通,甚至和我们的外部客户沟通,那我们和对方沟通,一定要抱着关心对方的态度去沟通,这样的话才能够更容易达成有效的沟通。

    (2) 为什么这么说?那是因为人最关心的就是他自己。如果说我们能够首先去关心别人,无形之中就能够让对方对我们产生好感,对方会认为我们很关心他,那他反过来才可能关心我们。这就是我们经常所说的“爱出者爱返,福往者福来”,我们期望得到别人的关心,我们首先要付出自己的关心;我们期望得到别人的理解,我们首先要付出我们自己的理解。所以,沟通的第二个基本方面就是:基本原理是关心。

    (3) 在项目管理课程中,我们也经常探讨需求,我们知道需求是指理想与现状之间的差异,学过项目管理知识体系的朋友非常清楚,在项目管理知识体系中,需求指的是发起人或者客户所需要我们完成的工作事项,但作为管理者,我们需要用更高的层次来理解需求。

    (4) 在管理者的理念中,我们应该把需求这个词拆分成两个字,一个‘需’一个‘求’。管理者只有满足他人所需,他人才可能成就我们所求,所以‘需’在前‘求’在后。换句话说,我们只有首先付出关心对方,那么对方才可能反过来关心我们,特别是作为上司,在与下属的沟通过程中一定要抱着关心下属的这个原理去和下属沟通,那么这个时候我们才能够得到下属的认可与参与,我们的沟通才可能更加的有效和高效。

    3.第三个基本方面:基本要求是主动

    (1) 在职场,我们发现有比较多的人并不是主动,他们往往是差不多就行啦,换句话说,只是尽力而为,并没有做到积极主动,其实在人际沟通过程中,我们应该尽可能的都去积极主动。

    (2) 所谓积极主动指的是我们可能和对方会产生一些误会或者摩擦,这个时候可能对方并没有来找我们沟通,那我们作为当事方就应该主动地走过去和对方沟通。有时候我们心里在想,和对方产生了摩擦或者问题,而这是对方错的多一点,那对方不来主动找我,我就不会去主动找他,其实这种想法或者观点是错误的。因为人际沟通的本质其实就是双赢的,当我们和对方有了一个成功的沟通,这时候不仅我们会受益对方也会受益。所以,如果说我们和对方出现了问题,我们不去主动沟通解决,那这个时候实际上都是双输的,对方可能输了,但我们也是输的一方。所以,我们就需要积极主动地去迈出那一步,主动的去找对方沟通,并且梳理好双方存在的一些误会或者是一些误解。

    (3) 我们需要这样想:如果说我们在沟通过程中,行为上和态度上都主动了,那这个时候,在沟通的过程中,甚至包括最后的沟通结果也往往会对我们更加有利。试想一下假设原本是对方错的多一点,对方这一次没有主动来找我们沟通,而是我们主动去找对方沟通,那就会让对方对我们产生好感,从而在沟通过程中,对方可能会在某些方面给我们作出适当的让步。所以,在行动上主动了,结果上也会对我们更加有利。

    三.总结:

    1.以上我们分享的就是有效沟通要解决的三个基本方面,沟通的基本问题是心态,基本原理是关心,基本要求是主动。

    2.当然要能够具备良好的心态,总是从关心对方的角度出发,以及用主动的行为和对方沟通,要能够做到这三大方面并非易事,但如果我们具备了良好的心态,我们关心对方,我们主动与人沟通,那这个时候人际沟通方面的很多问题就可能会迎刃而解。所以在人际沟通方面,最重要的并非是沟通的技巧和技能,而是这三个基本方面能不能做到位。

    3.我们经常说一个人要改变确实很难,因为我们形成了比较根深蒂固的一些观念和观点,要改变确实不容易。但有句话说的更好:“不改变更难”。所以,在人际沟通过程中,如果我们发现沟通方面的一些问题经常困扰我们,那这个时候我们回过头来想一想,基本问题:心态好不好?基本原理:我们是不是关心对方?基本要求:我们做到主动了吗?通过这三个方面的反思,然后强化我们的行动,我们的沟通品质就会大大地改善。








    展开全文
  • Java 是值传递还是引用传递

    万次阅读 多人点赞 2019-03-20 02:40:16
    最近整理面试题,整理到值传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这题目出的很好,但是在 ...

        最近整理面试题,整理到值传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。
        首先说下我的感受,这个题目出的很好,但是在 Java 中这个题目是有问题的(在下面我会解释)。并且,有很多结论是 Java 中只有 值传递。我认为这样说不够严谨。当然如果针对 Java 语言本身来讲,Java 中只有 值传递,没有引用传递,是正确的。但是如果针对 值传递,引用传递定义来说,Java 中还是有引用传递的。下面来分析:

    一、值传递、引用传递定义


        在深入分析问题之前,先让初问者简单明白一下什么是值传递,引用传递。我先用 Java 代码解释:

    public class StringBase {
    
        public static void main(String[] args) {
            int c = 66; //c 叫做实参
            String d = "hello"; //d 叫做实参
    
            StringBase stringBase = new StringBase();
            stringBase.test5(c, d); // 此处 c 与 d 叫做实参
    
            System.out.println("c的值是:" + c + " --- d的值是:" + d);
        }
        
        public void test5(int a, String b) { // a 与 b 叫做形参
            a = 55;
            b = "no";
        }
    }


    【运行结果】
    c的值是:66 --- d的值是:hello

    可以看出通过方法传递后,int 类型与 String 类型的原值并没有受到前面 test5 方法执行后的影响,还是输出了原值。这种形为通常被说成值传递。如果原值经过 test5 方法后被改变了,这种形为通常被描述为引用传递

    定义

        值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
        引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。
        引用传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。(下面文章中 C++ 的定义,我觉得这样说更精简形象一些,所以放了两个定义,其实意思是一样的)

        以上,就是相关的定义,大家对这个定义几乎没有分歧,但是我建议大家,有必要去看看 C++ 中 值传递、引用传递的定义。因为在 C++ 中有三个定义:值传递、引用传递、指针传递,推荐一个地址: C++ 值传递、指针传递、引用传递详解

    //引用传递
    void change2(int &n) {
        cout << "引用传递--函数操作地址" << &n << endl;
        n++;
    }

        我们看上边 C++ 引用传递的代码,使用的 & 操作符。& 操作符在 C++ 中被定义为"引用",引用在 C++ 中的定义是“引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样”,再看引用其中的一个描述:“声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元”。因此这引用的概念在 Java 中根本不存在。Java 中哪有给变量起个别名的!!!
        因此说,这个题出的就有问题,在 Java 官方中我一直没有找到明确的证据说“Java 中 值传递、引用传递 的定义”我所看到的全是说 C++ 中关于值传递、引用传递的定义。但是,在 Java 中没有 C++ 里"引用"的概念。Java 里只有对象,new 关键字。这就很尴尬了,拿 C++ 中的定义,来解释 Java,我觉得这就是有问题的。问题就出在了引用传递!!!
        在 C++ 中关于引用传递的定义明确,代码解释清晰。在 C++ 中引用传递,传递的是一个别名,操作别名就跟操作原值一个样。
        然而在 Java 中,没有引用的概念,Java 中只要定义变量就会开辟一个存储单元。因此,对 Java 语言来说只有值传递,没有引用传递是正确的。
        虽然 Java 中没有引用(C++ 中 引用"&")。但是,引用传递的定义,在 Java 中还是有符合条件的。抛开语言中的特性。只针对:值传递、引用传递的定义我们来分析一下,Java 是属于值传递还是引用传递。
        要想知道 Java 是属于值传递还是引用传递,这就要从 Java 内存模型聊起了,我们来看基本数据类型与引用类型在内存中的存储方式。

    二、基本数据类型、引用类型

    1.基本数据类型、引用类型定义
        基本数据类:Java 中有八种基本数据类型“byte、short、int、long、float、double、char、boolean”
        引用类型:new 创建的实体类、对象、及数组
    2.基本数据类型、引用类型在内存中的存储方式
        基本数据类型:存放在栈内存中。用完就消失。
        引用类型:在栈内存中存放引用堆内存的地址,在堆内存中存储类、对象、数组等。当没用引用指向堆内存中的类、对象、数组时,由 GC回收机制不定期自动清理。
    3.基本类型、引用类型内存简单说明图


        好,看了基本的内存图,应该能明白 Java 是属于值传递还是引用传递。不明白,也没关系,下面会详细说明,先说引起争议的代码。

    三、在 Java 中 值传递 与 引用传递,产生模糊不清的代码

    public class TransmitTest {
    
        public static void main(String[] args) {
    
            String a = "hello"; //String 引用数据类型,调用 pass 方法后 b 的值没有改变,不是 hello
            int b = 1; //int 基本数据类型,调用 pass 方法后 a 的值没有改变,还是 1
    
            User user = new User(); //new Class 引用类型,调用 pass 方法后 name 与 age 的值改变了
            user.setName("main"); // 调用 pass 后,name 为 pass 了
            user.setAge(2); //调用 pass 后,age 为 4 了
    
            pass(user, a, b); //pass 方法调用
    
            System.out.println("main 方法 user 是:" + user.toString());
            System.out.println("main 方法 a 的值是:" + a + " --- b 的值是:" + b);
        }
    
        public static void pass(User user, String a, int b) {
    
            a = "你好";
            b = 3;
    
            user.setName("pass");
            user.setAge(4);
    
            System.out.println("pass 方法 user 是:" + user.toString());
            System.out.println("pass 方法 a 的值是:" + a + " --- b 的值是:" + b);
        }
    }
    
    class User {
    
        String name;
        int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "name = " + name + " --- age = " + age;
        }
    }

    【运行结果】
    pass 方法 user 是:name = pass --- age = 4
    pass 方法 a 的值是:你好 --- b 的值是:3
    main 方法 user 是:name = pass --- age = 4
     

        main 方法 a 的值是:hello --- b 的值是:1    结果分析,int b,实参是 1,pass 方法调用后,值还是 1 没变,说明基本数据类型是值传递,大家对这个也几乎没争议。
    争议的在下边了:
            1.String a 是引用类型,pass 方法调用后,值还是 hello 没变。(结论:好像引用类型也是值传递啊!!!)
            2.new User() 也是引用类型,在方法调用后,值居然变了。原值不应该是 name = main,age = 2 的吗?为什么 name = pass,age = 4 了呢?(结论:引用类型好像是引用传递啊???)
        这就奇葩了,String 与 new 创建的类,同为引用类型,为什么产生的结果不一样呢?String 不也是一个类吗?User 不也是一个类吗?
        有人解释说这个代码比喻的不对,应该用如下代码比喻,在 pass 方法中添加一行代码,user = new User(),pass 方法修改如下:

    public static void pass(User user, String a, int b) {
    
        a = "你好";
        b = 3;
    
        user = new User();
        user.setName("pass");
        user.setAge(4);
    
        System.out.println("pass 方法 user 是:" + user.toString());
        System.out.println("pass 方法 a 的值是:" + a + " --- b 的值是:" + b);
    }


    【运行结果】
    pass 方法 user 是:name = pass --- age = 4
    pass 方法 a 的值是:你好 --- b 的值是:3
    main 方法 user 是:name = main --- age = 2
    main 方法 a 的值是:hello --- b 的值是:1

        这样一来,改变了形参的值,但是实参没有改变。因此有人得出结论,Java 中只有值传递,没有引用传递。(我并不这么认为,原因如下)
        使用 user = new User() 这个代码来做验证,我觉得是符合 String 类型做形参时的验证地,但是,此示例不符合引用传递的验证
        在验证之前,我们先看下使用 user=new User(); 语句之前与之后的内存模型图,能有助于我们更好的验证结果,同时也有助于更好的理解 Java 内存模型。我们看 TransmitTest 类在 Java 内存模型中的存储图:

    图1 pass() 方法中没有使用 user=new User() 语句的内存模型图


        在 图1 中,main() 方法中的 user 类,与 pass() 方法中的 user 类,指向的是同一个堆内存中的 User 类,红色虚线是在 main() 方法中初次给 name 属性赋的值"main"。实线部分,是在 pass() 方法中给 name 属性赋的值"pass"。因为在堆内存中只有一个 User 类实体,因此 main() 方法与 pass() 方法中的 user 指向的都是同一个 User 类 0x000031。因此,无论在 main() 方法还是 pass() 方法中,改变其 user 的属性值后,打印 User 类的属性值肯定是一样的,他们用的是一个实体类。

    图2 pass() 方法中使用了 user=new User() 语句的内存模型图


        在 图2 中,main() 方法中的 user 类首次加载,堆内存开辟了一个地址为 0x000031 的 User 类实体。当把 main() 方法中的实参 user 传递给 pass() 方法中形参 user 的时候,栈内存在 pass() 方法区中开辟了一个空间,并引用了地址为 0x000031 的 User 类。此时两个方法中的 User 类其实是一个。
        然而当 pass() 方法中的 user=new User()语句执行后,堆内存中新开辟了一个地址为 0x000032 的 User 类,pass() 方法中的 user 从此指向了地址为 0x000032 的 User 类。
        因为 pass() 方法 与 main() 方法中的 user 属性分别指向了不同的 User 类,所以两个方法中的 User 类的属性无论怎么修改,相互都不影响。
        但是,这种操作是不能验证引用传递定义的。因为实参传值给形参后,形参自己改变了地址,这就和引用传递无关了。我们再来用代码验证。
        我们可以使用 C++ 引用传递代码来验证,使用 user = new User() 语句验证引用传递的错误性
    C++ 中引用传递代码

    class User
    {
    public:
        int age;   // 长度
        string name;  // 宽度
    };
    
    
    //引用传递
    void pass(User &user) {
    
        cout << "引用传递 -- user的地址是:" << &user << endl;
    
        user.age = 2;
        user.name = "你好";
    }
    
    
    int main() {
    
        User user;
        user.age = 1;
        user.name = "hello";
    
        cout << "实参 -- user的地址是:" << &user << endl;
        pass(user);
        cout << "实参 -- user的值 age=" << user.age << ",name=" << user.name << endl;
    
        system("pause");
        return false;
    }


    【运行结果】
    实参 -- user的地址是:00DCF768
    引用传递 -- user的地址是:00DCF768
    实参 -- user的值 age=2,name=你好

        在 C++ 中,引用传递的实参与形参地址一致,在引用的方法中,使用的就是实参的地址。当修改形参值后,实参值也跟着变。现在我们按照 user=new User(); 的方法改变一下引用方法 pass 如下:

    //引用传递
    void pass(User &user) {
    
        cout << "引用传递 -- user的地址是:" << &user << endl;
    
        User user2 = user; //相当于 Java 中的 user=new User();
        cout << "引用传递 -- user2的地址是:" << &user2 << endl;
    
        user2.age = 2;
        user2.name = "你好";
    }


    【运行结果】
    实参 -- user的地址是:00CFFACC
    引用传递 -- user的地址是:00CFFACC
    引用传递 -- user2的地址是:00CFF9AC
    实参 -- user的值 age=1,name=hello

        我们看,改变引用传递中形参 user 的地址后(后期改变的地址,这跟引用传递,值传递还有什么关系?),再修改形参 user 的值,实参没有任何变化。这就破坏了引用传递的场景,因此不能使用 user=new User(); 语句来验证引用传递的定义。

        排除了其他异议,我们再来分析 Java 中有没有引用传递。

    先把引用传递的定义放上

        引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。
        引用传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

        经过上面的长篇大论,我想这时候你应该能明白了。在对引用类型做方法传递的时候,是不是先把实参的地址给形参的?之后对形参的操作是,是不是相当于操作实参?最后有没有影响到实际参数?
    答案肯定都是有的。

    定义关键1:是指在调用函数时将实际参数的地址直接传递到函数中(给形参了)
        证明:Java 在进行方法调用传递引用类型参数的时候,就是先给形参一个与实参相同的地址的(此处与 C++ 的不同之处是,C++ 是别名,没有在内存中给形参开辟空间,而 Java 给形参开辟了一个栈内存空间,存放与实参相同的引用地址。但是这与引用传递的定义不违背啊!!!定义可没说形参是否有开辟空间的概念)。

    定义关键2:在函数中对参数所进行的修改,将影响到实际参数。
        证明:Java 在进行方法调用传递引用类型参数后,修改形参的内容后,就是影响了实参的值。

    四、String 与包装类的特殊分析

        好了,解决了实例对象,我们再来说 String 与包装类,为什么 String 与包装类作为引用类型,却有值传递的功能,居然没有影响到实参!

    原因如下
        我们都知道。String 类型及其他七个包装类,是一群特殊群体。当使用 String a = "hello"; 语句时,相当于执行了 String a = new String("hello")。然而在 Java 中每一次 new 都是一次对象的创建。如果你创建的对象在堆中不存在,便会创建一个,如果是新创建的对象,那么地址都会变的,后期改变的地址,这跟引用传递,值传递还有什么关系?

        其实 String 型方法参数传值的过程,可以用以下代码来解释,我们先看 String 类型的还原:

    String a = "hello"; //a 相当于实参
    String a1 = a; //a1 就相当于形参
    a1 = "你好";
    System.out.println("a是:" + a + " --- a1是:" + a1);


    【运行结果】
    a是:hello --- a1是:你好

    逐步还原解释:
        String a = "hello"; 在 String 池中检查并创建一个常量:"hello",给 a 分配一个栈内存,在此存储常量 hello 的地址。
        String a1 = a; 给 a1 分配一个栈内存,在此存储常量 hello 的地址。相当于 a 把自己持有的地址,复制给了 a1。

    内存图如下


        a1 = "你好"; 等同于 a1 = new String("你好")。在 String 池中检查是否有 "你好" 的常量。如果有,将 a1 的地址指向 "你好" 的地址。如果 String 池中没有 "你好" 常量,在堆内存中创建 "你好" 常量,并将 a1 地址指向 "你好"。

    内存图如下


        总结如下:String 类型,在进行方法传参的时候,是先将实参地址,赋值给形参(形参在栈内存中确实新开辟了一个新的内存空间,用于存储地址)。但是当再次给 String 类型的形参赋值(与实参内容不一样的值时),形参地址变了,这就和引用传递无关了。我们可以用 C++ 代码中的引用传递,来验证 String 型的这一特殊情况,代码如下:

    //引用传递
    void pass(string &a, int &b) {
    
        cout << "引用传递 -- a的地址是:" << &a << " --- b的地址是:" << &b << endl;
        cout << "引用传递 -- a的值是:" << a << " --- b的值是:" << b << endl;
    
        string c = a; // 相当于 java 中的 new String
        int e = b;
    
        cout << "引用传递 -- c的地址是:" << &c << " --- e的地址是:" << &e << endl;
        cout << "引用传递 -- c的值是:" << c << " --- e的值是:" << e << endl;
    
        c = "你好"; //在引用传递中改变形参地址后做修改操作,不影响实参
        e = 2; //在引用传递中改变形参地址后做修改操作,不影响实参
    }
    
    int main() {
        string a = "hello";
        int b = 1;
    
        cout << "实参 -- a的地址是:" << &a << " --- b的地址是:" << &b << endl;
    
        pass(a, b);
    
        cout << "实参 -- a的值是:" << a << " --- b的值是:" << b << endl;
    
        system("pause");
        return false;
    }


    【运行结果】
    实参 -- a的地址是:00CFF9CC --- b的地址是:00CFF9C0
    引用传递 -- a的地址是:00CFF9CC --- b的地址是:00CFF9C0
    引用传递 -- a的值是:hello --- b的值是:1
    引用传递 -- c的地址是:00CFF8A0 --- e的地址是:00CFF894
    引用传递 -- c的值是:hello --- e的值是:1
    实参 -- a的值是:hello --- b的值是:1

        我们看,在 C++ 中的引用传递方法中,改变形参的地址后做修改操作,照样不影响实参的值,这就破坏了引用传递的本质,不能这样比喻。

        因此,String 与其他包装类,在做形参的时候,由于他们在赋不同于实参的值时,改变了形参的地址,因此使引用传递,看起来像值传递,其实本质还是引用传递。


    五、总结


    1.这个题目出的不严谨,但是很好(因为涉及了 Java 内存模型)
    2.就 Java 语言本身来说,只有值传递,没有引用传递。
    3.根据 值传递,引用传递的定义来说:
            Java 中的基本类型,属于值传递。
            Java 中的引用类型,属于引用传递。
            Java 中的 String 及包装类,属于特殊群体,作为形参时,由于每次赋值都相当于重新创建了对象,因此看起来像值传递,但是其特性已经破坏了,值传递、引用传递的定义。因此他们属于引用传递的定义,却表现为值传递。

    此题争议很大,我仅分享自己的理解,如有不同结论,欢迎指正,一起共勉!

    展开全文
  • 沟通管理作为项目管理核心知识领域之一...沟通管理涉及的范围很广,本文从沟通的重要性和模型出发,主要从信息传递(维度、模式、媒介、干系人、场景分析)和信息维护(工具平台、实践)这两方面对沟通管理进行阐述。

    沟通管理作为项目管理核心知识领域之一,在项目管理和团队协作中的作用毋庸置疑。沟通管理涉及的范围很广,本文从沟通的重要性和模型出发,主要从信息传递和信息维护这两个方面对沟通管理进行阐述。

    一. 关于沟通


    下面这张图描绘了西方文化中的巴比伦塔,这里我引用巴比伦塔的例子来强调沟通的重要性,而沟通的重要性我认为无论怎么强调都不为过。



    《圣经▪旧约▪创世纪》中提到了继诺亚方舟之后,人类历史上最大的工程就是建造巴比伦塔,但这个工程却以失败而告终。作为基督教徒,我还专门去翻了一下圣经。如果我们把建造巴比伦塔也看作是一个项目的话,这个项目的资源(两河流域丰富的石材和泥土)和时间(不计时间)都没有限制,项目启动后也非常顺利,但因为塔的高度直通云天引起了上帝的不满,所以上帝发明了多语言促使人们的沟通和协作出现问题最终导致了项目的失败。

    回到现实,我们可以通过抽象把沟通过程描述成如下模型:


    上述模型中无论是信息的编码和解码、发送和接收都会受到多种干扰导致信息的传递出现问题,如何保证信息传递的高效性是本文进行阐述的一个重点。

    有了沟通模型,我们关注另一个项目管理中的重要概念:干系人。简单的干系人模型可以抽象为围绕”我“可以引出事情,只有满足是我的事情而且与这间事相关的人才是我的干系人,即下图中的1和2两个条件都需要成立:


    影响沟通管理的另一个主要方面是组织过程资产,组织过程资产一般分成两个部分:

    • 流程与工具:与沟通相关的包括沟通标准流程、媒介使用的模板、沟通模式和工具等
    • 共享知识库:与沟通相关的包括项目档案、知识库、回顾数据等

    人员组织结构等事业环境因素同样也会影响沟通管理的具体开展方式,各个组织可能差异较大,这里不展开。

    二. 信息传递

    信息传递的模型可以通过以下简图进行展开:


    1. 信息传递的维度

    信息传递的维度按照不同视角看可以有很多类别,一般包括如下几种,每一种参照字面意思即可:

    • 内部(在项目内)和外部(客户媒体、公众)
    • 正式(报告、备忘录)和非正式(电子邮件、即兴讨论)
    • 垂直(上下级之间)和水平(同级之间)
    • 官方(新闻通讯、年报)和非官方(私下的沟通)
    • 书面和口头

    2. 信息传递的模式

    信息传递的模式只有三种,各种模式的特点和适用场景总结如下:

    • 拉模式:受众明确、时效性强,但不适合版本信息管理
    • 推模式:受众面广、平台化管理,适合版本信息管理
    • 交互模式:实时性强、成本高,所以交互议程和节奏是关键
    3. 信息传递的媒介

    信息传递的媒介和传递模式紧密相连,这里结合上述传递模式的特点和适用场景分别列举一项最典型的传递媒介:

    • 邮件,推模式的代表媒介。邮件是比较正式也最常用的推模式,即我把信息推送给你,至于后续你如何处理就看你的安排了。所以适合多方协作且时效性不强,需要明确细节、追踪状态、安排事情等场景使用。但因为推模式的效用只限于本次记录,所以类如对某一个文档不停更新版本并进行通知的场景,每一封邮件都会导致接收方生成多个工作副本,故需要版本信息管理的场景不适合使用推模式,而应该使用拉模式。
    • 共享库:拉模式的代表媒介。共享库的运作方式如下图,信息发布者和信息接收者通过信息共享库进行交互并根据需要变换相互之间的角色。由于很多共享库带有版本控制功能,对提交者以及提交内容能够进行跟踪和管理,故适合团队协作和过程资产建设。
    • 会议:交互模式的代表媒介。会议作为信息传递的媒介需要参与者做统筹安排,否则信息传递的效果会大打折扣。会议的发起者通常是管理者角色,而接收者可能来自跨职能的各个部门和小组。发起者和接收者之间的意识形态、工作方式等存在一定差异性,故会议前的准备、会议中的议题和节奏、会后的工作事项落地都会需要成本。相比邮件和共享库,交互模式中的会议是信息传递最需要管理理念渗入的一种媒介。

    4. 再论干系人
    干系人只有两种,一种是行动者,即对信息需要采取行动的人;另一种是知情者,即只要知晓信息即可的人。两种不同的干系人决定了所需要传递信息的内容和类型。
    5. 场景分析
    针对周围碰到的信息传递过程中的问题,列举若干典型场景:
    • 不必要的干系人:一般组织内部的邮件通常为以组的形式进行管理,如果你这封邮件只是发给某些人,那就不要用邮件组。邮件组是“不必要干系人”的典型应用场景,有些职位的人会加入到很多邮件组中,如果他每天都收到几十封和自己完成没有关系的邮件,那真正需要他采取行动的邮件很可能会被遗漏,导致沟通出现问题。
    • 不正确的干系人:在项目启动会上我们会进行该项目的风险分析,如果你把“项目实施人员经验不足”这条风险写到启动会报告中,那很不幸你没有找对信息传递的干系人。“项目实施人员经验不足”确实是一项需要进行内部管理的很重要的风险,但项目启动会可能面对的是项目的甲方、乙方以及其他供应商,如果你说做这个项目我们的实施人员不行,你让其他方的人怎么想呢?
    • 不合适的维度:典型例子有通过QQ传递重要信息;口头通知项目决定;项目数据非可视化沟通;缺少内部/外部信息过滤等。
    • 不合适的模式:如果你想和团队成员分享一个很好用的小工具,那建议你不要用邮件去传递信息,因为邮件可能会被删除和遗忘,这种场景下运用拉模式通过SVN或FTP等共享库进行信息传递往往是更好的选择。
    • 不完备的模式:主要是对会议而言,上面也提到会议需要进行统筹安排方能发挥其效用。会议前需要明确输入、议程和输出;会议中关注演示和节奏。如果一个会议连基本的输入输出都不明确的话,个人建议还是等这些都明确了之后再召开会更好。
    • 不合适的媒介:如果你写一个文档,这个文档是静态的,即后续不会有任何变动和更新,那你把它放到Redmine这种工具平台上是合适的。反之,如果这份文档需要进行版本的演进和更新,那Redmine就不是合适的媒介,强烈建议使用带版本控制功能的共享库进行这些文档的统一维护。下文我们就从信息维护的角度出发再对沟通管理进行进一步分析。

    三. 信息维护

    信息维护是一项涉及知识库、过程资产、环境和交流等元素的整合过程,该过程包括信息保存的成本、信息转移的成本以及信息转化的成本,由于这种成本比较隐性,很多时候我们都或多或少不想投入这种成本,导致信息维护的完整性和时效性上出现问题。

    同时,信息维护通常也和知识管理有很大交集。知识管理就是解决“隐性知识显性化”这个问题,而信息维护是确保解决这个问题的表现和手段。当同样的步骤需要重复发生?当信息传递因为人而中断?我们是否会想我们缺少什么,我觉得首先我们缺少的是一种统一平台。

    1. 工具平台
    简单列举若干个周围环境常用的工具平台,市面上也有很多类似的工具,可做类比,如下图:



    • 版本控制工具:如果信息需要分版本、需要定期/不定期维护、需要团队多人协作,那版本控制工具是必需的,主流的包括SVN、GIT等。
    • 问题跟踪工具:如果信息的特点是随项目/产品开发进程不断需要范围变更、问题抛出/解决、多方干系人参与,那采用一套完备的问题跟踪工具会事半功倍,主流的包括Redmine、Jira、Quality Center。一个组织最好只使用一台这样的工具,我们使用的是Redmine。
    • 静态资源工具:如果信息只是一些静态资源,不涉及变动,但就用FTP吧。
    • 知识共享工具:如果信息属于知识管理范畴,那采用一个知识共享工具能帮助团队解决很多耗费尽力但成效低下的信息共享和维护需求,主流的包括各种Note后缀的工具,很多是面向公网平台且不大适合内部团队使用,如果你想在组织内部建设一个知识共享平台,Office自带的OneNote可能是一个不错的选择。
    2. 实践
    有了工具平台,梳理所谓的“Best Practice”也是组织级别信息维护的重要方面,这些实践可能见仁见智,简单列举几个个人认为比较有效的做法,供参考:
    • 信息按领域归类:把信息按领域进行分类是常见的也是很有效的做法,这一实践关键要按照工作特点进行领域的明晰梳理,我们团队的SVN团队共享文档根目录是这样的:

    • 一个工作副本原则:在使用SVN或Redmine等拉模式下的信息传递和维护时,确保一个工作副本原则,即共享库地址与本地磁盘空间地址一一对应,切忌共享库里的内容分散在本地的多个物理位置。一个工作副本确保快速高效的进行信息的更新和提交。
    • 文档版本控制:文档确保要有版本,版本信息最好通过更新日志来维护,直接在文档名称中加版本号貌似也是一种常见的做法。无论哪种做法,后续的文档更新确保通过版本号进行维护,无论是采用拉模式、推模式还是交互模式。
    • 职责分离和完整提交:信息提交时确保职责分离,尤其是多人协作的场景下,如果分工不完善容易导致冲突;完整提交指以满足某个基础规则(如按功能点、按模块等)的粒度下频繁提交,确保团队成员在最新的信息基础上作出判断和行动。
    • 项目日历:如果涉及多项目环境下产品/项目开发,使用OneNote这样的工具形成一份面向研发、项目、产品以及其他内部职能小组的项目日历可以为我们提供了一种信息辐射器,项目经理通过拉模式进行项目信息的更新确保团队在工作计划点上的一致。

    四. 小结


    信息传递和维护是沟通管理中的两个重要方面,日常工作无论是研发、项目、产品以及高层的管理等都需要消息的高效传递和维护。各个组织有各自的特点和文化氛围,沟通管理需要通过探索和形成统一、合适的方法论和工作模式,并进行持续改进。


    展开全文
  • 五分钟学Java:Java到底是值传递还是引用传递

    千次阅读 多人点赞 2019-12-11 08:43:27
    在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这问题困扰过。实话实说吧,我...
  • java中对象作为参数传递给一方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递基本类型 值传递;引用类型,地址值传递,所以叫值传递。  当主函数的变量,对象(主本)传递到副函数时,传递的...
  • 函数参数传递方式的区别

    万次阅读 2017-01-07 13:47:00
    问题提出:1、当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别?... DateType ExampleFun(CString strFileName,…)解答之前,我们先来看2个基本的概念:形参和实参。->通俗的讲:形参是形式上的
  • 分布式系统的基本特征

    千次阅读 2019-08-09 11:53:12
    我们从这定义中可以看出分布式系统包含两区别于单块系统的本质性特征,一是网络,分布式系统的所有组件都位于网络之中,对于互联网应用而言,则位于更为复杂的互联网环境中;另一是通信和协调,与单块系统...
  • HTTP请求三个基本步骤

    千次阅读 2019-01-01 19:56:38
    在实际开发中,经常会碰到两个不同平台的系统之间需要互相交互,现在这种交互主流的做法是用HTTP,这里总结三个步骤。 一,网络互通 比如两个系统都在同一个内网网段或者都在公网上。这个时候可以用一些简单的...
  • Java值传递和引用传递详细说明

    千次阅读 多人点赞 2020-07-14 15:53:17
    学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,...
  • 当面试官问我————Java是值传递还是引用传递

    千次阅读 多人点赞 2019-01-25 18:20:09
    面试官:你好,你能说出下面程序的执行结果吗? public class Test { public static void main(String[] args) { String name = "Scott"; int age = 5; User user = new User(); user.set...
  • 缘起在《关于Android学习的三个终极问题》一文的最后,我曾提到过在看完《信息简史》一书后,顿悟到“开发软件的时候仿佛能看到信息在流动”。《信息简史》是一本非Codin...
  • JAVA中值传递和引用传递种情况

    万次阅读 多人点赞 2016-12-04 00:14:39
    前言我们都知道,java中数据类型分为基本数据类型和引用数据类型。 基本数据类型 - 整型:byte,short,int,long - 浮点型:float,double ...一般情况下,当作为参数传递的时候,基本数据类型是值传递,引用数据
  • 深入理解--Java按值传递和按引用传递

    万次阅读 多人点赞 2017-07-20 15:48:49
    引言最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路。何乐而不为?Java按...
  • 图网络算法——信息传递和节点分类 在开始介绍下面的算法问题之前,我们首先从提出一问题,给定一某些节点具有分类标签的网络结构,我们应该如何去预测网络中其他节点的标签呢? 这种节点分类的方式称为半监督...
  • 第一种: 修改过后,a = 0 主函数a的值 = 1 第二种: 修改过后,a = 0 主函数a的值 = 0 第种: 修改过后,a = 1 主函数a的值 = 1 想要得到答案的话就得先明白参数传递的两类型:值传递和引用传递。 什么是引用...
  • 目录 一、互调的基本原理 ...、指针的传递 四、函数指针的传递 五、结构体的传递 六、完整代码 最近在编写Warensoft3D游戏引擎,并预计明年年初发布测试版本,底层引擎使用DirectX和MONO来编写,上层...
  • Java中没有指针,没有引用传递了,仅仅有值传递。但是可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能。 值传递:方法调用时,实际参数把它的值传递给对应的...
  • 【JAVA】 什么是值传递和引用传递

    万次阅读 多人点赞 2019-06-04 11:10:05
    传递是对基本型变量而言的,传递的是该变量的一副本,改变副本不影响原变量. 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一副本, 并不是原对象本身 。 一般认为,java内的基础类型数据传递都是值...
  • Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements接口实现多继承的功能 值传递:方法调用时,实际参数把它的值传递给对应的...
  • JNI 传递和返回基本参数

    千次阅读 2018-03-31 08:07:13
    Java 中的基本类型包括 boolean,byte,char,short,int,long,float,double 这样几种,本文主要介绍上层向底层传递基本类型数据,以及底层向上层返回基本数据类型的情况。本文地址一、新建 JNIWrapper 类,用于...
  • springMVC接收List对象以及List对象与其它对象一起传参数的使用方法, 传单key-value,或基本类型的数组最简单,稍微复杂一点的是传对象数组(`[object]`),最复杂的是对象数组与key-value一起传到后台
  • 维计算机视觉(五)--特征描述子

    万次阅读 2017-10-01 11:18:38
    目前已有的思路是先提取关键点,再使用各种局部特征描述子对关键点进行描述,最后与待检测物体进行比对,得到点-点的匹配。个别文章在之后还采取了ICP对匹配结果进行优化。  对于缺乏表面纹理信息,或局部曲率变化...
  • 层架构中的参数传递

    千次阅读 热门讨论 2013-07-25 00:18:30
    层架构中的参数传递  层架构中的参数传递情况很多,也很重要.不过参数传递又分很多的情况.虽然情况众多,不多按照形式来分,一般都是用传值和传递实体.下面就来稍微介绍一些情况.   做机房收费系统的时候有...
  • SOA基本特征

    千次阅读 2007-01-05 19:37:00
    SOA基本特征独立的功能实体在Internet这样松散的使用环境中,任何访问请求都有可能出错,因此任何企图通过Internet进行控制的结构都会面临严重的稳定性问题。SOA非常强调架构中提供服务的功能实体的完全独立自主...
  • python中面向对象特征

    千次阅读 多人点赞 2018-09-13 20:21:05
    面向对象特征  1.封装:根据职责将属性和方法封装到一抽象的类中  2.继承:实现代码的重用,相同的代码不需要重复的写  3.多态:以封装和继承为前提,不同的子类对象调用相同的方法,产生不同的执行结果 一...
  • C++中函数调用时的种参数传递方式详解

    万次阅读 多人点赞 2017-08-31 20:44:51
    原文地址:http://blog.csdn.net/cocohufei/article/details/6143476;  ...   在C++中,参数传递的方式是“实虚结合”。 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass b...
  • 重点理解为什么,第三个例子和第四个例子结果不同? 下面是第三个例子的图解: builder.append("4")之后 下面是第四个例子的图解: builder = new StringBuilder("ipad"); 之后 转载于:...
  • 为什么大家都说Java中只有值传递

    千次阅读 多人点赞 2020-01-08 21:57:10
    最近跟Java中的值传递和引用传递杠上了,一度怀疑人生。查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递。也搞明白了,为什么大家都说Java只有值传递,没有引用传递。原来,我一直以来的认知都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 798,851
精华内容 319,540
关键字:

信息的三个基本特征是可传递