精华内容
下载资源
问答
  • 主要介绍了理解C#中参数的值和引用以及传递结构引用的区别,文中了两段代码例子来简单说明,需要的朋友可以参考下
  • C++ 指针和引用的区别

    2021-03-16 14:24:01
    在我的上一篇博客里面了swap函数的例子说明指针和引用的区别,点击传送门查看。

    在我的上一篇博客里面举了swap函数的例子来说明指针和引用的区别,点击传送门查看。

    展开全文
  • 我们来例子说明一下LHSRHS。 var a = 1; 我们把这个表达式根据等号拆成两个部分,var a = 1。这个里面var a进行LHS查找,编译器遇到var a时,会询问作用域是否存在一个名为a变量,如果有则忽略,...

    平时做前端开发的时候可能接触不到LHS和RHS这两个名词,但是它却是js中最基础的概念,表示两种变量的查找方式,在js代码中无处不在。我们来举个例子说明一下LHS和RHS。

    var a = 1;  我们把这个表达式根据等号拆成两个部分,var a 和 = 1。这个里面var a进行的LHS查找,编译器遇到var a时,会询问作用域是否存在一个名为a的变量,如果有则忽略,如果没有则让作用域声明一个名为a的变量(就是声明一个容器,过一会用来存储数字1),等式右边进行的是RHS查找,也就是查找数字1本身的值(可以理解为数字1的物理地址),然后再将1赋给a。

    我们再来看一个例子,console.log(a);这里的a进行的是LHS查找还是RHS查找呢?进行的是RHS查找,因为a没有赋予任何值,这里只需要找到a本来的值,并传递给log函数。而上面的a则是LHS查找,需要为 = 1找到一个赋值目标。

    我们再来看一个复杂一点的例子:

    function test(a) {
        console.log(a);
    }
    test(2);

    这个例子里哪些是LHS引用哪些是RHS引用?

    最后一行test是一个RHS引用,表示查找到test的值并把它给我,而(..)表示test需要被执行,所以这里test必须是一个Function,否则会报test is not a function的错误,然后我们再看函数中的console.log(a);这里a进行的是RHS查找,表示找到a的值并传递给log(..),其实这里的console也是进行的RHS查找,表示查找到console这个对象并检查对象中是否有一个log方法。

    这里有一个容易被忽略的地方,就是传参时隐式的 a = 2,这里的a进行的是LHS查找,表示在作用域中查找一个名为a的变量,并且将2赋给它。

    展开全文
  • 1、static 强调只有一份,final 说明是一个常量,final定义基本类型值是不可改变,但是fianl定义的引用对象值是可以改变,下面例子说明:package DifStaticFinalAndFinal; class SelfCounter { ...

    学习java的时候常常会被修饰符搞糊涂,这里总结下static final和final的区别。

    1、static 强调只有一份,final 说明是一个常量,final定义的基本类型的值是不可改变的,但是fianl定义的引用对象的值是可以改变的,下面举个例子来说明:

    复制代码
    package DifStaticFinalAndFinal;
    
    class SelfCounter {
        private static int counter;
        private int id=counter++;
        
        public String toString(){
            return "SelfCounter: "+id;
        }
    }
    复制代码
    复制代码
    package DifStaticFinalAndFinal;
    
    class WithFinalFields {
        static final SelfCounter wffs=new SelfCounter();
        final SelfCounter wff=new SelfCounter();
        
        public String toString(){
            return "wff= "+wff+",\n wffs= "+wffs;
        }
    }
    复制代码

    主函数:

    复制代码
    package DifStaticFinalAndFinal;
    
    public class StaticFinal {
        public static void main(String[] args) {
            System.out.println("First Object:");
            System.out.println(new WithFinalFields());
            System.out.println("Second Object:");
            System.out.println(new WithFinalFields());
        }
    }
    复制代码

    运行结果:

    复制代码
    First Object:
    wff= SelfCounter: 1,
     wffs= SelfCounter: 0
    Second Object:
    wff= SelfCounter: 2,
     wffs= SelfCounter: 0
    复制代码

    分析为什么wff两次的运行结果不同,而wffs两次的运行结果相同?

    因为wffs这个容器是用static final来定义的,static 强调只有一份,因此只有一个值,

    而final修饰的引用是可以变化的,因此wff的值是可以变化的,这也是final修饰基本类型和引用的不同。

    2、在方法中将参数指明为final时,在使用该方法时,可以读参数但是无法使用该参数。

    复制代码
    package cn.qdu.chapter7_example;
    
    public class FinalArguments {
        void with(final Gizmo g){
            
        }
        
        void without(Gizmo g){
            g=new Gizmo();
            g.spin();
        }
        
        int g(final int i){return i+1;}
        public static void main(String[] args) {
            FinalArguments bf=new FinalArguments();
            bf.with(null);//不管这里的参数换成什么,都是执行void(final Gizmo g)方法,无法更改参数
            bf.without(null);
            
        }
    }
    复制代码

    3、为什么使用final方法呢?

    原因有两个。其一是把方法锁定,确保在继承中使用方法行为不变,并且不会被覆盖;

    其二是效率,如果一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用。 转为内嵌调用的目的是节省开销,因为编译器发现一个final方法调用命令时,会跳过程序代码这种正常方式而执行方法调用机制(将参数压入栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的实际代码的副本来替代方法调用。但是如果一个方法很大,程序很膨胀,就会看不到内嵌带来的任何性能的提高。

    4、final和private关键字

    类中所有private方法都隐式地指定为是final的,因为private关键字只能被本类调用,其他类中的方法也无法覆盖private修饰的方法,因此和加上final效果是一样的。

    5、当某个类的整体定义为final时,表明该类不能被继承,方法不能被覆盖,且final类中的所有方法都隐式指定为是final的,方法声明为final后还可以有效地“关闭”动态绑定。

    6、static加载类的动作只发生一次。

        最后,说了这么多,也要对final做一个客观的评价。若方法或类不想让别人来继承和修改,设定为final是明智的,但是在团体中这样会阻碍其他程序员通过你想不到的合理的途径来复用类,这样的话final方法就显得过于严苛了。

    展开全文
  • equals==的区别详解

    2019-06-18 13:53:54
    大家在刷面试题的时候可能都刷到过equals==之间的区别?...例子说明一下,String a = new String(“123”); 1)、对象的引用放在栈中,上例中a放在栈中; 2)、八种基本数据类型放在栈中:...

    大家在刷面试题的时候可能都刷到过equals和==之间的区别?简单来说答案就是:equals和 ==比较的都是地址,只不过许多类中都重写了equals方法,用来比较他们之间的值。接下来我们就详细看看,他们之间究竟有什么区别。

    一、堆和栈的区别
    举个例子说明一下,String a = new String(“123”);
    1)、对象的引用放在栈中,上例中a放在栈中;
    2)、八种基本数据类型放在栈中:byte,short,int,long,float,double,char,boolean;
    3)、对象放在堆中,上例中new String(“123”)放在堆中。
    因此基本数据类型用==号比较没任何问题。但是注意Integer,Float,Boolean…不属于基本数据类型,它们属于基本类型的包装类型。
    二、几种常见类中的equals方法源码

     // Object类
     public boolean equals(Object obj) {
         return (this == obj);
     }
    
     //Boolean类
     public boolean equals(Object obj) {
       if (obj instanceof Boolean) {
             return value == ((Boolean)obj).booleanValue();
         }
         return false;
     }
    
    //Integer类
    public boolean equals(Object obj) {
       if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    
    // String类
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
    

    我们可以看到,除了基类Object中比较的是地址以外,其他几个类中重写equals方法后比较的都是值。这里只是随便列举了几个常见的类。
    三、常量池
    数字常量池存放的范围是-128~127。我们直接看代码

    public static void main(String[] args) {
        Integer start =128;
        Integer end =128;
        Integer start1 = 127;
        Integer end1 = 127;
        System.out.println(start == end);
        System.out.println(start1 == end1);
    }
    

    运行结果为:false、true。
    当Integer 初始化的范围在-128~127之间,是放在常量池中。但是当不在这个范围时,就会在堆中开辟一块空间来存放,所以这时候比较的地址是不同的,因此返回false。
    四、实例分析

    public static void main(String[] args) {
    
        Map map = new HashMap();
        map.put("ssk","0000");
        String s = JSON.toJSONString(map);
        Map map1 = JSONObject.parseObject(s, Map.class);
        System.out.println("0000" == map1.get("ssk"));
        System.out.println("0000" == map.get("ssk"));
    }
    

    返回结果为false,true;
    首先“0000”是存在常量池中的,“0000”==map.get(“ssk”),因此map.get(“ssk”)也存在常量池中,“0000”==map1.get(“ssk”)返回false。可以判断出map1.get(“ssk”)是在堆内存中。

    展开全文
  • 1、static 强调只有一份,final 说明是一个常量,final定义基本类型值是不可改变,但是fianl定义的引用对象值是可以改变,下面例子说明: package DifStaticFinalAndFinal; class ...
  • 1、static 强调只有一份,final 说明是一个常量,final定义基本类型值是不可改变,但是fianl定义的引用对象值是可以改变,下面例子说明: package DifStaticFinalAndFinal; class SelfCounter...
  • 一个简单的例子进行解释: 假设 B 复制了 A,当修改 A 时,看 B 是否会发生变化,如果 B 也跟着变了,说明这是浅拷贝,拿人手短,如果 B 没变,那就是深拷贝,自食其力。 在python中,对象赋值实际上是对象的引用...
  • js中深拷贝浅拷贝区别

    千次阅读 2019-09-03 17:26:29
    简单例子说明;当我们声明一个a变量并且赋值,并且让b等于a,因为a,b都是基本数据类型所以数据都是存储在栈中,所以改变其中一个变量数据他们之间不会相互干扰,这种拷贝就是深拷贝。而浅拷贝就是改变...
  • 例子,[5]int为数组,[]int为slice(数组切片),数组是值类型,而slice为引用类型,值类型作为参数传入函数,只是拷贝了个副本,修改并不会作用到传入那个参数,所以一般使用slice作为参数,免去了拷贝消耗,...
  • 再然后例子说明一下深拷贝、浅拷贝等号负值的区别。 话说, 尼古拉斯赵四是象牙山响当当的人物,舞步独步天下。 于是乎人们为他起了各种绰号,亚洲舞王、象牙山郭富城等等。亚洲舞王是赵四的
  • 一个简单的例子,假设B复制了A,当A被修改时,B也发生改变,说明这是浅拷贝;如果B没有发生改变,就是深拷贝。 深拷贝只针对引用数据类型----object。 基本数据类型,例如:number,string,boolean,null,...
  • (1)final final用于声明属性、方法类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能派生出子类)。 final属性:被final修饰...对于final含义到底是哪种,例子说明。 //例1 public ...
  • “equal方法”:用来比较两个独立对象得内容是否相同,例子:就是比较两本是是否相同,比较两个对像是独立 代码举例说明: String a = new String("AA"); String b = new String("AA"); System..
  • 常指针引用 (1)常指针  使用const指针时,由于const的位置...下面两个例子说明它们的区别。下面定义的一个指向字符串的常量指针:  char * const ptr1 = stirngprt1; 其中,ptrl是一个常量指针。
  • 2.常指针引用 (1)常指针  使用const指针时,由于const的位置不同,而含意不同。下面两个例子说明它们的区别。下面定义的一个指向字符串的常量指针: char *const ptr1 = stirngprt1; 其中,ptrl是一
  •  C 语言中有一种数据类型叫做指针,于是将一个数据作为参数传递给某个函数的时候,就有两种方式:传值,或是传指针,它们的区别,可以用一个简单的例子说明: /* 例 5 */ /** * @(#) test.c * @author fancy */...
  • 【JS】深拷贝与浅拷贝的区别,实现深拷贝的几种方法 壹 ❀ 引 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,...
  • 此篇文章中也会简单阐述到栈堆,基本数据类型与引用数据类型,因为这些概念能更好让你理解深拷贝与浅拷贝。我们来个浅拷贝例子:let a=[0,1,2,3,4],b=a;console.log(a===b);a[0]=1;consol...
  • 实际上,事件是对委托封装。如果不进行封装,让委托暴露给调用者,调用者就可以把委托变量重新引用到新...例子,你碰到一件事,你需要让别人来帮你做(可能你还有别事情要做),这就是委托,把你现在不能做
  • instanceof 只能用于子类超类比较,也就是继承层次上比较 getClass()就无所谓了,各种类型比较 ...先科普一下java语言要求规范中要求equals方法得有5点...很简单,我就个具体的例子说明 class E {...
  • 下面两个例子说明它们的区别。下面定义的一个指向字符串的常量指针: char *const ptr1 = stirngprt1; 其中,ptrl是一个常量指针。因此,下面赋值是非法的。 ptr1 = stringprt2; 而下面的...
  • Racket中define、letlet*

    千次阅读 2014-01-02 12:40:12
    在Racket中,definelet都可以进行局部变量绑定,但用法有所区别: define是单独地绑定一个...例子说明:若在一个函数中绑定一个函数,再将它输出,如果用define话: (define (foo) (define name "Tom")
  • 例子说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列车辆过户流程,但是这确实太浪费我得时间精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过...
  • php高级开发教程说明

    2008-11-27 11:39:22
    编码编码之间究竟有何区别呢?实际上,这个问题很简单。好代码(确实好 代码)能够像一本书一样被阅读。你能从任何地方读起,并且能够时刻意识到你所读这些 行是干什么用,它们在什么条件下执行,...
  • 例子来说:下面java代码没有办法对List集合中对象进行转换. public class Check { public void setLotteryResults(List nos) { ... } } Singatures配置允许我们对DWR要操作对象类型进行配置.对于了解...
  • js深拷贝浅拷贝

    2018-12-10 16:24:52
    【JS】深拷贝与浅拷贝的区别,实现深拷贝的几种方法 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变...
  • Java语言程序设计课程期末复习资料 一客观部分单项选择多项选择不定项选择判断 二简答 1基本类型变量与引用型变量有何区别(p31) 2什么...4如何引用包中某个类如何引用整个包请各一个例子说明(p133-134) 5什么是字节

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

引用说明和举例子的区别