java----day_12(面向对象)

目录

构造方法

this

super


构造方法

  • 概念

      什么是构造方法呢?从字面上理解即为构建创造时用的方法,即就是对象创建时要执行的方法。既然是对象创建时要执行的方法,那么只要在new对象时,知道其执行的构造方法是什么,就可以在执行这个方法的时候给对象进行属性赋值。格式如下:

Person(String name,int age)//方法名和类名要一直,初始化person的信息
{
    this.name = name;
    this.age = age;
}
  • 构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束。
  • 构造方法名称必须和类型保持一致。
  • 构造方法没有具体的返回值。
  • 构造方法调用和内存图解

  • 图解说明:
  1. 首先会将main方法压入栈中,执行main方法中的 new Person(23,"张三");
  2. 在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x88)。然后给成员变量进行默认初始化(name=nullage=0)。
  3. 执行构造方法中的代码(age = a ; name = nm;,将变量a对应的23赋值给age,将变量nm对应的张三赋值给name,这段代码执行结束后,成员变量agename的值已经改变。执行结束之后构造方法弹栈,Person对象创建完成。将Person对象的内存地址0x88赋值给p2
  • 默认构造方法和细节

      没定义构造方法时,系统会自动给出一个空的构造方法,当描述的事物在创建其对象时就要明确属性的值,这时就需要在定义类的时候书写带参数的构造方法。若创建对象时不需要明确具体的数据,这时可以不用书写构造方法

  • 造方法的细节:
  1. 一个类中可以有多个构造方法,多个构造方法是以重载的形式存在的
  2. 构造方法是可以被private修饰的,作用:其他程序无法创建该类的对象。
  • 构造方法和一般方法的区别
  1. 构造方法在对象创建时就执行了,而且只执行一次。
  2. 一般方法是在对象创建后,需要使用时才被对象调用,并可以被多次调用。

有了构造方法初始化对象之后,还是需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时,在这时只能通过set或者get方法来操作。

this

  • this 调用构造方法

构造方法无法通过构造方法名来相互调用,构造方法之间的调用,可以通过this关键字来完成。

public class Person {
	private String name;
	private int age;
	
	Person(String name){
		this.name = name;
	}
	
	Person(String name,int age){
		this(name);
		this.age = age;
	}
}
  •  this的原理图解

  • 图列说明:
  1. 先执行main方法,main方法压栈,执行其中的new Person(“张三”,23);
  2. 堆内存中开辟空间,并为其分配内存地址0x33,,紧接着成员变量默认初始化(name=null  age = 0);
  3. 拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造方法中有一个隐式的this,因为构造方法是给对象初始化的,那个对象调用到这个构造方法,this就指向堆中的那个对象。
  4. 由于Person(String nm , int a)构造方法中使用了this(nm);构造方法Person(String nm)就会压栈,并将“张三”传递给nm。在Person(String nm , int a)构造方法中同样也有隐式的this,this的值同样也为0x33,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm , int a)构造方法弹栈。
  5. 程序继续执行构造方法(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造方法(Person(String nm , int a)弹栈。
  6. 当构造方法(Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将0x33赋值给main方法中的p引用变量。
  • 注意:
  • this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。

调用其他构造方法的语句必须定义在构造方法的第一行,原因是初始化动作要最先执行。

  • 成员变量和局部变量同名问题

当在方法中出现了局部变量和成员变量同名的时候,可以在成员变量名前面加上this.来区别成员变量和局部变量

super

      在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句。子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法

  • 子类对象创建过程的细节​​​​​​​
  • 如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?

这时是没有的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行。

  • 父类构造方法中是否有隐式的super呢?

也是有的。记住:只要是构造方法默认第一行都是super();

  • 父类的父类是谁呢?super调用的到底是谁的构造方法呢?

Java体系在设计,定义了一个所有对象的父类Object

  • 注意:

        类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法。

猜你喜欢

转载自blog.csdn.net/qq_38362772/article/details/82185350