为什么使用this构造器

当一个类有多个构造函数的时候,常使用this构造器:

public class SomeClass
{
    public SomeClass()
    {
        //TODO:初始化一些字段
    }

    public SomeClass(string temp) : this()
    {
        //TODO:初始化另外一些字段
    }
}

在这里,为什么要使用this构造器呢?这事还要从字段的初始化说起。

假设有这样的一个类,在声明字段的时候对字段进行了初始化。在客户端,通过该类的2个构造函数创建对象实例。

   class Program
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
            SomeClass sc1 = new SomeClass("jack");
        }
    }

    public class SomeClass
    {
        private int _age = 20;
        private string _name = "darren";

        public SomeClass()
        {
        }

        public SomeClass(string name)
        {
            _name = name;
        }
    }


反编译成IL代码为:

可见,每次调用类的构造函数都会对_age和_name字段进行初始化。是否可以把这重复的部分放到一个公共的地方呢?答案是可以的,可以把字段的初始化工作交给一个无参构造函数。修改如下:

   public class SomeClass
    {
        private int _age;
        private string _name;

        public SomeClass()
        {
            _age = 20;
            _name = "darren";
        }

        public SomeClass(string name) : this()
        {
            _name = name;
        }
    }



以上,在SomeClass的有参构造函数中,没有对_age和_name字段再次进行初始化,而是调用了SomeClass的无参构造函数,可见,使用this构造器避免了重复初始化字段。

时间: 2024-10-12 16:07:20

为什么使用this构造器的相关文章

从头认识java-18.2 基本的线程机制(6)-使用构造器或者内部类来实现多线程的编码变体

这一章节我们来讨论一下使用构造器或者内部类来实现多线程的编码变体. 1.基础实现 package com.ray.ch17; public class Test { public static void main(String[] args) { Thread thread1 = new ExtendsThread(); thread1.start(); Thread thread2 = new Thread(new ImplRunnable()); thread2.start(); } } c

构造器和析构器

一 构造器 swift的init方法是没有返回值的,而OC的init方法就有返回值,返回类本身 1.默认构造器 即使我们不写init方法,系统也会为函数默认写一个空的init方法 struct Fahrenheit {          var temperature:Double          init(){         temperature = 32.0     } } var f = Fahrenheit() 2.自定义构造器 struct Celsius {          

使用构造器装配属性

beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springfr

java8之lambda表达式(构造器引用)

构造器引用同方法引用类似,不同的是在构造器引用中方法名是new.例如,Button::new表示Button类的构造器引用.对于拥有多个构造器的类,选择使用哪个构造器取决于上下文.假设你有一个字符串列表,并且希望调用Button类的构造器使用列表中的字符串来构造一个按钮列表,可以使用如下表达式: List<String> labels = ....; Stream<Button> stream = labels.stream().map(Button::new); List<

疯狂java学习笔记之面向对象-定义类、方法、构造器

Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. java程序中,类是最小的程序单位 - 所有的java程序都必须从定义类开始 定义类的语法格式: [修饰符]  class  类名{ //0 ~ N 个 Field 定义 //0 ~ N 个 方法定义 //0 ~ N个 构造器定义 } 一个类中最多只能出现五种成分:Field.方法.构造器 一个类最常见

effective java读书札记值第2条:遇到多个构造器参数时要考虑用构造器

对于一个参数有多个的构造器的类,程序员一向习惯采用重叠的构造器模式. public class Person { private String Id; private String name; private String address; public Person(String id) { Id = id; } public Person(String name, String address) { super(); this.name = name; this.address = addr

Java的构造器

初始化和清理是涉及安全的两个问题.C++和Java都引入了构造器(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法. 可以假想为编写的每个类都定义一个initialize()方法.在每次使用对象的时候,都会用这个方法.在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化. 在Java中,构造器与类的名称是相同的.如果没有定义构造器,那么Java就会自动调用默认的构造器. 我们先来看看一个带有构造器的简单类: class Yes(){ Yes(){ Syst

-Java基础-构造器

1.构造器 构造器就是类创建对象的初始化方法.它的名字与类名相同. 假设没有写有构造器的情况下,虚拟机会自动加上一个没有参数的构造器,如果[学Java,到凯哥学堂kaige123.com]写有构造器,那么虚拟机就不会在加上构造器了. public class Test1 { public Test1() { System.out.println("我是构造器!"); } } 2.构造器重载 构造器就是一个方法,所以它和普通的方法一样也可以做方法重载,换句话说就是构造器的重载. 和方法重

Java——构造器

Java 构造器的由来:构造器是一个创建对象时被自动调用的特殊方法,为的是初始化. 当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null.构造器可以改变这种默认的初始化.构造器不是函数. 要求:构造器的名称应与类的名称一致.调用构造器是编译器的责任,所以必须让编译器知道调用的是哪一个方法.所以Java采取了与类同名的方法命名构造器. public class Person { public String nam

CLR类型设计之方法与构造器

C#语言中最常用到的就是方法的语法,如果在控制台应用程序中,一定要有一个Main()方法作为程序入口,本文讨论的不是方法实现也不是为什么要写方法,而是来讨论下如何构造器和扩展方法. 无论学习那门语言都要学习函数体,C#,JAVA,PHP,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器. 方法就是某个类相关的函数,也可以返回简单的基元类型或者什么也不反回,方法可以定义其公开性,如果使用static修饰