精华内容
下载资源
问答
  • java形参传递情况

    2021-03-02 19:55:53
    说白了,Java只有值传递,网上说的什么两种传递方式:值传递和引用传递的都不是很准确。要知道所谓的引用传递传递的也是指向堆内存中对象的“地址值”。都是“值”而已。也就涉及到4个东西——实际参数、形式...

    1.当把对象作为方法形参传入时,是传入地址,同时新建另一个对象,那么将会新建一个方法对象,change()方法将丢失传入的形参地址。

     

    2.当新建一个对象保存形参时,得以保存

     

    3.当时如果改变转入形参的地址,改变了其地址的属性(成员变量),那么将会影响到实参的属性。

     

    解释:

    说白了,Java只有值传递,网上说的什么两种传递方式:值传递和引用传递的都不是很准确。要知道所谓的引用传递,传递的也是指向堆内存中对象的“地址值”。都是“值”而已。也就涉及到4个东西——实际参数、形式参数、基本数据类型、引用数据类型。

    简单的说,

    ①实参是基本数据的时候,复制一份值给形参。因为这个基本数据类型的值不指向堆内存中的对象,所以不会改变实参的值。

    ②实参是引用类型时,也复制一份“地址值”给形参,这时实参和形参都指向堆内存中的同一个对象,所以当形参通过这个地址值改变了堆中对象的属性时,实参也会改变。而当文中的形参s=s+"edf"时,堆内存中会创建另一个新对象,形参指向的对象和实参指向的对象已经不同了(即地址值不同了),所以实参不会改变。

    展开全文
  • 文章目录1.1 参数传递1.2 float与double...Java方法中参数的传递是值传递,而不是引用传递。 下面看个例子来说明是值传递。 public class chapter3_1 { static class Dog { private String name; public Dog(St...

    1.1 参数传递

    Java方法中参数的传递是值传递,而不是引用传递。

    下面看个例子来说明是值传递。

    public class chapter3_1 {
    
        static class Dog {
            private String name;
    
            public Dog(String name){
                this.name = name;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            /**
             * 返回当前对象地址
             *
             * @return
             */
            public String getObjectAddress(){
                return this.toString();
            }
        }
    
        public static void main(String[] args){
            Dog dog = new Dog("A");
            System.out.println(dog.getObjectAddress());//@73035e27
            fun(dog);
            System.out.println(dog.getObjectAddress());//@73035e27
            System.out.println(dog.getName());// A
        }
    
        private static void fun(Dog dog){
            System.out.println(dog.getObjectAddress());//@73035e27
            dog = new Dog("B");
            System.out.println(dog.getObjectAddress());//@64c64813
            System.out.println(dog.getName());// B
        }
    }
    

    可见,Dog(“A”)的对象dog传递给fun方法相当于一个指针变量,所以fun方法中的第一个println打印的地址和main方法中打印的地址是一样的。当fun函数让形参dog重新指向新的对象的时候Dog(“B”),第二个println打印就是一个新的地址。在main()函数中虽然经过了fun方法,让dog重新指向新的地址,但是fun方法一结束,新指向的地址变量也就销毁了,main方法中的dog对象在程序后面还在使用,所以并不会销毁,所以还是指向原来的地址。

    public static void main(String[] args){
            Dog dog = new Dog("A");
            fun(dog);
            System.out.println(dog.getName());// B
    
    
        }
    
        private static void fun(Dog dog){
            dog.setName("B");
        }
    

    经过上面的分析,也就可以知道fun方法修改dog对象子段在main方法中为什么输出的是B啦。因为改变的是同一个地址指向的内容。

    1.2 float与double

    Java不能隐士向下转型,因为会降低精度。

    float f = 1.1;
    

    这里会报错,1.1属于doble类型,是不能直接从double赋值给float,因为是向下转型。
    如果要解决的话,就需要显示定义float f = 1.1f;

    1.3 隐士类型转换

    short s1 = 1;
    // s1 = s1 + 1; 这里会进行报错,因为s1 + 1 是int类型 而s1是short类型,所以不能向下转型。
    

    如果要处理必须修改为s1 = (short) (s1+1);

    1.4 switch

    switch是不支持long类型的比较的。

     long x = 111;
            switch (x){ // Incompatible types. Found: 'long', required: 'char, byte, short, int, Character, Byte, Short, Integer, String, or an enum'
                case 111:
                    break;
                case 222:
                    break;
            }
    

    这里会提示,switch是无法比较long类型的变量的。

    展开全文
  • java形参传递机制

    2021-04-26 13:20:52
    * 方法的形参传递机制:值传递 * * 1.形参:方法定义时,声明的小括号内的参数 * 实参:方法调用时,实际传递形参的数据 * * 2.值传递机制 * 如果参数是基本数据类型,此时实参赋给形参的是实参真实...
    package com.atguigu.java1;
    /*
     * 方法的形参的传递机制:值传递
     * 
     * 1.形参:方法定义时,声明的小括号内的参数
     * 	实参:方法调用时,实际传递给形参的数据
     * 
     * 2.值传递机制
     * 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
     * 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值
     */
    
    public class ValueTranferTest1 {
    	
    	public static void main(String[] args) {
    		String s1 = "hello";
    		
    		ValueTranferTest1 test = new ValueTranferTest1();
    		
    		test.change(s1);
    		
    		System.out.println(s1);
    	}
    	
    	public void change(String s) {
    		s ="hi";
    	}
    	
    }
    
    

    在这里插入图片描述

    展开全文
  • 关于Java形参传递 深浅Copy引言基本变量自定义对象String Integer特别的自定义变量以上的结果验证 引言 对本题目的思考源于很早之前从C转到Java的时候,老师给我们讲形参 和 java的值的传递的时候还有面向对象时 ...

    引言

    对本题目的思考源于很早之前从C转到Java的时候,老师给我们讲形参 和 java的值的传递的时候还有面向对象时 传递的只是一个形参而已如果你在另一个方法改变传递的形参的值,对原来传递的值没有影响 当时用的基本参数 结果也可以看出。这和C和C++中的内存中的指针的传递还是有区别的。当时我也是受这句话影响颇深,后来在写算法题的时候 当我写到一道数据结构题 单向链条遍历的时候(用的递归) 我突然想到如果这种循环遍历的条件如果全部都是形参传递(值的复制传输)对内存的占用将是巨大的
    在这里插入图片描述
    每个点代表一个Node节点每一次递归调用都会复制nextNode节点之后的所以值如果这个对象稍微大点内存的占用将会成倍的增加。还有最重要的如果你对中间对某一个节点进行删除这对原来的单向链表是没有作用的因为你是对复制的值(形参)进行改变的,可是由结果得这显然是对单向链表是有影响的,所以由此我基本可以推论当时老师说的是有问题的。所以我当时就开始了实验

    基本变量

    八大基本变量 short int long float double char boolean byte
    我们通过方法改变他们的值,基本变量的值是有固定的地点的。
    int a是声明 a是个基本变量的名字他的值为4字节的值为1的内存
    int b=1; int c=1;他们指向的全部为不同的地址 比如在创建对象的时候无论你有没有对基础类型赋值它都会有默认的值,这个值会在这个对象里占据相应的字节数。
    所以我们对内存地址不同的两个值进行改变这是无法同步的。

    自定义对象

    除基本类型外的所有类型全部为自定义对象
    自定义对象的 User u1=new User(); User u2=new User();他们是不同的两片地址 new的含义就是去申请一片内存 =号的含义就是让u1指向申请这片内存在方法的调用中 如果我们传递的值为一个自定义对象 test(u1)我们同样传递的也是内存地址将u1声明的值(u1的指向的内存地址传过去)同样java会复制一个声明去接这片内存 test的实现{ u.setName }我们对复制的这个引用进行方法调用 这片内存就会被改变 那么原来传进来的u1会不会被改变 答案是明显的是会被改变的。为什么会这样那 先别懵
    首先对象并不会存值 他只会将声明存下来他并不会去存这个值。比如说你改变了User他基础类型的值 他只会改变他的这个声明的指向。在对象实例中你可以将 一个数据例如 Object a 或者 int b 他会由三部分组成一个为这个数据的名字,一个为他的类型,一个为他的值或者引用(Vaule)。 对于自定义对象类型他的Vaule为一个内存区域的引用 而对于基础类型 Vaule部分就为他的值

    String Integer特别的自定义变量

    String 和 Integer在某种意义上来说已经属于一种基本类型,因为真的是太常用太常用了。为什么常用就要把他们俩向基础变量改变呐 因为你可以看到所有的基础变量都有一个规则那就是重复值的使用 实际的开发中会省太多的内存空间了 比如1000个1的值才占4字节。而String的底层是Char类型的数据你不可能说每个String都占不一样的地址把 String太常用 太常用而且占的空间也不小。所有让他们偏向基础类型 在=号的情况下 会先检查有没有相同的String值 相同的值会有相同的指向 你可以去看JVM=申请的时候和New申请的时候所放在的内存区域都是不一样的。

    以上的结果验证

    有时间的可以自己去试一试,最不想的就是下班了还要敲代码。上班的地方又没网
    重要: 所有的自定义对象到最后都是基础变量的叠加(重要! 重要!)
    在这里插入图片描述

    ##结果延伸 深浅Copy
    比如说你想Copy一份相同的对象 你直接通过get方法去获得这是没有问题的 然后你set给另一个你new出来的值
    dog d=new dog();
    int age=1;
    Uset u1=new User(d,1) ;
    Uset u2=new User(u1.getAnimal(),u1.getAge()) ;
    u2是u1的Copy某种意义上说是对的但是在比较深层次的意义上是错误的因为他们的Animal还是同一个对象 这种就属于浅Copy他并非是真正意义上的Copy而深Copy 当你把 Uset u2=new User(new dog(u1.getAnimal().getName()),u1.getAge()) ; 当你把u1.getAnimal()换为new dog(u1.getAnimal().getName())这种程度上就是深Copy了他把复制的粒度已经到了基本类型这就叫深Copy 因为以上讲解的基本类型的特性你就可以明白了 精确到基础类型就可以让复制的对象和原来的对象完全独立开了。同样也可以印证以上的 重要: 所有的自定义对象到最后都是基础变量的叠加(重要! 重要!)
    还有就是如果所有空间到最后都是基本类型的叠加哪将会省多少内存空间呐?

    展开全文
  •  java中参数都是值传递方式(String也不例外,我理解的值传递,都是传递实参的副本,但是要弄清楚,这里的拷贝,拷贝的是实参变量地址(栈),而不是实参变量指向的对象),其实质是传递实参副本,分析过程如下。...
  • public class huhuan { private int a1,b1;//要互换的数 public int geta1() { return a1;//返回值 } public int getb1() { return b1;//返回值 ...public huhuan(int a,int b) {//传参 ...public static void swa...
  • 分析java 函数参数传递的类型. 首先看示例: //定义一个受测试的类 public static class Value { private String value = "value"; public String getValue() { return value; } public void ...
  • package 类和对象; /** *@author 作者 Your-Name: ...*在java中地传递机制是:值传递 * */ public class Day6_06 { int i = 1; int j = 2; public static void main(String[] args) { // TODO Aut...
  • 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间。因此仅在方法内有效。 public void swap(int a, int b) { int temp = a; a = b; b = temp; } 这里a,b就是形参...
  • 用一个列子来说明java基础类型和引用作为形参,是否会改变值 package com.cn.hnust.controller; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util....
  • Java方法中引用类型的形参传递问题

    千次阅读 2015-03-26 15:59:39
    众所周知,Java方法的形参如果是基本类型,是值传递,也就是说实参将数值传递形参后,形参对值的操作跟实参变量毫无关系,举例: public static void change(int a, int b){ a = a + b; }int c = 1, d = 2; ...
  • 本文探讨Java中数组中的赋值问题。在探讨这个问题之前必须先弄懂一件事,Java中的数组到底是什么东西?是类,是对象,还是什么其他奇奇怪怪的东西。答案是:Java中的数组本质上是对象。但是这个对象不是通过某个类...
  • Java 形参与实参

    2018-03-16 14:53:13
    一个很有意思的小问题,一开始有些乱后来想想就明白了,所以我就对java参数传递做一个总结,以加深自己的基础知识。形参和实参的区别形参就是形式参数,用于定义方法的时候使用的参数,用来接收调用者传递的参数。形参...
  • Java方法中形参传递(值传递和引用传递的区别): public class ChangeValueThenPrintResult { public static void main(String[] args) { // TODO Auto-generated method stub String a = "a"; int b = 0; ...
  • 发现当把 String 当形参传递时,调用的构造方法 如下: * Allocates a new {@code String} that contains characters from a subarray * of the character array argument. The {@code offset} argument is the *...
  • java中方法参数传递方式是按值传递。 如果参数是基本类型,传递的是基本类型的【字面量值的拷贝】。 如果参数是引用类型,传递的是该参量所引用的对象在堆中【地址值的拷贝】。 参考: Java传递 or 引用...
  • java形参总结(初稿)

    2018-11-06 16:58:08
    2、引用传递,这个是可以改变的,但是仅仅是可以改变里面的成员变量啥的,因为,形参传递的时候只是一个副本地址而已,当然了,都是指向原来的对象。如果想获取新的对象,可以当作返回值返回回去   三...
  • 1.类名作为形参 方法的形参是类名,其实需要的是该类的对象 //创建一个猫类 public class Cat { public void eat(){ System.out.println("猫吃老鼠"); } } //创建一个操作类,其方法的参数是猫类 public class ...
  • java 形参、实参

    2013-11-04 11:54:41
    形参传递地址(数组 对象) 形参是定义方法的时候,该方法所携带的参数,不如说现在有一个方法 public void printInfo(String info){ System.out.println(info); } 此处info就是一个形参,它是String类型的。 实参...
  • Java实参与形参,值传递与引用传递 java形参与实参 public static void main(String args[]){ int a=0; //a实参 test(a); System.out.println(a); } //test(形参类型 形参名) public static void test(int...
  • Java包装类传递形参

    千次阅读 2017-08-22 09:52:43
    Java包装类传递形参先看一段程序:package com.interview.bytelearn;/** * 原题链接:https://www.nowcoder.com/questionTerminal/1bab09264a1c4528aa60ee9bca5f0976 */public class Test2 { public static void ...
  • 源码地址:...2.当传值调用时,改变的是形参的值,并没有改变实参的值,实参的值可以传递形参,但是,这个传递是单向的,形参不能传递回实参。 3.当...
  • 形参:是定义方法时使用的参数,用来接收调用者传递的参数,而且只有方法调用时虚拟机才会分配内存空间,在方法调用结束后便会释放所分配的内存单元。 实参:是调用方法时给方法传递的值,预先创建并赋予值。 //...
  • java形参的值传递

    2012-02-20 06:35:57
    ====================================================== 注:重要!程序员如何有效的放松身心!下班后做什么?...java形参的值传递 posted on 2011-02-18 13:37 我是孙海龙 阅读(396) 评论
  • Java Jni 中,如何将C/C++中的字符串通过JNI接口的形参传递Java Java 调用: String facestring ="wwwww"; nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), f.getNativeObjAddr(), cc, str); ...
  • java中main方法有一个字符串数组型的形参args,因为main方法是由系统调用的,程序员向其传递参数的手段也有所不同。下面介绍两种将数据传递给main方法的args形参的方法。 在使用命令行执行java的class文件时: 在...
  • Java形参跟实参是什么?

    千次阅读 2019-03-22 14:25:06
    形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。 形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数...
  • Java形参和实参的区别

    2017-10-26 14:39:55
    形参:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。 例如: int func(int a) {……}这里定义了函数func(),括号里的a即为该函数的形参。实参:可以是常量、变量、表达式、函数...
  • java形参和实参的区别(值传递 引用传递形参和实参的区别 形参 就是形式参数,用于定义方法的时候使用的参数,用来接收调用者传递的参数。形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用...
  • java只有值传递,方法上传的是引用对象的地址 因为java中方法的参数传递的原则是复制。也就是说不管是值传递还是引用传递,参数传递的都是值得拷贝或者是引用的拷贝。因此对象作为参数传递的是对象的引用 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,079
精华内容 831
关键字:

java形参传递

java 订阅