关于Java开发的几个基础性的小问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41076931/article/details/102707712

1、toString()方法返回反映这个对象的字符串

        返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。该toString类方法Object返回一个由其中的对象是一个实例,该符号字符`的类的名称的字符串@ ”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串: getClass().getName() + '@' + Integer.toHexString(hashCode()) 。结果:对象的字符串表示形式。

        因为toString方法是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”。 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法。总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法。

2、理解一下引用以及它们的内存分布:对象存放在堆空间,引用存放在栈空间。

从右往左看,首先创建一个Student数组对象,比如为它分配的地址是0x88,存放在堆空间中;然后创建这个对象引用0x001,为它分配的地址是0,存放在栈空间中;这个0x001就是对象的引用。

总结:引用是变量,变量的值是所指向对象的起始地址;地址的值是无符号整形;引用本身也有地址;

引用传递举例:

A:在使用基本数据类型进行引用传递时,由于可以修改,并且引用指向尚未更改,所以最后值可以修改。

 
public class Demo1{
    //主类
    public static void main(String []args){
        Test test1 = new Test();//test.temp=10
        test1.temp = 20 ;
        System.out.println(test1.temp);//test.temp=20
        tell(test1);
		System.out.println(test1.temp);//test.temp=30
    }  
    //静态方法tell()
    public static void tell(Test test2){
        test2.temp = 30 ;
    } 
}
class Test{
    int temp = 10 ;
}


输出:
        20
        30

B:String引用传值,由于String不可修改,重新赋值会在堆内存重新分配一块内存,而原来的指向如果不被使用则会被java垃圾处理不定期回收。

public class Demo2{
    //主类
    public static void main(String []args){
        String s1 = "aaa";
        System.out.println(s1);//aaa
        tell(s1);
		System.out.println(s1);//aaa
    }  
    //静态方法tell()
    public static void tell(String s2){
        s2 = "bbb" ;
    } 
}

输出:
        aaa
        aaa

内存分析图:这里tell方法方法执行完毕,而且指向S1指向还是aaa,所以实际没有被改变,而s2在方法执行过后会被java垃圾回收机制不定期回收。 

C:这和上边的区别就是我们的 new Test()  是的一个Test的一个实例,str1指向了它,在tell里面形参str2也指向了它。temp是new Test() 里面的一个属性,也是一个引用放在栈空间,通过temp去操作AAA以及BBB,所以在调用tell方法的时候,str2.temp调用new Test() 的temp属性,它在堆空间新分配了一块空间存放BBB,temp指向了BBB,原来的AAA这块内存因为没有使用而被垃圾回收机制回收。

public class Demo3{
    //主类
    public static void main(String []args){
        Test str1 = new Test();
        System.out.println(str1.temp);//AAA
        tell(str1);
	System.out.println(str1.temp);//aaa
    }  
    //静态方法tell()
    public static void tell(Test str2){
        str2.temp = "BBB" ;
    } 
}
class Test{
	String temp = new String("AAA");	
}

输出:
        AAA    
        BBB

猜你喜欢

转载自blog.csdn.net/qq_41076931/article/details/102707712
今日推荐