今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟悉的值传递…
JAVA String对象和字符串常量的关系解析 1 字符串内部列表 JAVA中所有的对象都存放在堆里面,包括String对象.字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了. 虚拟机为每个被装载的类型维护一个常量池.常量池就是该类型所用常量的一个有序集合,包括直接常量(string.integer和float point常量)和对其他类型.字段和方法的符号引用. 例如, String s = new String( "myString" ); 其中字符串常量…
java 实体对象转Map公共类 package org.kxtkx.portal.utils; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import org.kxtkx.portal.user.Admin; /** * * @author <a href="mailto:wangc@kxtkx.com">王成</a> * @created i…
最近在写一段代码的时候,不懂JAVA的我被困住了.先简单描述一下要实现的效果:我要往secretVector里塞28个byteVector,这28个byteVector分别装着10个数值,而且这28个byteVector互不相同. public static Vector reformChildSecret(Vector fileVector){ Vector secretVector= new Vector(); Vector byteVector= new Vector(); for(int…
Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引用所指向. (2).对象引用: 相似于C++中的地址.通过对象引用能够找到对象. 一个引用能够指向多个对象.操纵的标识符实际上是指向对象的引用. 就像:对象存放在屋子里,对象的引用就相当于屋子的钥匙. 2.值传递和引用传递的差别: (1).值传递:传递的是值的拷贝. 也就是说传递后就不互相关了. (…
初学Java 时.在非常长一段时间里,总认为基本概念非常模糊. 后来才知道.在很多Java 书中.把对象和对象的引用混为一谈. 假设分不清对象与对象引用,那实在没法非常好地理解以下的面向对象技术.把自己的一点认识写下来,也许能让初学Java 的朋友们少走一点弯路. 为便于说明,我们先定义一个简单的类: class student{ int name; int age; int sex; } 有了这个类( 模板) ,就能够用它来创建对象:student stu1 = new student();…
偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万物皆对象,比如我们定义一个简单的动物类: class Animal { String count; String weight; .... } 有了这个Animal类之后,我们可以来创建一个Animal对象: Animal an = new Animal(); 我们把编写这个语句的动作就称作创建一个…
public class TestExtends { public static void main(String[]args){ int s = 10; System.out.println(System.identityHashCode(s)); s=3*s; int num = 30; System.out.println(System.identityHashCode(s)); System.out.println(System.identityHashCode(num));} 输出 4…
科普: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数. 值传递 引用传递 根本区别 会创建副本(Copy) 不创建副本,直接引用 效果 函数中无法改变原始对象 函数中可以改变原始对象 Java 中的实参与形参之间的传递到底是值传递还是引用传递呢? 其实之前我和…
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过. 2.为新生对象分配内存 对象所需内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来.划分的方法主要有两种: a.指针碰撞 如果java堆中内存是绝对规整的,所有用过的内存都放在一边,未使用的内存放在另一…
构造函数 作用:在构造对象的同时初始化对象.java强制要求对象 诞生同时被初始化,保证数据安全. 调用过程和机制:①申请内存,②执行构造函数的函数体,③返回对象的引用. 特点:与类同名,无返回类型,可以重载. 每一个类都至少有1个构造函数,如果不显示定义构造函数,则javac会帮我们添加一个默认的无参数的构造函数.如果自己提供了构造函数,则javac不会再提供默认的无参构造函数. 一个类中,对象构造时的构造过程 顺序如下: 1.字段获取相应类型的默认值(基本类型是 0 ,引用类型是null),…
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------…
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------…
一.对象序列化机制 序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以被保存在磁盘上或通过网络传输,以备以后重新恢复原来的对象: 序列化机制使得对象可以脱离程序的运行而独立存在: 二.对象序列化与反序列化 对象的序列化(Serialize):指将一个Java对象写入IO流中: 对象的反反序列化(Deserialize):则指从IO流中恢复该Java对象: 三.序列化实现 如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化(serializable),为了让某个类可…
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回…
我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM的体系结构 垃圾回收器(Garbage Collection):负责回收堆内存(Heap)中没有被使用的对象,即这些对象已经没有被引用了.类装载子系统(Classloader Sub-System):除了要定位和导入二进制class文件外,还必须负责验证被导入类的正确性,为类变量分配并初始化内存,以…
Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况. 但是如…
Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制(深拷贝):在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机. 反序列化是把流结构的对象恢复为其原有形式 2.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实…
Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建对象的方式: 1.构造器:用new语句创建对象,这是最常用的创建对象的方式. 2.反射:运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法. 3.克隆:调用对象的clone()方法. 4.序列化:运用反…
Java Object 对象拷贝答疑 @author ixenos 摘要:在对象的clone过程需要注意的几点.关于关键字this.super 关于clone[对象拷贝] 在实际编程过程,有时候我们会遇到一种情况:当你有一个对象A,在某一个时刻,A已经保存了对应的属性值,而且这些值本身是有效的,这个时候可能需要一个和A完全相同的对象B,并且当B里面的属性值发生变化的时候,A中的属性值不受影响,可以理解为A和B独立,但是B的初始化不是按照我们平时创建该对象的时候的初始化操作,B的初始化数据完全来自…
Java Object 对象拷贝 @author ixenos JAVA 对象拷贝 Java里的clone分为:  1.浅拷贝:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象,Object类里的clone方法是浅拷贝  2.深拷贝:深复制把要复制的对象及其所引用的对象都复制了一遍 3.序列化深拷贝:把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程.应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然…
一.前言: 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说"书籍是人类进步的阶梯".之前学知识,喜欢网上找份教程,看点视频,照着做呗,秉着"我做过的东西反正别人肯定玩过"的观念,一通乱学,学的又多又杂,现在细细想来,很多东西我只是学到了它的形,却没有学到它的神,只是在抄别人的代码.为什么这么做?这么写是出于什么考虑?我都一脸懵懂!而现在我喜欢看书,…
当你有很多书时,你会考虑买一个书柜,将你的书分门别类摆放进入.使用了书柜不仅仅使房间变得整洁,也便于以后使用书时方便查找.在计算机中管理对象亦是如此,当获得多个对象后,也需要一个容器将它们管理起来,这个容器就是集合. 集合本质是基于某种数据结构数据容器.常见的数据结构:数组(Array).集(Set).队列(Queue).链表(Linkedlist).树(Tree).堆(Heap).栈(Stack)和映射(Map)等结构.本文将为大家介绍Java中的集合. 一.集合概述 Java中提供了丰富的集…
     C语言是一种面向过程语言,在解决问题时,要先分析出问题的解决步骤,然后按顺序一步步实现,使用的时候一个一个调用.所以面向过程编程是以过程为中心的.      不同于面向过程编程,面向对象编程在解决问题时,先抽象出各个对象,每个对象包含自己的属性和行为,通过各个对象的相互调用和交互实现整个程序.面向对象编程支持封装,继承,多态等.      java也是一种面向对象的编程语言,每个类的实例都是一个"对象",比如              Student student = ne…
Java开发知识之Java面相对象上 一丶什么是面相对象 了解什么什么是面相对象.那么首先要了解什么是面相过程. 面相过程的意思就是. 什么事情都亲力亲为. 比如上一讲的排序算法. 我们自己写的. 这个就是面相过程. 而使用面相对象的话.我们直接调用别人写好的sort()方法即可. 面相过程的比喻:  你想吃东西. 买东西. 切菜. 下锅. 做好了. 吃饭. 面相对象:  直接商店买了. 直接吃.  你省去了买东西. 切菜 下锅. 自己做的步骤. 这个就是面相对象. 1.1对象的理解 现实世界中…
一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启动: 1.检查这个指定的参数是否能在常量池当中定位到一个类的符号引用,并且去检查这个符号引用代表的类是否已经被加载.解析和初始化过,如果没有就需要先执行相应的类加载的过程: 2.类加载完成之后需要进行为新生的对象分配内存,对象所需要的内存大小在类加载完成之后就已经完全确定: 分配内存的其中两种方式:…
在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.之前有搜过相关的知识点一直理解的是:Java的传参方式中主要有两种:传值和传引用.(基本数据类型相当于传值,对象相当于传参) 但是,在做需求的时候遇到了,将从上一个方法中获取到的对象,当做参数传进下一个方法中的时候,如果传进来的是空对象,那么在给这个“对象”直接赋值的时候,会报空指针异常! 探究与理解:Java中传值也就是传的是原变量的一个副本,函数内部无论怎么操作…
所谓的『JAVA 对象序列化』就是指,将一个 JAVA 对象所描述的所有内容以文件 IO 的方式写入二进制文件的一个过程.关于序列化,主要涉及两个流,ObjectInputStream 和 ObjectOutputStream. 很多人关于『序列化』的认知只停留在 readObject 和 writeObject 这两个方法的调用,但却不知道为什么 JAVA 能够从一个二进制文件中「还原」出来一个完整的 JAVA 对象,也不知道一个对象究竟是如何存储在二进制文件中的. 本文会带大家分析二进制文件…
对象与对象变量: 要想使用对象,就必须首先构造对象,并指定其初始状态,然后,对对象应用方法. 在Java中,使用构造器构造新实例.构造器是一种特殊的方法,用来构造并初始化对象. 在实际开发中,通常需要将对象存放在一个变量中来达到多次使用的目的. 在这里,birth指向了Date对象的存储的地方的引用. Date birthday = new Date(); 在对象与对象变量直接存在着一个重要的区别,例如: Date deadline; //deadline dosen't refer to an…
一.前言 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说“书籍是人类进步的阶梯”.之前学知识,喜欢网上找份教程,看点视频,照着做呗,秉着”我做过的东西反正别人肯定玩过“的观念,一通乱学,学的又多又杂,现在细细想来,很多东西我只是学到了它的形,却没有学到它的神,只是在抄别人的代码.为什么这么做?这么写是出于什么考虑?我都一脸懵懂!而现在我喜欢看书,花时间来沉淀自己的知识,与大家共…