关于Java获取子方法的新建实例引用的心得

原创 2015年07月08日 10:56:50
    Java有8种基本类型char、byte、short、int、long、float、double、boolean。Java中的引用类型,是指除基本类型之外的所有类型(包括String),所有的类型在内存中都需要分配一定的存储空间(形参在使用的时候也会分配存储空间,正常情况下,方法调用完成之后,这块存储空间自动消失)。
    基本的变量类型只有一块存储空间(分配在stack), 而引用类型则有两块存储空间(一块在stack,一块在heap)。下面分两种情况:
    一、方法实参形参的值传递是指形参和实参的值是相同的,但是他们在stack上的位置应该是不一样的,所以在方法中修改形参并不会影响到实参。
    二、方法实参与形参的引用传递则稍有不同,他们的stack也是不一样的,但它们指向的内存heap数据块是一样的,这就直接导致了修改heap数据后,实参所指向的heap数据也被修改乐(类似C语言中的指针)。
    那么问题来了,如果希望在子方法中new出一个实例,并将该实例返回给上层调用,应该怎么做?
    首先,是mainstring1直接传给子方法,从输出可以看出其代表String内容的地址并没有真正传出。
    其次,是方法2,可以看出使用return,确实可以将内部temp的处于stack内存的值传给外部,外部的mainstring2就指向了heap的数据。
    最后,方法3是需要你在外部定义一个对象的数组,比如本例,是希望最后得到子方法中新建的String数据,可以通过在外部建立一个数组,通过它的元素来接纳,这样在子方法运行完后,虚拟机发现形参的作用范围已经结束,按理说该String会被回收,但此时不止形参使用到数据块,外部mainstring3数组中的元素也能索引到该String,所以它不会被delete,并且可以传导出来。
    看如下代码:
package test;

public class st {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String mainstring1 = null;
        reftest1(mainstring1);
        System.out.println("mainstring1:" + mainstring1);
        String mainstring2 = null;
        mainstring2 = reftest2();
        System.out.println("mainstring2:" + mainstring2);
        String mainstring3[] = new String[1];
        System.out.println("mainstring3[0]:" + mainstring3[0]);
        reftest3(mainstring3);
        System.out.println("mainstring3[0]:" + mainstring3[0]);
    }

    public static void reftest1(String temp) {
        System.out.println("reftest1 before new:" + temp);
        temp = new String("Just_Do_IT_Ye at CSDN");
        System.out.println("reftest1 after new:" + temp);
    }

    public static String reftest2() {
        String temp = new String("Just_Do_IT_Ye at CSDN");
        System.out.println("reftest2 after new:" + temp);
        return temp;
    }

    public static void reftest3(String temp[]) {

        temp[0] = new String("Just_Do_IT_Ye at CSDN");
        System.out.println("reftest3 after new:" + temp[0]);

    }

}
    输出如下:
        reftest1 before new:null
        reftest1 after new:Just_Do_IT_Ye at CSDN
        mainstring1:null
        reftest2 after new:Just_Do_IT_Ye at CSDN
        mainstring2:Just_Do_IT_Ye at CSDN
        mainstring3[0]:null
        reftest3 after new:Just_Do_IT_Ye at CSDN
        mainstring3[0]:Just_Do_IT_Ye at CSDN
    综上,可以知道主要有两种方法来获取子方法的新建实例引用,分别是通过方法的返回和建立实参数组。
版权声明:本文为博主原创文章,未经博主允许不得转载。

java中获取class实例的三种方法

1.当在内部类中使用this指的就是内部类的对象, 为了访问外层类对象,就可以使用外层类名.this来访问。 2. 在java中,每个class都有一个相应的Class对象,当编写好一个类,编译...
  • u011501336
  • u011501336
  • 2014年09月07日 09:54
  • 3452

Java Class类以及获取Class实例的三种方式

java.lang 类 Class T - 由此 Class 对象建模的类的类型。例如,String.class 的类型是 Class。如果将被建模的类未知,则使用 Class。 public...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2013年12月12日 21:53
  • 11453

QTP9[1].0编程常用方法及实例心得.doc(转)

  • 2008年08月28日 13:28
  • 671KB
  • 下载

QTP编程常用方法及实例心得

  • 2014年12月30日 10:27
  • 651KB
  • 下载

Java 调用 Matlab并在Swing界面显示实例与心得总结

为了让自己更好的记住如何运用Matlab打包java以及swing界面参数传递等问题,总结自己在编写小程序时候犯错点与心得,方便下次注意。 使用工具 Eclipse1.7、 Jdk1.7、 Mat...
  • yangzheng895
  • yangzheng895
  • 2017年03月14日 10:29
  • 494

[Java]File文件的新建、删除、修改、搜索的实例方法

这是前段时间用Java写的一个File文件的操作类,该类中的子方法有文件新建、删除、修改以及文件和文件夹的全级搜索和单级搜索,该类还在完善中,以供学习交流!!(未完!)import java.io.B...
  • huangmp
  • huangmp
  • 2011年11月11日 17:18
  • 5383

获取Spring容器中Bean实例的工具类(Java泛型方法实现)

在使用Spring做IoC容器的时候,有的类不方便直接注入bean,需要手动获得一个类型的bean。 因此,实现一个获得bean实例的工具类,就很有必要。 以前,写了一个根据bean的名称和类型获取b...
  • FansUnion
  • FansUnion
  • 2013年11月27日 16:48
  • 6703

Java 以指定日期时间格式获取当前时间、以及每隔一秒刷新一次的方法------附带实例

趁着重装myeclipse的这会儿功夫跟大家分享一个小方法,  hope can help you guys         一、  返回当前时间字符串, 咱们要用到的类有Calendar...
  • lucherr
  • lucherr
  • 2012年02月05日 11:08
  • 11846

java反射获取类实例并调用私有方法

public class TestReflect {//测试类 public void mPublic() {//访问权限最大 System.out.println("public run")...
  • a695422768
  • a695422768
  • 2017年06月16日 14:12
  • 486

获取Spring容器中Bean实例的工具类(Java泛型方法实现)

import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactor...
  • yanlianglu
  • yanlianglu
  • 2015年09月28日 15:27
  • 1478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Java获取子方法的新建实例引用的心得
举报原因:
原因补充:

(最多只允许输入30个字)