`
xfei6868
  • 浏览: 69813 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 的 return 是指针

阅读更多
    本题目不是很正确,但是我想说的是java的return 类引用是指针。下面一段代码
public class RetTest
{
    private TestEntity tsEt;
	private String tsStr;
	private int tsI;

    public RetTest()
    {
		tsI = 0;
		tsStr = "A";
        tsEt = new TestEntity();
    }
	
	public int GetI()
	{
		return tsI;
	}
	
	public int I1()
    {
		tsI = 1;
		return tsI;
	}	
	
	public int I2()
	{
		tsI = 2;
		return tsI;
	}
	
	public String GetStr()
	{
		return tsStr;
	}
	
	public String Str1()
	{
	    tsStr = "B";
		return tsStr;
	}
	
	public String Str2()
	{
		tsStr = "C";
		return tsStr;
	}
   
    public TestEntity GetEntity()
    {
        return tsEt;
    }

    public TestEntity Entity1()
    {
        //TestEntity tsEt1 = new TestEntity();
        tsEt.SetI(1);
        tsEt.SetIRef(new Integer(1));
        return tsEt;    
    }

    public TestEntity Entity2()
    {
        tsEt.SetI(2);
        tsEt.SetIRef(new Integer(2));
        return tsEt;
    }

   // public static void main(String[] args)
	public static void main(String[] args)
    {
        RetTest retTest = new RetTest();
		
		int Itest = retTest.GetI();
		System.out.println("I: " + Itest);
		
		int Itest1 = retTest.I1();
		System.out.println("I: " + Itest);
		System.out.println("I1: " + Itest1);
		
		int Itest2 = retTest.I2();
		System.out.println("I: " + Itest);
		System.out.println("I1: " + Itest1);
		System.out.println("I2: " + Itest2);
		
		//-----------------------------------------------------
		
		String str = retTest.GetStr();
		System.out.println("Str: " + str);
		
		String str1 = retTest.Str1();
		System.out.println("Str: " + str);
		System.out.println("Str1: " + str1);
		
		String str2 = retTest.Str2();
		System.out.println("Str: " + str);
		System.out.println("Str1: " + str1);
		System.out.println("Str2: " + str2);
		
		//-----------------------------------------------------

        TestEntity testEt = retTest.GetEntity();
        System.out.println("testEt -> Integer: " + testEt.GetIRef() + ", i:" + testEt.GetI());

        TestEntity testEt1 = retTest.Entity1();
        System.out.println("testEt -> Integer: " + testEt.GetIRef() + ", i:" + testEt.GetI());
        System.out.println("testEt1 -> Integer: " + testEt1.GetIRef() + ", i:" + testEt1.GetI());

        TestEntity testEt2 = retTest.Entity2();
        System.out.println("testEt -> Integer: " + testEt.GetIRef() + ", i:" + testEt.GetI());
        System.out.println("testEt1 -> Integer: " + testEt1.GetIRef() + ", i:" + testEt1.GetI());
        System.out.println("testEt2 -> Integer: " + testEt2.GetIRef() + ", i:" + testEt2.GetI()); 
		
		
		System.out.println("testEt = testEt1: " + (testEt == testEt1));
		System.out.println("testEt = testEt2: " + (testEt == testEt2));
		System.out.println("testEt1 = testEt2: " + (testEt1 == testEt2));
    }

}

class TestEntity
{
    private Integer iRef;
    private int i;

    public void SetI(int i)
    {
        this.i = i;
    }

    public int GetI()
    {
        return i;
    }

    public void SetIRef(Integer iRef)
    {
         this.iRef = iRef;
    }

    public Integer GetIRef()
    {
        return iRef;
    }
}



返回的结果为:
I: 0
I: 0
I1: 1
I: 0
I1: 1
I2: 2
Str: A
Str: A
Str1: B
Str: A
Str1: B
Str2: C
testEt -> Integer: null, i:0
testEt -> Integer: 1, i:1
testEt1 -> Integer: 1, i:1
testEt -> Integer: 2, i:2
testEt1 -> Integer: 2, i:2
testEt2 -> Integer: 2, i:2
testEt = testEt1: true
testEt = testEt2: true
testEt1 = testEt2: true


可以看出int 是值类型,返回的是值的copy
TestEntity 是一个类, 它返回的情况:
testEt -> Integer: null, i:0
testEt -> Integer: 1, i:1
testEt1 -> Integer: 1, i:1
testEt -> Integer: 2, i:2
testEt1 -> Integer: 2, i:2
testEt2 -> Integer: 2, i:2
testEt = testEt1: true
testEt = testEt2: true
testEt1 = testEt2: true

可以清楚的看出return的就是指针内容

    而String类型的怎么看上去像是基本类型的一样呢?String也是类啊!
    因为在String的对象池里,"A"、"B"、"C"三个字符串都是并没有存在的,这样每次String类型的对象每次=的时候相当于都要创建了一个String的对象。当然就如Str = new String("A); Str1 = new String("B"); Str2 = new String("C");这是三个不同的类当然在堆中的地址也是不同的。
    由于String对象池的特性,有时候也会产生这样的情况。如果修改一些代码
...
          public String Str1()
	{
	    tsStr = "A"; //把“B”改成“A”
	    return tsStr;
	}
...

添加
......
System.out.println("Str = Str1: " + (str == str1));
System.out.println("Str = Str2: " + (str == str2));
System.out.println("Str1 = Str2: " + (str1 == str2));
......

    关于String测试的部分就会是:
Str: A
Str: A
Str1: A
Str: A
Str1: A
Str2: C
Str = Str1: true
Str = Str2: false
Str1 = Str2: false

    这时候“Str = Str1: true”,要理解这个其实对java中的String很熟悉的话也是很好理解的。因为“A” 在对象池里已经存在了,这时候=的时候后面是“A”的话,对象的指针就会指向已经存在的“A”,而不在新建对象。
    return 针对对象是指针,知道的这点编写函数的时候,尤其类中全局变量,在被返回的时候有可能多个函数都返回,这样就要注意了,return的只不过是指针!
1
1
分享到:
评论

相关推荐

    return this---马克-to-win Java视频

    return this 马克-to-win Java视频this指针的详细介绍

    java-leetcode面试题解双指针之第344题反转字符串.zip

    return new String(chars); } } ``` 在这个解决方案中,`left`和`right`指针分别从头和尾开始,通过交换它们指向的字符,实现了字符串的反转。由于这个过程只需要遍历一次数组,所以时间复杂度是O(n),其中n是...

    java-leetcode面试题解双指针之第151题反转字符串中的单词.zip

    双指针是解决许多算法问题的一种高效策略,尤其在处理数组或字符串时。本资料包“java-leetcode面试题解双指针之第151题反转字符串中的单词.zip”主要探讨了LeetCode第151题,即如何使用双指针技巧来反转字符串中的...

    java-leetcode面试题解双指针之第9题回文数.zip

    本文将详细讲解如何用Java解决这个问题,以及双指针在解题中的应用。 首先,我们定义“回文数”为正向读和反向读都一样的数字,例如121、12321等。对于这个问题,我们的目标是检查一个整数是否为回文数。 传统的...

    java-leetcode面试题解双指针之第26题删除有序数组中的重复项.zip

    在Java编程领域,LeetCode是一个非常受欢迎的在线平台,它提供了大量的编程题目,帮助开发者提升算法和数据结构技能。...因此,对于Java开发者来说,深入理解和实践LeetCode上的双指针题目是提升自身技能的有效途径。

    java-leetcode面试题解双指针之第125题验证回文串.zip

    双指针是一种常见的算法思想,它在解决很多数组或字符串问题时能展现出高效性。 **问题描述:** 题目要求判断一个给定的字符串(可能包含字母、数字和空格)是否为回文串。回文串是指正读反读都能读通的字符串,...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    ### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...

    Java 文件移动代码

    return true; } } } ``` 在这个示例中,我们首先检查源文件是否存在且是一个普通文件。然后尝试使用`renameTo()`方法移动文件,这个方法在同一个文件系统内通常能直接完成移动操作。如果`renameTo()`失败,我们...

    指针函数、函数指针的区别ConsoleApplication1.zip

    在C/C++编程中,指针函数和函数指针是两个看似相似但实质不同的概念,尤其是在Android NDK(Native Development Kit)开发中显得尤为重要。NDK允许开发者使用原生的C/C++代码来编写Android应用的一部分,从而提高...

    Android中C/C++调用Java代码

    JNIEnv是JNI环境的指针,提供了许多有用的函数,用于在native代码和Java代码之间交互。jclass是Java类的句柄,用于表示一个Java类。 下面是一个简单的例子,演示如何在C++中实例化一个Java类: ```c jobject ...

    JAVA调用C++编写的DLL(C++和JAVA源码)

    这里,`JNIEXPORT`和`JNIEXPORT`是JNI的宏,`JNIEnv *env`是与JVM交互的环境指针,`jobject obj`是Java对象的指针。 3. **Java调用DLL**:在Java端,首先需要声明native方法,使用`native`关键字。然后使用`javah`...

    java 赋值运算符、拷贝初始化和this指针_.docx

    ### Java中的赋值运算符、拷贝初始化及this指针详解 #### 一、赋值运算符与拷贝初始化 1. **赋值与初始化的区别**: - **初始化**通常发生在对象创建时,比如使用构造函数设定初始状态。 - **赋值**则是在对象...

    java 检查是否是回文

    在Java中,检查一个字符串是否为回文是一个常见的字符串处理问题,可以通过多种方法实现。下面我们将详细讨论如何在Java中检查字符串是否为回文。 首先,我们可以使用基本的字符串操作来实现。这种方法的思路是将原...

    ( Go for Java programmers(面向java开发者的go编程) 中文

    ### 面向Java开发者的Go编程:详细解析 #### 一、引言 随着Go语言的日益流行,越来越多的Java开发者开始转向学习这门语言。Go语言以其简洁高效的特性吸引了大量的关注,尤其是在高并发场景下的表现更是令人瞩目。...

    Java函数式开发 Optional空指针处理

    在Java编程中,`Optional` 类自 Java 8 引入,旨在解决长期以来困扰开发者们的空指针异常(`NullPointerException`)问题。`Optional` 是一个容器类,代表一个值存在或不存在。它提供了一种更安全的方式来处理可能为...

    复制带随机指针的链表(java代码).docx

    ### 复制带随机指针的链表 #### 问题背景 在计算机科学中,链表是一种常见的数据结构,用于存储一系列元素。每个元素(通常称为节点)包含一个指向链表中下一个节点的指针。然而,在某些情况下,链表中的每个节点...

    环形链表(java代码).docx

    快慢指针法的基本思想是使用两个指针,一个快指针和一个慢指针,快指针每次移动两步,慢指针每次移动一步。从链表的头节点开始,快指针和慢指针同时出发,如果链表中存在环,快指针最终会追上慢指针。 快慢指针法的...

    剑指offer计划13(双指针简单)---java(csdn)————程序.pdf

    在编程领域,双指针是一种常见的算法技巧,用于解决各种问题。本文主要分析了三个使用双指针技术解决的题目,分别来自剑指Offer计划13的Java实现,包括调整数组顺序使奇数位于偶数前面、寻找和为s的两个数字以及翻转...

    数组指针,函数指针应用

    在C/C++编程语言中,数组和指针是两个核心概念,它们的结合以及与函数指针的交互能实现强大的功能。本主题将深入探讨数组指针和函数指针的应用,通过提供的源代码实例,我们可以更好地理解这两种概念的实用性和灵活...

Global site tag (gtag.js) - Google Analytics