局部变量

(代码块;继承;this与super关系;继承关系中构造方法和成员方法的关系;重载与重写对比;类的继承特点;final关键字;)Java零基础学习笔记 Day08

旧时模样 提交于 2020-03-02 14:33:13
一,代码块 概述:被大阔号单独包裹的代码段叫做代码块 ​根据位置的不同,命名的不同他的使用时机和功能不一样。 分类: ​ 局部代码块 ​ 构造代码块 ​ 静态代码块 ​ 同步代码块【今天不讲,多线程的时候讲】 局部代码块 ​ 概述:定义在方法中的代码块 ​ 位置:方法的方法体中 ​ 作用:给局部变量赋值,或者定义局部变量 代码 package com.ujiuye.demo; import java.util.Arrays; public class Demo01 { public static void main(String[] args) { Demo01 demo01 = new Demo01(); demo01.show(); } public void show() { int a = 10 ;//局部变量 //局部代码块 { a = 30 ; int b = 40;//局部变量 System.out.println(a);//30 10 System.out.println(b);//40 } System.out.println(a);//30 代码块对外面的局部变量的赋值是永久的 //System.out.println(b);输出不了 b变量的生存范围变小了 } } 总结: 好处:缩小了局部变量的使用范围和生命周期,及时的释放内存空间达到提升运行效率。 注意:

轻量级协程库-C语言实现

混江龙づ霸主 提交于 2020-03-02 03:23:41
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法 “子例程是协程的特例” ,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。只不过子例程只有一个调用入口起始点,返回之后就结束了,而协程入口既可以是起始点,又可以从上一个返回点继续执行,也就是说协程之间可以通过 yield 方式转移执行权, 对称(symmetric)、平级 地调用对方,而不是像例程那样上下级调用关系。当然 Knuth 的“特例”指的是协程也可以模拟例程那样实现上下级调用关系,这就叫 非对称协程 (asymmetric coroutines)。 基于事件驱动模型 我们举一个例子来看看一种 对称协程 调用场景,大家最熟悉的“生产者-消费者”事件驱动模型,一个协程负责生产产品并将它们加入队列,另一个负责从队列中取出产品并使用它。为了提高效率,你想一次增加或删除多个产品。伪代码可以是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 # producer coroutine loop while queue

图示JVM工作原理

淺唱寂寞╮ 提交于 2020-03-01 04:05:24
JDK,JRE,JVM的联系是啥? 不格网 m.vbuge.com JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言无关性和平台无关性。 语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。 平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器

关于String StringBuffer StringBuilder

余生长醉 提交于 2020-02-29 11:09:46
0. String对象的创建 1、关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world"); 问题是参数"Hello world"是什么东西,也是字符串对象吗?莫非用字符串对象创建一个字符串对象? 2、当然,String类对象还有一种大家都很喜欢的创建方式:String s="Hello world"; 但是有点怪呀,怎么与基本数据类型的赋值操作(int i=1)很像呀? 在开始解释这些问题之前,我们先引入一些必要的知识: 1. Java class文件结构 和常量池 我们都知道,Java程序要运行,首先需要编译器将源代码文件编译成字节码文件(也就是.class文件)。然后在由JVM解释执行。 class文件是8位字节的二进制流 。这些二进制流的涵义由一些紧凑的有意义的项 组成。比如class字节流中最开始的4个字节组成的项叫做魔数 (magic),其意义在于分辨class文件(值为0xCAFEBABE)与非class文件。class字节流大致结构如下图左侧。 其中,在class文件中有一个非常重要的项—— 常量池 。这个常量池专门放置源代码中的符号信息(并且不同的符号信息放置在不同标志的常量表中)。如上图右侧是HelloWorld代码中的常量表(HelloWorld代码如下)

16变量进阶(理解)

旧巷老猫 提交于 2020-02-29 09:58:07
01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址 ,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的 内存地址 注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用 变量 不再 对之前的数据引用 变量 改为 对新赋值的数据引用 1.2 变量引用 的示例 在 Python 中,变量的名字类似于 便签纸 贴在 数据 上 定义一个整数变量 a ,并且赋值为 1 代码 图示 a = 1 将变量 a 赋值为 2 代码 图示 a = 2 定义一个整数变量 b ,并且将变量 a 的值赋值给 b 代码 图示 b = a 变量 b 是第 2 个贴在数字 2 上的标签 1.3 函数的参数和返回值的传递 在 Python 中,函数的 实参 / 返回值 都是是靠 引用 来传递来的 def test ( num ) : print ( "-" * 50 ) print ( "%d 在函数内的内存地址是 %x" % ( num , id ( num ) ) ) result = 100 print ( "返回值 %d

深入研究java.lang.ThreadLocal类

我的梦境 提交于 2020-02-29 08:45:26
一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。 概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问

简单描述成员变量和局部变量的比较

妖精的绣舞 提交于 2020-02-28 21:47:25
成员变量:由于是属于对象的,所以位于堆内存中 局部变量:位于栈内存中(因为方法是位于栈内) 1.两者作用域不同 2.初始值不同(成员变量会被赋予初始值,而局部变量不会) 3.在同一个方法中不允许有同名的局部变量,不同方法中,可以有同名的情况 4.成员变量和局部变量同名时,局部变量具有更高的优先级别 下面通过一个例子来看优先级的变化 package ZUOYE5; public class Object { int text = 10;// 成员变量 void Text() { int text = 100;// 局部变量优先级更高 System.out.println(text); } public static void main(String[] args) { Object one = new gaicuo(); System.out.println(one.text); one.Text(); } } 输出结果为:100 10 根据结果,可见在调用方法的时候,局部变量的优先级是更高的 来源: CSDN 作者: 不是屠小意,却爱姚哲恬 链接: https://blog.csdn.net/qq_44083510/article/details/104563834

图示JVM工作原理

こ雲淡風輕ζ 提交于 2020-02-28 20:29:32
JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很清楚 JVM的作用是啥? JVM有2个特别有意思的特性,语言无关性和平台无关性。 语言无关性是指实现了Java虚拟机规范的语言对可以在JVM上运行,如Groovy,和在大数据领域比较火的语言Scala,因为JVM最终运行的是class文件,只要最终的class文件复合规范就可以在JVM上运行。 平台无关性是指安装在不同平台的JVM会把class文件解释为本地的机器指令,从而实现Write Once,Run Anywhere JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域 其中方法区和堆是所有线程共享的数据区 程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区,画一个逻辑图 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器 为什么要记录当前线程所执行的字节码的行号?直接执行完不就可以了吗?

闭包的概念和其优缺点

喜你入骨 提交于 2020-02-28 14:14:06
1、变量作用域 要理解闭包,首先要理解javascript的特殊的变量作用域。 变量的作用域无非就两种:全局变量和局部变量。 javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。 注意点:在函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明的是一个全局变量! 2、如何从外部读取函数内部的局部变量? 出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现。 那就是在函数内部,再定义一个函数。 function f1(){     var n=999;     function f2(){       alert(n); // 999     }   } 在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。 这就是Javascript语言特有的"链式作用域"结构(chain scope), 子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。 既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗! 3、闭包的概念 上面代码中的f2函数

学点 C 语言(34): 函数 - 关于变量(auto、static、register、extern、volatile、restrict)

妖精的绣舞 提交于 2020-02-28 06:16:43
1. 局部变量: 局部变量也叫自动变量, 它声明在函数开始, 生存于栈, 它的生命随着函数返回而结束. #include <stdio.h> int main(void) { auto int i = 9; /* 声明局部变量的关键字是 auto; 因可以省略, 几乎没人使用 */ printf("%d\n", i); getchar(); return 0; } 2. 全局变量: 全局变量声明在函数体外, 一般应在函数前; 每个函数都可以使用它, 不过全局变量应尽量少用. #include <stdio.h> void add(void); void mul(void); int gi = 3; /* 全局变量 */ int main(void) { printf("%d\n", gi); /* 3 */ add(); printf("%d\n", gi); /* 5 */ mul(); printf("%d\n", gi); /* 10 */ getchar(); return 0; } void add(void) { gi += 2; } void mul(void) { gi *= 2; } 全局变量会被初始化为空, 而局部变量在没有赋值前是一个垃圾值: #include <stdio.h> int gi; /* 全局变量 */ int main(void) { int