`

非静态构造函数笔记

    博客分类:
  • C#
阅读更多
(1)不带参数的构造函数称为“默认构造函数”。无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。
/***********************************************************************
 * 调用默认的构造函数 
************************************************************************/
using System;
class A
{
    public A() { }//可省略,系统会自动添加
}
class C
{
    static void Main(string[] args)
    {
    //此时,系统自动调用A(),初始化A的变量 
        A a = new A();
    }
}



(2)派生类可以显示调用基类的构造函数。用户不能显示调用构造函数
/***********************************************************************
 * 派生类可以显示调用基类的构造函数。用户不能显示调用构造函数 
************************************************************************/
using System;
class A
{
    public A() { }
}
class B:A 
{
    public B():base (){}//显示调用基类的构造函数
}
class C
{
    static void Main(string[] args)
    {
        A a = new A();
        //错误,用户不能显示调用构造函数。构造函数是由系统根据实例化时的参数自动调用的。 
        a.A();
    }
}


(3)先执行基类的构造函数,再执行派生类的构造函数。
/*********************************************************************** 
 * 实例化时先执行基类A的构造函数,再行B类的构造函数
************************************************************************/
using System;
class A
{
    public A() { Console.WriteLine("这是A的构造函数"); }  
}
class B:A 
{
    public B() { Console.WriteLine("这是B的构造函数");  }
}
class C
{
    static void Main(string[] args)
    {        
       B b = new B ();        
    }
}

(4)在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。
/***********************************************************************
 * 在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数。 
************************************************************************/
using System;
class A
{
    public A() { Console.WriteLine("这是A的构造函数"); }
    public A(int i) { Console.WriteLine("这是A的有参构造函数"); }
}
class B:A 
{
    public B() { Console.WriteLine("这是B的构造函数");  }
}
class C
{
    static void Main(string[] args)
    {
        //派生类B中,没有指定基类A的构造函数。此时先调用A的默认构造函数,再调用B的构造函数
       B b = new B ();        
    }
}


(5)如果在基类中有自己写的构造函数,系统就不会调用基类默认的构造函数,若在派生类中没有显式的指定基类的构造函数,此时就会出错,需要在基类中,添加基类默认的构造函数。

/***********************************************************************
 * 基类A中有自己写的有参构造函数(系统不再提供默认的构造函数),
 * 派生类B中没有指定A的构造函数,此时系统会寻找基类A的默认构造函数,因此会
 * 出错。(提示:A中不包含0个参数的构造函数)
 * 
************************************************************************/
using System;
class A
{    
    public A(int i) { Console.WriteLine("这是A的有参构造函数"); }
}
class B:A 
{
    public B() { Console.WriteLine("这是B的构造函数");  }
}
class C
{
    static void Main(string[] args)
    {
        //出错,A中不包含0个参数的构造函数
       B b = new B ();        
    }
}



/*********************************************************************** 
 * 派生类B中指定了基类A的构造函数,不会出错
************************************************************************/
using System;
class A
{    
    public A(int i) { Console.WriteLine("这是A的有参构造函数"); }
}
class B:A 
{
    public B() :base(1) { Console.WriteLine("这是B的构造函数");  }
}
class C
{
    static void Main(string[] args)
    {
        //派生类B中指定了基类A的构造函数,不会出错
       B b = new B ();        
    }
}



/*********************************************************************** 
 * 派生类中不指定基类的构造函数而为基类添加默认的构造函数,不会出错
************************************************************************/
using System;
class A
{
    public A() { Console.WriteLine("这是A的构造函数"); }
    public A(int i) { Console.WriteLine("这是A的有参构造函数"); }
}
class B:A 
{
    public B() { Console.WriteLine("这是B的构造函数");  }
}
class C
{
    static void Main(string[] args)
    {
        //派生类B中指定了基类A的构造函数,但为基类添加默认的构造函数,不会出错
       B b = new B ();        
    }
}


可以得到的结论是   先调用父类的构造函数进行初始化,再调用继承类的构造函数,如果没有在继承类中指明父类的构造函数,则默认调用父类中没有参数的构造函数,然后调用继承类的构造函数

(6)构造函数可以使用 this 关键字调用同一对象中的另一构造函数
/*********************************************************************** 
 * 使用this可以调用同一类中另一个构造函数
************************************************************************/
using System;
class A
{
    public A():this("abc") { Console.WriteLine("这是A无参数的构造函数"); }
    public A(string s) { Console.WriteLine("这是A有一个参数的构造函数"); }  
}
class B:A 
{
    public B() { Console.WriteLine("这是B的构造函数");  }
}
class C
{
    static void Main(string[] args)
    {
        //先执行A中有一个参数的构造函数,再执行A中无参数的构造函数,最后执行B的构造函数
       B b = new B ();        
    }
}









分享到:
评论

相关推荐

    C#学习笔记整理_深入剖析构造函数、析构函数

    4. **静态构造函数**:静态构造函数在类的首次使用之前由.NET运行库自动调用,且仅执行一次。它不接受参数,没有访问修饰符,只能访问类的静态成员。静态构造函数用于初始化静态字段和属性,尤其是当这些字段需要从...

    C++基础C++相关笔记总结

    这意味着在`const`成员函数中不能修改任何非静态数据成员,也不能调用其他非`const`成员函数。使用`const`成员函数可以增加代码的安全性和可读性。 ### 构造函数与析构函数 构造函数是类的一个特殊成员函数,用于...

    java线程笔记

    - 静态变量存储在方法区,而非静态变量存储在堆内存中。 - 静态方法只能访问静态成员,不能使用this或super关键字,因为它们与对象关联。 5. **main函数**: - JVM通过静态主方法(`public static void main...

    郝彬java基础笔记

    1. **构造函数**:构造函数是用于初始化新创建对象的特殊方法,它的名称与类名相同,没有返回值。当创建一个对象时,系统会自动调用构造函数来设置对象的状态。可以定义多个构造函数以满足不同初始化需求,这被称为...

    Java编程思想重点笔记(Java开发必看).pdf

    这篇笔记将聚焦于Java中的多态性,这是面向对象编程的关键概念,同时也涉及到构造函数、静态方法和final关键字的理解。 1. **Java中的多态性**: 多态性在Java中表现为一个对象可以有多种形态,即同一种类型的不同...

    Thinking in Java读书笔记

    - 如果类已经定义了至少一个构造函数(无论是否带有参数),编译器不会生成默认构造函数。 - 示例: ```java class Bush { Bush(int i) {} } // 下面这行代码会报错,因为没有默认构造函数 new Bush(); ```...

    《Inside the C++ Object Model》笔记(1~7章)

    这个构造函数负责初始化类中的所有非静态成员变量,并执行一些基本的初始化任务。如果类中有需要特别初始化的成员,则应显式定义构造函数。 总的来说,《Inside the C++ Object Model》这本书不仅是一本关于C++底层...

    《C++ Primer》学习笔记(24)类

    - **默认构造函数的作用**:默认构造函数在多种情况下会被自动调用,例如在未初始化的非静态局部变量、类中合成的默认构造函数成员等场合。此外,当没有提供完整的数组初始化时,默认构造函数也会被调用。 - **隐式...

    C#语言学习笔记.doc

    - **静态构造函数**:在类的任何实例被创建前被调用,且仅被调用一次。 - **析构函数**:通常不推荐使用,因为现代.NET环境有更好的资源管理方式。 15. **装配**:C#程序由一个或多个装配组成,分为应用程序装配...

    Java编程思想重点笔记(Java开发必看)

    这篇笔记涵盖了多个关键知识点,包括多态性、final方法、静态方法、构造函数以及构造过程中的多态行为。 首先,Java中的多态性是面向对象编程的核心特性之一。与C++不同,Java中几乎所有的非static和非final方法都...

    Java笔记及相关代码

    - 静态方法中只能访问静态成员,不能访问非静态成员。 4. **使用静态的场景**: - 当某个属性在所有对象中都是相同的值时,可以将其声明为静态。 - 静态方法适合处理不需要依赖对象状态的逻辑。 以上是Java面向...

    程序员面试宝典 读书笔记

    - 示例代码中尝试在构造函数内部初始化非`static`的`const`成员变量是不正确的做法,因为`const`成员变量必须在构造函数的初始化列表中初始化。 **析构函数的特性** - 析构函数可以声明为`inline`,这样可以提高...

    java 精髓笔记记录

    它们不能访问非静态成员,因为它们在没有具体对象的情况下被调用。 6. **静态代码块**: 静态代码块用于初始化静态变量。一旦类被加载,这些代码就会执行。 7. **继承**: Java支持单一继承,一个子类只能继承一个...

    ocjp认证jdk1.8之1z0-808笔记 饶浩.docx

    1. 静态成员变量和非静态成员变量的区别:静态成员变量在程序运行中只会维护一份,而非静态成员变量每创建一个类就会维护一份。 2. String 类型的 API:字符串内容不能发生变化,一旦字符串内容发生变化,都要返回新...

    C# 语法 学习 笔记

    而非静态方法(如`F`)可以访问非静态成员,因为它们有明确的实例上下文。 **D. `this` 保留字** `this`关键字在C#中表示当前对象实例的引用。在构造函数、方法和其他成员中,`this`用于引用调用该成员的实例。 **...

    c++笔记小结

    笔记中提到了`Pen`类,通过构造函数对私有成员变量进行初始化。例如,`Pen(int size)`构造函数接收一个参数并初始化`m_size`成员。这里强调了构造函数的重要性,即在对象创建时为其成员变量赋予初始值,确保对象...

    C#总复习笔记.docx

    - 类可以有默认构造函数,但结构即使定义了构造函数,仍保留默认构造函数。 11. **可变参数**: - 使用 `params` 关键字,方法可以接受任意数量的相同类型的参数,例如 `public void AnyNumberOfArgument(params ...

    java自学笔记

    - 对象创建时的初始化顺序为:默认初始化 -> 构造函数中的初始化 -> 显式调用方法或通过对象名赋值。 #### 五、关键字this - **含义**: `this` 是一个特殊的关键字,它代表当前对象的一个引用。 - **用途**: - ...

Global site tag (gtag.js) - Google Analytics