构造方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造方法相关的知识,希望对你有一定的参考价值。


构造方法

其实在写好一个自定义的类时,这个类本身就有一个默认的空参数构造方法,只是不用自己去写出来,但是在有些时候,需要对它的成员变量在创建对象的时候就进行初始化值,这时就需要重写构造方法,也就是构造器。

构造方法的作用就是对成员变量进行默认初始化值。

构造方法的定义格式

修饰符 方法名(参数列表){

}

修饰符:也就是它的权限问题

方法名:定义必须和类名完全一致

参数列表:如果需要对成员变量在创建对象的时候就进行赋值,就写参数,如果不需要,不需要写参数列表。

构造方法在创建对象的时候就运行了,具体代码演示如下:

l  Person

package cn.itcast.ConstructorMethod;
/*
 * 构造方法的创建
 */
public class Person {
   //定义姓名,年龄,将其私有化
   private String name;
   private int age;
   
   //构造方法,实验这个构造方法是在什么时候被运行的
   public Person(){
      System.out.println("我是一个空参数的构造方法");
   }
   //get方法set方法
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   
}


l  测试类

package cn.itcast.ConstructorMethod;
/*
 * 测试构造方法是在什么时候被运行的
 */
public class Test {
   public static void main(String[] args) {
      //创建Person类对象
      Person p = new Person();
   }
}


运行结果:技术分享图片技术分享图片

在创建对象的时候就对成员变量进行初始化值,具体的代码演示如下:

l  PersonName

package cn.itcast.ConstructorMethod;
/*
 * 创建构造方法
 */
public class PersonName {
   //定义姓名
   private String name;
   //重写构造方法,对其传入有参的参数,也就是姓名
   public PersonName(String name){
      this.name = name;
   }
   //get方法set方法
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   
}


l  测试类

package cn.itcast.ConstructorMethod;
/*
 * 测试构造方法是否在创建对象时初始化姓名值
 */
public class TestName {
   public static void main(String[] args) {
      //创建PersonName类的对象,对构造方法初始化值,其实就是在调用这个构造方法
      PersonName pm = new PersonName("王杰");
      //查看一下是否在创建对象时对姓名进行初始化值
      System.out.println(pm.getName());
   }
}


构造方法的重载

类中的构造方法可以有重载,只要其参数列表不同即可,下面用一段代码来演示构造方法的重载:

l  Person

package cn.itcast.ConstructorMethodOverLoad;
/*
 * 构造方法的重载
 */
public class Person {
   //定义姓名,年龄
   private String name;
   private int age;
   //构造方法的重载,空参构造方法
   public Person(){
      
   }
   //构造方法的重载,有参构造方法
   public Person(String name,int age){
      this.name = name;
      this.age = age; 
   }
   //get方法set方法
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   
}


l  测试类

package cn.itcast.ConstructorMethodOverLoad;
/*
 * 测试构造方法的重载
 */
public class Test {
   public static void main(String[] args) {
      //创建Person类对象,调用空参构造方法
      Person p = new Person();
      p.setName("张三");
      p.setAge(18);
      System.out.println(p.getName());
      System.out.println(p.getAge());
      //创建对象,调用有参的构造方法
      Person p2 = new Person("李四", 19);
      System.out.println(p2.getName());
      System.out.println(p2.getAge());
   }
}


运行结果:技术分享图片

构造方法和一般方法的区别:

构造方法在创建对象的时候就被调用了,并且只能执行一次,而一般方法在创建对象后,需要被使用才会被对象所进行调用,一般方法可以被调用多次。

构造方法中this的作用

构造方法中this的作用就是将两个构造方法进行连接,在一个空参构造方法中通过this的方式对成员进行赋值,可以和有参的构造方法进行联系,调用有参的构造方法,传递实际参数,具体的使用细节如下:

注意,this的使用必须写在构造方法中的第一行。

l  Person

package cn.itcast.This;
/*
 * 构造方法中this 的用法
 */
public class Person {
   //定义姓名,年龄
   private String name;
   private int age;
   //空参构造方法
   public Person(){
      this("张三",20);
   }
   //有参构造方法
   public Person(String name,int age){
      this.name = name;
      this.age = age;
   }
   //get方法和set方法
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   
}


l  测试类

package cn.itcast.This;
/*
 * 测试类,测试构造方法中this的用法
 */
public class Test {
   public static void main(String[] args) {
      //创建对象,调用空参构造方法
      Person p = new Person();
      System.out.println(p.getName());
      System.out.println(p.getAge());
   }
}


构造方法中super关键字的用法

在子类中,可以使用super去调用父类的构造方法

super()调用的是父类空参数的构造方法

super(参数)调用的是父类中有参数的构造方法

注意:super必须写在构造方法中的第一行,superthis,两者有一个就可以了,如果子类继承父类,子类都必须直接或间接访问父类的构造方法。代码演示如下:

l  人类

package cn.itcast.ConstructorMethodSuper;
/*
 * 父类构造方法
 */
public class Person {
   public Person(int a){
      
   }
}


l  学生类

package cn.itcast.ConstructorMethodSuper;
/*
 * 子类继承父类
 * 子类构造方法直接或间接访问父类构造方法
 */
public class Student extends Person{
   public Student(){
      this(5);//调用本类构造方法,参数为int的构造方法
   }
   public Student(int a){
      super(4);//调用父类的构造方法
   }
}


super的实例演示

l  Person

package cn.itcast.ConstructorMethodSuper实例;
/*
 * 需求:有学生和工人两个类,有其共有的属性name和age,要求在创建这两个对象时就对name和age赋值
 * Person父类,学生和工人抽取的共有内容
 * 成员变量私有,重写构造方法,接收传递变量的值
 * get,set方法用于获取私有变量的值
 */
public class Person {
   //私有变量name,age
   private String name;
   private int age;
   //重写构造方法
   public Person(String name,int age){
      this.name = name;
      this.age = age;
   }
   //get,set方法
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   
}


l  Student

package cn.itcast.ConstructorMethodSuper实例;
/*
 * 学生类,继承Person类,重写构造方法,将创建学生对象后赋的值传递给父类的构造方法
 */
public class Student extends Person{
   //重写构造方法,创建Student对象时直接赋值name,age
   public Student(String name,int age){
      //将值传递给父类的构造方法
      super(name,age);
   }
}


l  Worker

package cn.itcast.ConstructorMethodSuper实例;
/*
 * 工人类,继承Person类,重写构造方法,将值传递给父类的构造方法中
 */
public class Worker extends Person{
   //重写构造方法,创建Worker对象时直接赋值name,age
   public Worker(String name,int age){
      //将值传递给父类构造方法
      super(name, age);
   }
}


l  Test测试类

package cn.itcast.ConstructorMethodSuper实例;
/*
 * 测试类
 * 创建学生,工人对象时就对name,age赋值,获取name,age的值
 */
public class Test {
   public static void main(String[] args) {
      //创建Student对象并赋值
      Student s = new Student("张三",30);
      //获取name,age的值
      System.out.println(s.getName());
      System.out.println(s.getAge());
      //创建Worker对象并赋值
      Worker w = new Worker("李四",20);
      System.out.println(w.getName());
      System.out.println(w.getAge());
   }
}

运行结果:技术分享图片

 

 


以上是关于构造方法的主要内容,如果未能解决你的问题,请参考以下文章

无法解析片段中的 ViewModelProvider 构造?

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

将初始数据提供给片段的正确方法?

将初始数据提供给片段的正确方法?

防止 Proguard 删除片段的空构造函数