引用传递和值传递,从上学那会儿就开始强调的概念,不管你是计算机相关专业还是自学Java,一定听过这么一句话:
方法调用参数如果是对象,那就是引用传递,如果是基本数据类型,就是值传递。
比如:function(Object o)就是引用传递,function(int i)就是值传递。这两个概念似乎很好理解,我们只需要记住对象和基本数据类型的区别就行了。但是,真的是这样吗?
有一段代码如下:
public static void main(String[] args) { int i = 0; System.out.println(i); change(i); System.out.println(i); } private static void change(int i) { i = 1; }
输出结果比较好猜测,也应该都能答对:
0 0
下一个问题,如果将int改成String呢?
public static void main(String[] args) { String s = "0"; System.out.println(s); change(s); System.out.println(s); } private static void change(String s) { s = "1"; }
输出的结果如下:
0 0
嗯?有疑问了吧?不是引用传递吗?我在方法里命名修改了s的值,为什么输出还是”0“呢?难度String作为Object有什么特殊性?
别急,继续看下一段代码:
public static void main(String[] args) { Person p = new Person("0"); System.out.println(p); change(p); System.out.println(p); } private static void change(Person p) { p = new Person("1"); } static class Person{ String name; public Person(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
结果会输出什么?
Person{name='0'}
Person{name='0'}
看来String和其他Object没什么不同,可是这样的结果好像不太符合我们对引用传递的认知啊。其实我感觉这两个概念没有必要区分,实质是一回事,都是将栈中引用复制了一份传递到方法中,无论在方法中如何对引用操作,都是操作的副本,只是对于基本数据类型来说,值存储在栈中,引用存储的就是值,而对象来说,引用中存储的是对象在堆中的内存地址,参数传递时生成的副本仍然指向了原来引用指向的对象,所以如果直接操作该对象是有效的。简单画个图方便理解:
如果对p的操作不是将该引用指向一个新的值,而是对p指向的对象进行操作,就能看到所谓引用传递的效果了例如:
public static void main(String[] args) { Person p = new Person("0"); System.out.println(p); change(p); System.out.println(p); } private static void change(Person p) { p.name = "1"; } static class Person{ String name; public Person(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }
此时,执行结果为:
Person{name='0'}
Person{name='1'}
总结:
Java进行方法调用时参数传递是将栈中的引用复制了一份到该方法的工作区,如果引用指向了一个堆中的对象,那么副本也指向这个对象。
大家好,又见面了,我是你们的朋友全栈君。js:javascriptjs一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。 Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。在语句上还是有一些类似之处,但本质上还是很不一样的: js是基于对象的,边解释边执行,而Java面向对象,编译之后再执行。1.HTML引入js方式 (1)内部js:在·HTML中直接插入script语句要求最好出现在最后一行<script> ... </script>复制(2)外部js:引入外部的js实际就是同过.js文件导入外部js语句<scriptpath=””></script> 这里就是通过文件地址直接关联js文件。复制2.js变量和数据类型 (1)变量声明①varvarname
在PHP开发中,尤其是MVC框架或者项目中,会碰到很多跳转情况,比如:登录成功或失败后的跳转等等。以下以MVC框架开发中为基础,示例讲解:在基础控制器类中:Conrtoller.class.php<?php /** *基础控制器类 */ classController{ /** *跳转 *$url目标url *$info提示信息 *$time等待时间(单位秒) */ protectedfunctionjump($url,$info=NULL,$time=3){ //判断是立即跳转还是刷新跳转 if(is_null($info)){ //立即跳转 header('location:'.$url); die; }else{ //刷新跳转,给出提示 echo<<<TIAOZHUAN <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/ <title提示信息</title <styletype='te
详细介绍通过配置Apache实现404页面替换一、通用情况–修改apache配置.htaccess 一般网站报404原因都是找不到资源,是服务器(以Apache为例)报错,Apache自定义了404输出,我们的目的是使用自定义的404.html去替换Apache的输出,那么就有了下面的代码和过程:针对Apache服务器:制作一个404页面,页面自己设计即可,命名为notfound.php,上传到网站根目录。打开.htaccess文件,添加代码:ErrorDocument404/notfound.php(注意:404和/之间有空格),然后将.htaccess文件上传到网站根目录。如果.htaccess存在ErrorDocument404/index.php,一定要将其删除。这种将404错误转向到网站主页的作法存在极大的风险,严重时会导致主页在搜索引擎中消失。END示例:<IfModulemod_rewrite.c> RewriteEngineon RewriteCond%{REQUEST_FILENAME}!-d RewriteCond%{REQUEST_FILENAME}
START0x01前言这种权限维持方式也是一种自启动后门,但仅支持Windows10通用应用平台(UWP)上的应用程序,如:Cortana和People,通过将它置于调试模式后并配合ProcessMonitor工具可以找到UWP应用对应的注册表位置,然后修改为我们要执行的恶意程序,当目标机器注销/重启系统登录时就会执行这个恶意程序,原文地址:https://oddvar.moe/2018/09/06/persistence-using-universal-windows-platform-apps-appx。0x02列出软件包名称首先我们需要找出当前系统完整的软件包名称,因为后边PLMDebug调试时要用到,可以使用以下命令列出所有的软件包,这里仅显示name、packagefullname。Get-AppxPackage|selectname,packagefullname复制0x03安装PLMDebugPLMDebug.exe包含在Windows调试工具中,所以我们只需要安装Windows10SDK即可,安装过程中只要选择“DebuggingToolsforWindows”这一项就
最近不管到哪里,大家都大谈人工智能技术,畅想着美好的未来。而回到仓储物流行业里,尤其做设备的生产厂家或者是系统集成商,也都时刻提及智能物流和智慧物流等概念。目前的仓储物流系统里究竟哪些方面做到了智能化了呢,不妨一起来分析一下。首先百度一下看看什么叫智能物流:智能物流是利用集成智能化技术,使物流系统能模仿人的智能,具有思维,感知,学习,推理判断和自行解决物流中某些问题的能力。智能物流的未来发展将会体现出四个特点:智能化,一体化和层次化,柔性化与社会化。在物流作业过程中的大量运筹与决策的智能化;以物流管理为核心,实现物流过程中运输,存储,包装,装卸等环节的一体化和智能物流系统的层次化;智能物流的发展会更加突出“以顾客为中心”的理念,根据消费者需求变化来灵活调节生产工艺;智能物流的发展将会促进区域经济的发展和世界资源优化配置,实现社会化。通过智能物流系统的四个智能机理,即信息的智能获取技术,智能传递技术,智能处理技术,智能运用技术。从百度百科里定义的“智能物流”的定义里,摘取几个关键的指标:-具有思维能力:思维能力指人们在工作、学习、生活中每逢遇到问题,总要“想一想”,这种“想”,就是思维。
在一个VPC网络中,由于特殊需求,我们需要针对VPC网内某一台或多台机器实现COS的限制访问或允许访问,对于该问题我们如何实现呢?下面就带大家来实际操作一下。首先,创建同一VPC下的两台CVM主机CVM1:10.5.0.6(内网IP)CVM2:10.5.0.12(内网IP)然后创建一个bucket,并进入权限管理添加描述复制策略,我们这里要禁用CVM1内网IP为10.5.0.6主机的访问GetBucket{ "Statement":[ { "Action":[ "name/cos:GetBucket" ], "Effect":"Deny", "Principal":{ "qcs":[ "qcs::cam::anyone:anyone" ] }, "Resource":[ "qcs::cos:ap-beijing:uid/1251956900:sunweitest-1251956900/*"
【新智元导读】刚刚,华为消费者BGCEO余承东在2018德国IFA上揭幕了“史上最强芯片”麒麟980,创下全球首款商用7纳米手机SoC等6项世界第一,搭载双核NPU,性能全面碾压高通骁龙845和苹果A11。麒麟980,一款“超级恐怖”的芯片! 刚刚,在2018德国IFA展会上,华为消费者BGCEO余承东倾情演绎,终于揭晓了这款举世瞩目的芯片——华为手机旗舰级处理器麒麟980,也兑现了此前放出的豪言:麒麟980性能非常恐怖,会是史上最强的芯片,遥遥领先高通骁龙845和苹果A11芯片!这次余承东发布华为麒麟980,仿佛几周前黄仁勋发布英伟达GeForceRTX2080Ti——都是提前一个多月就有各种传言和所谓的爆料流出,都有写得头头是道的分析和各种真真假假的数据,吊足了人的胃口。余承东笑着在台上说,怎么样,我们的芯片性能恐怖吧,还有,之前谣传的那些数据,都是错的。下面这张图才是麒麟980的真面貌:麒麟980创造了6个世界第一:全球最早商用的台积电7nm工艺的手机SoC芯片全球首次实现基于ARMCortex-A76开发的商用CPU架构,最高主频可达2.6GHz全球首款搭载双核NPU全球最新采
前言对于设计稿的解析中,肯定是有些设计稿有特殊的字体,而这些字体可能只有设计师才有,或者只有前端拓展了系统字库才能显示器正确效果。但对于前端页面的终极使用者,他们可能系统没有这些字体,那么对于这些特殊字体究竟该如何处理? 本文通过与设计,产品,前端的统一沟通,达成共识如下。请各个前端按照这个原则去对应的解析实现设计ui效果。界限划定首先我们的前提是针对常规正文,大篇幅文本的字体,而非标题、活动页、特效页的部分特殊字。对于前者我们是用css代码限定font-family,或者webfont解决实现;对于后者通过切图实现。 其中特别说明:OpenSans的中文字体在Mac上效果不错,微软雅黑的中文字体在Windows上效果不错。一解决方案–具体规范自带字体(推荐)用户系统中自带的字体,不需要任何特殊支持的,这类也被成为web安全字体。这部分设计师可以大胆去采用,但是一个项目中的正文也是建议控制在一种常规字体,建议body里定义默认正文字体列表,而不是每个部分都需要单独查看字体定义字体。css约定了五种都会支持的字体,另外不同系统也会支持不同的字体,汇总如下表格。字体种类字体列表css约定字
调试环境ubuntu12.04JDK1.7apache-maven-3.10eclipse4.2Junomysql5源码下载及调试上面的几个软件在上一篇中已经介绍了。在新的版本中,整个的编译和调试过程都是基于maven的,而且整个工程的结构也有所变化。更新git:sudoapt-getinstallgit-core复制安装maven,确认安装的是maven3sudoapt-getinstallmaven复制skyme@skyme-virtual-machine:~$mvn-version ApacheMaven3.1.0(893ca28a1da9d5f51ac03827af98bb730128f9f2;2013-06-2810:15:32+0800) Mavenhome:/home/skyme/java/apache-maven-3.1.0 Javaversion:1.7.0_21,vendor:OracleCorporation Javahome:/home/skyme/java/jdk1.7.0_21/jre Defaultlocale:en_US,platformencoding
文/pnig0s|小P 由知乎上的一个问题引出:http://www.zhihu.com/question/22787360/answer/22662598先来回顾下这次事件的背景:MtGox在2月7号发出公告,声称发现大量无效提现请求,需要分析原因,并暂停了一切提现操作。随后bitstamp等多个知名比特币交易网站均宣布暂停提现,从而引发了炒币者的恐慌,导致比特币价格一度腰斩。2月10号,MtGox再次发出公告称已查明原因,提现交易受到了“伪造交易ID攻击”,并说明将尽快恢复提现。这次事件的罪魁祸首是由于“比特币交易的可锻性(transactionmalleability)”引起的,可锻性体现在“交易ID可被伪造”,而“交易ID可被伪造”的原因是签名算法不够健壮。上面那段话如果有的朋友看着费劲的话,我来详细解释下,“可锻性”,“交易可锻性”及“交易ID伪造”究竟是怎么回事,为什么能够造成如此巨大的影响:1,关于“交易的可锻性(transactionmalleability)”:首先我们知道金银铜铁等金属是可以进行锻造的,《龙门镖局》中的白敬祺为了藏私房钱,将银锭打成了银夜壶,而银夜壶
一、线程的生命周期 当线程被创建并启动以后,它既不是一启动就进入执行状态,也不是一直处于执行状态,线程状态会多次在运行、就绪之间转换 线程的五种状态 新建(New) 当程序创建了一个Thread对象或Thread子类的对象后,该线程就处于新建状态,程序也不会立即执行该线程 就绪(Ready) 当调用start()方法之后,该线程就处于就绪状态(相当于等待执行) 处于就绪状态的线程并没有开始运行,仅仅表示该线程可以运行了,该线程何时开始运行取决于CPU调度 当线程对象调用start()方法之后,再次调用start()方法会引发RuntimeError异常 运行(Running) 如果处于就绪状态的线程获得了CPU的调度,线程开始执行run()方法,此时该线程处于运行状态 若系统只有一个CPU,那么任何时刻都只有一个线程处于运行状态 若系统由多个CPU,将会有多个线程并行运行 堵塞(Blocked) 当CPU对多个线程进行调度时,获得CPU调度却没有执行完毕的线程,就会进入阻塞状态 线程堵塞后,其他线程获得执行机会,但具体是哪个线程被指执行,取决于CPU调度 被堵塞的
当你在页面布局的时候,遇到页面元素较多,不知如何完美布局。。。 可以试试下面这个类型,万能布局类型。 varpanel=newExt.Panel({ renderTo:Ext.getBody(), title:'容器组件', height:200, width:500, layout:{ columns:3,//列数 type:'table'//表格类型 }, items:[{ title:'子元素1', html:'这是子元素1中的内容', rowspan:2,//纵跨两列 height:100 },{ title:'子元素2', html:'这是子元素2中的内容', colspan:2//横跨两列 },{ title:'子元素3', html:'子元素3中的内容' },{ title:'子元素4', html:'这是子元素4中的内容' }] })复制
关于如何使用微信JS-SDK,可以查看官方介绍说明:查看链接 在使用分享接口的过程中,查看了示例代码,其中包含两个文件jsapi_ticket.php和access_token.php,记录一下这两个文件的作用。 在官方文档中介绍了access_token如下: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。并且access_token每天调用的上线是2000次。 看了这个内容就知道access_token.php的作用了,是用来在有效期缓存住access_token,并且保证24小时之内不超过调用次数的上线(2000次)。在示例中,缓存时间是7000秒,不到2个小时,正好在失效前重新获取新的access_token。 同理jsapi_ticket.php道理也是一样的,两个文件都是用来做缓存用的,如果不想用文件记录,可以自行调整为
购买事宜请联系QQ:1793040 WWW.syncnavigator.cn HKROnlineSyncNavigator企业版8.4.1使用教程 SyncNavigator的基本功能:自动同步数据/定时同步数据无论是实时同步/24小时不间断同步 SyncNavigator是一款高效的数据库同步工具,支持sqlserver数据库和mysql数据库,采用增量同步的方式实时保存数据库数据。 因为是增量同步,记录每次同步时间戳,所以同步效率很高,不用每次整个数据库检查,每次只需要同步新修改的部分或者增加的部分,删除的部分本地也会删除,默认是同步增、删、改。 如果勾选只新增,那么同步时只会增加新内容,不会对修改和删除的老数据做任何操作,默认是不勾选的。 因为我们的数据库常规新产生的数据其实并不大,每一秒产生的数据也不会很多,原则上每一秒新产生的数据在800条一下,SyncNavigator基本同步没有任何压力,也不会对服务器产生任何负担和压力。 他的同步方式可以实时,也可以定时,更能根据客户设置按此执行,可以设置开始日期和停止日期,后台自动执行,不需要开软件,默认以服务的形式跟随计算机同步启
最近研究SpringMVC,发现他对MVC的实现和.net有很大不同,总结如下:虽然现在都是声明式的,但是配置文件还是要了解下的。 先看图 可以看到,frontcontroller就像一个gateway,所有的组件都和他直接交互。其他组件并不直接交互。 2.首先,要在WEB-INF/web.xml中配置一下,告诉servlet容器,我们的servletclass是谁。并且用它映射哪些url <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-n
同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/27343585 本文完整代码地址:GenerativeAdversarialNetworks(GANs)with2DSamples 50行GAN代码的问题 DevNag写的50行代码的GAN,大概是网上流传最广的,关于GAN最简单的小例子。这是一份用一维均匀样本作为特征空间(latentspace)样本,经过生成网络变换后,生成高斯分布样本的代码。结构非常清晰,却有一个奇怪的问题,就是判别器(Discriminator)的输入不是2维样本,而是把整个mini-batch整体作为一个维度是batchsize(代码中batchsize等于cardinality)那么大的样本。也就是说判别网络要判别的不是一个一维的目标分布,而是batchsize那么大维度的分布: ... d_input_size=100#Minibatchsize-cardinalityofdistributions ... classDiscriminator(nn.Module): def__init__(self,input_size
1、使用CPU-Z工具检查主板是否支持虚拟技术,因为VirtulBox虚拟机需要主板支持虚拟技术 2、Ubuntu安装之后重启会出现:pleaseremovethisinstallmedium,thenpressEnter, 出现这个问题的时候可以按住Ctrl+Home键即可解决,因为此时系统会自动弹出Medium,然后重新加载文件。 3、安装jdk:sudoapt-getinstalldefault-jdk,查看版本号:java-version 4、在mnt下创建挂载目录:sudomkdirproject 5、挂载windows共享文件夹:sudomount-tvboxsfproject/mnt/project 6、卸载nodejs: sudoapt-getremovenodejs 7、安装nodejs,先解压.xz,然后在解压.gz,删除目录以及目录下的文件:rm-rfdirectory tar-xJfnode-v6.10.3-linux-x64.tar.xz 8、将文件移动到通用的软件安装目录&nb
HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。--摘自百度百科 问题现象: get请求直接返回的字段值和response里的字段值不一致: 拉出来请求头对比一下,发现Referer里面对应的地址做了限制。 postman测试: 未去掉Referer限制的请求字段值: 去掉Referer限制后请求字段值: 问题原因: 富文本文件上传直接在工作台外打开直接预览的话做了安全限制。 时间有限,临时记录一下后期补充,感兴趣的话可以了解一下【CSRF跨站点请求伪造】。
一、存储引擎 1、InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用。 支持事务、行级锁、通过多版本并发控制(MVCC)支持高并发、提供一致性非锁定读、next-keylocking避免幻读、主键聚集索引 2、MyISAM引擎 设计目标是面向OLAP应用。 不支持事务、不支持行锁、表锁设计、支持全文索引 3、其他存储引擎 略 二、InnoDB体系结构 1、线程模型 InnoDB存储引擎是多线程模型,后台有多个不同的线程,用于处理不同的任务。 MasterThread:核心线程,将缓冲池中的数据异步刷新到磁盘 IOThread:负责io请求的回调处理 PurgeThread:负责undo页的回收 PageCleanerThread:负责脏页的刷新 1.1、MasterThread 内部由多个循环组成。包括主循环(loop),后台循环(backgroundloop) 主循环每隔一秒的操作 把日志缓冲刷新到磁盘,即使这个事务还没有提交。很好的解释了再大的事务提交时间也很短 合并插入缓冲 至多刷新n(可配置,自动调整,1.2版本之后)个脏页到磁盘 没有用户活动,切换到back