构造方法

一.构造方法

 1.与以前的不同 

我们在没学构造方法之前,若要给我们的一个对象的属性赋值之类的,只能在实例化对象之后才能通过方法等途径去进行复制,但这种形式可以说是一种间接的对于对象属性的描述。     通过构造方法我们可以在创建之初就直接给我们的对象属性赋值。

2.作用

在建立之初便给对象赋值,更相当于一种出厂设置,当然我们是可以修改的

3.一些基础知识

每一个类,不管你是抽象类,还是普通类,final类型的类都是必须拥有自己的构造方法的,这是必须的,若是我们不手动写,则系统会自动给我们添加构造方法,不过只是一个空参数的构造方法

格式 :  权限   方法名(参数列表){              

注意方法名一定要与类名一模一样

}

二.构造方法的重载

构造方法在某些地方是与普通方法很像的,比如说可以重载

这种重载是通过参数列表的不同来进行的

三.this关键字(必须写在构造方法第一行)

在构造方法中最为重要的便是两个关键字的使用与理解

1.在前面的总结中我们已经说到this关键字是可以存储本类中的地址,然后通过指针进行一些同名数据的赋值等操作

public Person(String name,int age) {
	  this.name=name;
	  this.age=age;
  }

  从我们上面的代码可看出,这种特性仍然没有丢失。

2.this()

这是直接通过this引用在本类中的另一个构造方法,因为我们的方法名与类名相同,所以这便涉及到了方法的重载

至于为什么要在一个类中引用自己的构造方法呐?

当我们存在多个构造方法时可能会出现功能相同的构造方法,如果我们要测试的话,就要在测试类中实例化两个对象,很麻烦,并且这些功能相同的方法在某种程度上更像是一种程序的赘余,很不好。

具体使用细节如下:

package cn.itcast.demo4;

public class Person {
    private String name;        
    private int num;
     //出于安全性考虑此处为私有定义
    
    public Person() {
           this("刘宇剑",2);  //this存的是有参构造方法2地址
           //指向有参构造方法2,相当于是调用了2
            System.out.println("我是一个空参构造方法");
    }   
    
    public Person(String name,int num) {
        this.name=name;
        this.num=num;
    }    //这是构造方法2
    
    public String getName() {           //以下均为对私有类型的处理    
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    
}

package cn.itcast.demo4;
/*
 * 测试类
 */
public class Test {

    public static void main(String[] args) {
        
    Person pe=new Person();   //此处我们仅仅使用一个空参便可以
    
    System.out.println(pe.getName()+pe.getNum());
    }

}

四.super关键字(必须写在构造方法第一行)

关于super关键字我们至少知道的是该关键字指向父类中的属性

1.父与子

其实无论在何种情况下,父类与子类之间最重要的便是继承,在我看来super的存在是为了完成对父类中构造方法的继承(这个就是个人理解了。。。)。    我们要首先清楚在子类继承中的一些知识:

类和类之间存在继承关系后,系统所自动添加的构造方法会有一个隐式代码super(),这个代码中的super存储了父类构造方法的地址,可以指向父类构造方法,进而继承父类构造方法中的属性

2.无论如何子类都要间接或者直接调用父类的构造方法

直接super()

间接:以this()作为中间桥梁代码如下:

package cn.itcast.demo6;

public abstract class Person {
  private String name;
  private int age;
  
  public Person(String name,int age) {
      this.name=name;
      this.age=age;
  }  //我下面把get,set方法删了,有点多。。
}


package cn.itcast.demo6;

public  class Worker extends Person{
      
     public Worker(String name,int age)          //这里为了继承所以要参数一样
     {         
         super(name,age);                  //继承父类方法中的内容
     }
     public Worker() {
         this("1234",33);    //通过参数指向第一个构造方法
     }
}

五.构造方法内存过程

1.一般构造方法的内存过程

 class文件先进入方法区,然后main方法进入栈内存中,当我们开始实例化对象时,第一个对象便进入了堆内存完成初始化(系统自动初始化)同时构造方法进入了栈内存中运行,完成其功能后死亡

2.继承中的构造方法内存过程

父类class文件先进入方法区,然后子类class再进去,然后main方法进入栈内存中,当我们开始实例化对象时,第一个对象便进入了堆内存完成初始化(系统自动初始化),此时堆内存中有两个内存区域,一个是父类的,另一个是子类的,实例化对象便存在于子类的存储区域,同时子类与父类的构造方进入了栈内存中运行,此时先运行子类的构造方法,通过super找到父类的构造方法。

六.总结

这块卡住我的就是super,this的指向问题,其实总体并没有太多信息量,所以只要相同指向问题这个知识点基本就算过了。

原文地址:https://www.cnblogs.com/roseneverdie/p/10114511.html