java中的操作句柄的问题

问题描述

java中的操作句柄的问题

在学习java的过程中,遇到这样一个问题:值传递和引用传递
我知道在所谓的值传递,仅仅是复制,然后传递,这样修改的值不会影响原值(基本数据类型都是值传递)
而引用传递是传的事地址,这样修改的话,原值也会被修改(类似于函数的参数如果是一个对象的话)
以上是我的理解,不对之处,请各位指正和补充(新人初学,谢谢)
但是还有这样一个问题:
A a = B.方法
这条语句和A a = new A();创建对象有点像,之前问过一次,但是不是很理解,所以再次问下,还望各位能解释一下,第一条语句,我理解的是这个a是一个B.方法返回值的一=引用,所以当我想要操作B,返回值时,只要操作a就可以了,但是我理解的是这个是不是可以理解为引用传递,所以当修改a的时候,B.方法的返回值也就会被改变,不知道这样对不对,新人对于这些值传递。引用传递一直搞不懂,不知道怎么区分,以及都有什么用,求各位能够解答解答。谢谢大家了

解决方案

 首先,java只支持函数的值传递,不支持什么引用传递。换一句话说,修改形参,永远不会作用到实际参数上。
区别在于,这个“值”是什么,对于class类型,这个值是引用,对于值类型,这个值就是值。
比如
A a = new A();
A b = a; //此时b和a指向同一个对象。
b.x = 1; //因为a和b指向同一个对象,所以修改b.x其实就是修改的a.x
b = new A(); //此时 b 指向另一个对象,那么a呢?a还是指向原来的对象。
b.x = 2;//此时因为b和a指向不同的对象,所以不会修改a。
对于函数
void foo(A a)
{
a = new A();
}
调用
A a = null;
foo(a);
这么写,永远不可能改变调用者a的引用,a还是指向null。
我说了,Java不支持引用传递,为了模仿这个语法,必须再包装一层。
class B
{
A a;
}
void foo(B b)
{
b.a = new A();
}
调用
B b = new B();
b.a = null;
foo(b); //此时,b.a指向一个对象,不再是null,但是作为包装的b,则还是按值传递。

解决方案二:

当修改a的时候,B.方法的返回值也就会被改变,
假设B里新创建了一个对象,那么a指向了这个对象,而你再次进入B之后,B中就不能再操作这个对象了,此时只有a可以更改这个对象

解决方案三:

 java如果从定义来说都是值传递,没有引用传递,这和C,C++等不一样。
 例如你上面A a=B.方法
 如果你再上面调用B方法后,在调用a=C.方法,则只是改变了a这个变量对象的地址值,原来的对象是不会改变的。

 一般误认为有引用传递,是因为觉得比如
 class A{
   public int k = 0;
 }
 比如
 A a=B.方法
 A a1 = a;
 操作a.k = 5;这么一步改变类内部的属性,a1引用的对象a1.k也跟着改变。误以为是引用传递,但实际这是因为指向的是同一个对象而已。
时间: 2024-09-19 08:59:16

java中的操作句柄的问题的相关文章

初始化-java中jacob操作word文档

问题描述 java中jacob操作word文档 org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.ExceptionInInitializerError Caused by: java.lang.ExceptionInInitializerError Caused by: java.lang.IllegalStateExcept

java中 从操作数据库,是不是通过流来实现的。

问题描述 java中 从操作数据库,是不是通过流来实现的. java中 从操作数据库,是不是通过流来实现的.java中 从操作数据库,是不是通过流来实现的. 解决方案 java对数据库的操作Java JDBC实现数据库的增删改查操作java操作Access *.mdb数据库的实现 解决方案二: 所有的数据最底层都是数据流,只是上层的封装格式不一样,java一般使用jdbc调用数据库,有兴趣你可以查查jdbc的工作原理 解决方案三: http://blog.csdn.net/brilliancez

基于java中正则操作的方法总结_java

正则表达式在处理字符串的效率上是相当高的 关于正则表达式的使用,更多的是自己的经验,有兴趣可以参阅相关书籍 这里主要写一下java中的正则操作方法 实例1:匹配 复制代码 代码如下: import java.util.Scanner; class Demo {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        //获取输入        System.out

java中cookie操作详细

1.设置Cookie  代码如下  Cookie cookie = new Cookie("key", "value"); cookie.setMaxAge(60);   设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效.  代码如下 cookie.setPath("/test/test2");   设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getConte

java中IO操作 利用文件流 过滤流对文件进行读写操作

/* 两种基本的流是:输入流(Input Stream)和输出流(Output Stream) .可从中读出一系列字节的对象称为输入流. 而能向其中写入一系列字节的对象称为输出流. System.out.println   中的 out 是 PrintStream 类对象   System类的静态成员可以向 输出流写入数据 System.in.read()     in 是InputStream类的成员 可以从键盘等输入设备读取字节数据  利用FileInputStream   FileOutp

java中io操作时,路径问题

问题描述 java操作时,对于文件的路径一直不是很清楚,还有就是相对路径和绝对路径,最重要的是windows系统的转义字符的问题.能否详细的说说. 解决方案 解决方案二: 46.15%看你的结帖率估计老竹子不会回你的哈哈解决方案三: 路径,这个你还是去补习一下基础知识吧.我就不多说了.解决方案四: 路径问题,楼主不需要关心转义字符,全部用"/"号代替就是了.java会自动帮你处理如:path="c:/folder1/folder2/aa.txt"你用"/&

java-Java中关于Vector句柄的问题

问题描述 Java中关于Vector句柄的问题 这段代码中: import java.util.*; class CrashJava{ ?public static void main(String[] args) ?{ ? ?Vector v = new Vector(); ? ?for(int i = 0; i < 10; i++) ???v.addElement(new CrashJava()); ??System.out.println(v); ?} } 为什么打印出的是Vector中的

java IO 文件操作

  /* java  文件操作  java中文件操作的类是 File类   可以实现对文件的创建删除  修改等 File类  在  java.io包中  下面是 通过 java.io.File类实现对文件操作 File类没有提供对文件的读写方法 */ import  java.io.*;   //导入io包 class  Test {  public static void main(String []args)  throws Exception //直接吧所有异常抛出给 JVM虚拟机  {

Java 中对文件的读写操作之比较

比较 Java 中对文件的读写操作之比较 作者:Jeru Liu日期:November 29,2000版本:1.0 Java 对文件进行读写操作的例子很多,让初学者感到十分困惑,我觉得有必要将各种方法进行一次分析,归类,理清不同方法之间的异同点. 一.在 JDK 1.0 中,通常是用 InputStream & OutputStream 这两个基类来进行读写操作的.InputStream 中的 FileInputStream 类似一个文件句柄,通过它来对文件进行操作,类似的,在 OutputSt