局部变量

成员变量和局部变量区别

匿名 (未验证) 提交于 2019-12-02 23:49:02
变量根据 定义位置的不同 ,我们给变量起了不同的名字。如下图所示: 成员变量和局部变量区别 成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 作用范围不一样 成员变量:类中 局部变量:方法中 初始化值的不同 成员变量:有默认值 局部变量:没有默认值。必须先定义,赋值,最后使用 在内存中的位置不同 成员变量:堆内存 局部变量:栈内存 生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 代码举例 public class Demo01VariableDifference { String name; // 成员变量 public void methodA() { int num = 20; // 局部变量 System.out.println(num); System.out.println(name); } public void methodB(int param) { // 方法的参数就是局部变量 // 参数在方法调用的时候,必然会被赋值的。 System.out.println(param); int age; // 局部变量 // System.out.println(age); // 没赋值不能用 // System.out.println(num); // 错误写法! System.out.println(name); } }

委托 匿名类 var隐式类型 匿名方法

匿名 (未验证) 提交于 2019-12-02 23:47:01
委托 多播委托 事件     发布器是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器类的对象调用这个事件,并且通知其他对象 匿名类   定义:没有名字的类 优势   可通过使用new运算符和对象初始值创建匿名类型 var隐式类型 优势: 使用规则:   1.var类型会被编译器根据初始值的类型推断出具体的类型   2.var类型的局部变量必须赋予初始值   3.无法将null赋值给隐式类型的额局部变量   4.var类型变量的定义必须是在方法中或者在属性get set访问器中   5.var不能用作方法的参数   6.不能当做返回值类型 匿名方法 应用场景   1.需要一个临时方法, 该方法使用次数极少   2.这个方法的代码很短, 甚至可能比方法声明都短的情况下使用

局部变量为什么需要显式赋值,否则编译不了

匿名 (未验证) 提交于 2019-12-02 23:47:01
1、成员变量(全局变量)是可以不经初始化的,在类加载过程的准备阶段即可给它赋予默认值,但局部变量使用前需要显示赋予初始值,javac不是推断不出不可以这样做,而是没有这么做, 对于成员变量而言,其赋值和取值访问的先后顺序具有不确定性 ,对于成员变量可以在一个方法调用前赋值,也可以在方法调用后进行,这是运行时发生的,编译器确定不了,交给jvm去做比较合适。 2、 而对于局部变量而言,其赋值和取值访问顺序是确定的 。这样设计是一种约束,尽最大程度减少使用者犯错的可能。假使局部变量可以使用默认值,可能总会无意间忘记赋值,进而导致不可预期的情况出现。

局部变量和成员变量的区别

匿名 (未验证) 提交于 2019-12-02 23:43:01
变量的种类 根据定义位置的不同,我们给变量起了不同的名字。如下图所示: 成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数) 成员变量:类中 局部变量:方法中 成员变量:有默认值 局部变量:没有默认值。必须先定义,赋值,最后使用 成员变量:堆内存 局部变量:栈内存 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 代码举例 package demo03; /* 局部变量和成员变量 1. 定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2. 作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类全都可以通用。 3. 默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4. 内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5. 生命周期不一样(了解) 局部变量:随着方法进栈而诞生,随着方法出栈而消失 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失 */ public class Demo01VariableDifference { String name; // 成员变量 public void methodA() { int

java笔记

独自空忆成欢 提交于 2019-12-02 23:22:42
=====第一个java程序===== public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } 命令 $ javac HelloWorld.java $ java HelloWorld Hello World javac 后面跟着的是java文件的文件名,例如 HelloWorld.java。 该命令用于将 java 源文件编译为 class 字节码文件 java 后面跟着的是java文件中的类名,例如 HelloWorld 就是类名, 如: java HelloWorld。 =====package===== 1.解决类名冲突的问题 2.同一个包中的类不需要被导入,当代码使用外部包中的类时,需要用import语句导入包含该类的包。 3.代码使用外部包中的类,另外一个方法是在代码中使用类的完全限定名称。例如,在使用Scanner的代码中,如果省略了导入Scanner的语句,则需要在使用Scanner类的位置使用Java.util.Scanner 4.Java编译器默认为所有的Java程序引入了JDK的Java.lang 包中的所有的类。其中定义了一些常用类:System、String、Object、Math等

Python函数初识二

匿名 (未验证) 提交于 2019-12-02 22:11:45
在Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。 在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。 在Python中并不是所有的语句块中都会产生作用域。 只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。 举个栗子: def greet_people(): name = 'jack' print("Hello, "+name) # 在函数内打印变量 print(name) # 在函数外打印变量 ===》 直接出错 greet_people() 上述代码的运行结果为: C:\Python37\python3.exe D:/pythoncode/Exercise/Exer8/Exer8-13.py Traceback (most recent call last): File "D:/pythoncode/Exercise/Exer8/Exer8-13.py", line 5, in <module> print(name

函数补充:动态参数,函数嵌套,global与nonlocal关键

匿名 (未验证) 提交于 2019-12-02 22:11:45
一丶动态参数    1.*args 位置参数,动态传参 def func(*food): print(food) print(func("米饭","馒头","福建人","犹太人"))   将所有的位置参数都赋给*food    2.**kwargs 关键字参数,动态传参 # 关键字的动态传参 def eat(**food): print(food) print(eat(广东人= "福建人",goodeat = "饼干",我的天="飞天"))   将关键字参数,以字典的形式赋给**food    3.默认参数与动态参数的关系      如果以位置参数,关键字参数,默认参数排列会报错,我们改一下默认参数的位置,发现只有在位置参数后面,关键字参数前面,默认参数才不会报错 def func(*name,gender="男",**hobby): print(name,hobby,gender) print(func("周杰伦","谢霆锋","吴京",hobby1="看电影",hobby2="唱歌"))    总结一下顺序:       位置参数>*args>默认值参数>**kwargs   如果想接收所有参数,可以用*arge 和 **kwargs组合 def trans_para(*args,**kwargs): print(args) print(kwargs) trans_para(

全局变量和局部变量(global关键字)

匿名 (未验证) 提交于 2019-12-02 22:11:45
1、定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。 2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。 3、函数之间存在作用域互不影响。 4、函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组 <?php $a=5;//全局变量 $b=3;//全局变量 function t() {  $c;//局部变量  $c=$a-$b; echo $c; // 输出 0 } t(); ?> 要想在函数中直接使用全局变量可以通过 global 关键字声明或者通过 php 中自定义的 $GLOBALS数组获取,PHP 将所有全局变量存储在一个名为 $GLOBALS[ index ] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。: <?php $a=5;//全局变量 $b=3;//全局变量 function t1() { global $a,$b; echo $a-$b; // 输出 2 } t1(); echo PHP_EOL; function t2() { echo $GLOBALS['a']-$GLOBALS['b']; // 输出 2 } t2(); ?> 文章来源: 全局变量和局部变量(global关键字)

提高PHP性能效率的几个技巧!

匿名 (未验证) 提交于 2019-12-02 22:11:45
如何提高效率问题,往往同样的功能,不一样的代码,出来的效率往往大不一样。 ● 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它 是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。 ● 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 $row[’id’] 的速度是$row[id]的7倍。 ● echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。 ● 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。注销那些不用的变量尤其是大数组,以便释放内存。 ● 尽量避免使用__get,__set,__autoload。 ● require_once()代价昂贵。include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。 ● 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。 ● 函数代替正则表达式完成相同功能

RocksDB线程局部缓存

匿名 (未验证) 提交于 2019-12-02 22:06:11
概述 在开发过程中,我们经常会遇到并发问题,解决并发问题通常的方法是加锁保护,比如常用的spinlock,mutex或者rwlock,当然也可以采用无锁编程,对实现要求就比较高了。对于任何一个共享变量,只要有读写并发,就需要加锁保护,而读写并发通常就会面临一个基本问题,写阻塞读,或则写优先级比较低,就会出现写饿死的现象。这些加锁的方法可以归类为悲观锁方法,今天介绍一种乐观锁机制来控制并发,每个线程通过线程局部变量缓存共享变量的副本,读不加锁,读的时候如果感知到共享变量发生变化,再利用共享变量的最新值填充本地缓存;对于写操作,则需要加锁,通知所有线程局部变量发生变化。所以,简单来说,就是 读不加锁,读写不冲突,只有写写冲突 。这个实现逻辑来源于Rocksdb的线程局部缓存实现,下面详细介绍Rocksdb的线程局部缓存ThreadLocalPtr的原理。 线程局部存储(TLS) 简单介绍下线程局部变量,线程局部变量就是每个线程有自己独立 的副本,各个线程对其修改相互不影响,虽然变量名相同,但存储空间并没有 关系。一般 在linux 下,我们可以通过以下三个函数来实现线程局部存储创建,存取功能。 int pthread_key_create ( pthread_key_t * key , void (* destr_function ) ( void *)), int pthread