JAVA中构造函数以及this的使用(内存的图解)

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

构造函数就是在我们定义一个类似时就已经默认存在的.
例如:

class Perso{
	 private String name;    //私有属性 名字
     private int age;        //私有属性 年龄
      //功能
    public void speak()
    {
        System.out.println(name+":"+age);
    }
}

然后我们new一个对象的时候

Perso p1 = new Perso();

然后Java虚拟机发现我们没有用构造函数,它就帮我们加进去了.
也就可以说默认初始化对象

class Perso{
	 private String name;    //私有属性 名字
     private int age;        //私有属性 年龄
      //功能
     Perso(){}
    public void speak()
    {
        System.out.println(name+":"+age);
    }
}

但是我们也可以自己自定义构造函数
例如:

class Perso{
	 private String name;    //私有属性 名字
     private int age;        //私有属性 年龄
      //功能
     Perso()	//构造函数
     {
     	System.out.printf("hello");
     }
    public void speak()
    {
        System.out.println(name+":"+age);
    }
}

然后我们自己构造了函数,那么虚拟机就不自动帮我们添加了.
这里我们如果new一个对象的时候,就会先输出hello这句话.

如果我们这样的话

class Perso{
	 private String name;    //私有属性 名字
     private int age;        //私有属性 年龄
      //功能
     Perso(System n)	//构造函数
     {
     	name = n;
     }
    public void speak()
    {
        System.out.println(name+":"+age);
    }
}

然后我们new一个对象的时候,就必须加入参数Perso p1 = new Perso("小明");
这也就相当于我们默认初始化对象了,如果输出的话,就会输出小明:0
前面没有构造函数,设置参数时,属性都会自动初始化

内存图解

class Perso{
	 private String name;    //私有属性 名字
     private int age;        //私有属性 年龄
      //功能
     Perso()	//构造函数
     {
     	System.out.printf("hello");
     }
    public void speak()
    {
        System.out.println(name+":"+age);
    }
}
//这里的类就不写了
public static void main(String[] args){
        Perso p = new Perso();

在这里插入图片描述在这里插入图片描述在这里插入图片描述
如果是这样的话,内存是这样的

class Perso{
	 private String name;    //私有属性 名字
     private int age;        //私有属性 年龄
      //功能
     Perso(String n)	//构造函数
     {
     	name = n;
     }
    public void speak()
    {
        System.out.println(name+":"+age);
    }
}
//这里的类就不写了
public static void main(String[] args){
        Perso p = new Perso("小明");

前面都是一样的
在这里插入图片描述
在这里插入图片描述
至于这个"小明"是如何赋值给堆内存的,这就涉及到this这个关键字了.

我们为了方便看懂代码我们一般都定义有意义的名字
然后,就导致了名字,与名字的冲突,这样我们这个this就派上用场了

Perso(String name)	//构造函数
     {
     	name = name;	//这样导致name是为null的
     }

然后这样就不会了

Perso(String name)	//构造函数
     {
     	this.name = name;	//这样导致name是为null的
     }

其实在构造函数中,有默认this的,一创建this就会指向那个对象的地址
例如上面我们说的,小明赋值给name,
其实就有this的原因
在这里插入图片描述
在这里插入图片描述
一个类当中,它的所以成员,想要被执行,就必须有对象调用,不过一般都省略了this

thi还可以用在构造函数,调用构造函数
例如:

Perso(String name){        //构造重载函数,字符串参数.
        this.name = name;
    }

    Perso(String n, int age){        //构造重载函数,字符串与整型参数.
        this(name);
        this.age = age;
    }

在这里插入图片描述
然后弹栈
在这里插入图片描述
然后也弹栈
在这里插入图片描述

 Perso(String n, int age){        //构造重载函数,字符串与整型参数.
        this.age = age;
         this(name);
    }

不能这样子!!!会报错
构造函数中用this调用其它构造函数必须放在第一行!!!
因为初始化动作要先执行

当成员变量和局部变量重名,可以用关键字this来区分.

this:代表对象.代表那个对象呢?当前对象
this就是所在函数所属对象的引用.
简单说:哪个对象调用lthis所在的函数,this就代表那个对象.

猜你喜欢

转载自blog.csdn.net/weixin_42947972/article/details/101478230