为什么抽象类中的构造函数可以被继承并被调用?

namespace ConsoleApplication12
{
public abstract class A
{
static A() { Console.WriteLine("static A"); }
public A() { Console.WriteLine("normal A"); }
}

public class B : A
{
static B() { Console.WriteLine("static B"); }
public B() { Console.WriteLine("normal B"); }
}

public class Program
{
static void Main(string[] args)
{
B bb = new B();

Console.ReadKey();
}
}
}

输出:
static B
static A
normal A
normal B
抽象类A中的构造函数 public A() { Console.WriteLine("normal A"); } 被调用了,构造函数应该是用来实例化对象的吧,而抽象类是不能被实例化的,这是不是矛盾啊?请大神指点

----------------------------------------------------------

很容易理解,抽象类是需要被其他类继承的,这些子类是需要实例化的,实例化子类的时候是需要调用子类的构造函数的,而在默认情况下,在调用子类的构造函数前是先要调用基类的构造函数的,这一点和非抽象的类一样.因为你实例化的不是抽象类而是抽象类的子类,这个并不矛盾

你好,在你的回答中,我看到这么一句话,【而在默认情况下,在调用子类的构造函数前是先要调用基类的构造函数的】,那么为什么程序是先输出static B, 再输出 static A   normal A, 也就是为什么先调用了子类的静态构造函数,再调用父类的静态构造函数,根据我对你那句话理解,不应该是先调用父类的,再调用子类的吗??
这个问题问的好 那么我们看看静态构造函数的特点(来自MSDN)

静态构造函数既没有访问修饰符,也没有参数。

在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。

也就是说 :静态构造函数是在创建第一个类实例前由系统调用的 所以你会看出来静态构造是为了初始化类的静态属性起作用的。那么类的静态属性有什么特点呢?那就是不能被继承,因此可以很容易推断出来,静态构造肯定会先初始化子类的信息 也会先调用。这点要跟构造函数区别开来

from:

https://zhidao.baidu.com/question/1303168048495748699.html

原文地址:https://www.cnblogs.com/aspirs/p/11296171.html

时间: 2024-09-30 20:54:07

为什么抽象类中的构造函数可以被继承并被调用?的相关文章

C++中拷贝构造函数和赋值函数被调用的时机

一.拷贝构造函数被调用的时机: 1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值. 2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数. 3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数. 二.赋值函数被调用的时机: 当用一个对象赋值给另一个对象时 注意一.二中初始化和赋值的区别 C++中拷贝构造函数和赋值函数被调用的时机,布布扣,bubuko.com

Java 构造函数(抽象类中的构造函数) 和 加载

博客分类: 面向对象设计的原则 与 概念 1. Java 的构造函数 与初始化块: a. 抽象类的构造函数 若果在父类中(也就是抽象类)中显示的写了有参数的构造函数,在子类是就必须写一个构造函数来调用父类的构造函数 abstract class Person {   //定义一个抽象类,必须被继承 Person(int i) { } } public class Student extends Person { Student() { super(int i)://必须显示的调用父类构造方法//

JavaSE8基础 抽象类中可以有 静态方法,直接调用

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: //抽象类中可以有 静态方法,可以直接调用 abstract class Person { public static void sayHello() { System.out.println("hello"); } } class Javaer extends Person{ } class De

子父类中的构造函数

继承: 特点: 1,提高了代码的复用性. 2,让类与类之间产生关系,是多态性的前提. Java中的继承. 1,java只支持单继承,不支持多继承.为啥呢?答案:因为继承了多个父类如果有相同方法时, 子类对象不确定运行哪一个. 2,Java还支持多层继承.A-->B--->C 原来可以形成继承体系. 想要使用体系功能,"查阅父类功能,建立子类对象调用功能." 注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的. 所以父类中定义的是该体系中的最基本,最共性功能. 继承出

《解析C#类中的构造函数》

一.  C#中的构造函数概述: C#中类包含数据成员和函数成员.函数成员提供了操作类中数据的某些功能,包括方法.属性.构造器和终结器.运算符和索引器. 1.   构造函数设计的定义: 构造器是允许将类型的实例初始化为良好状态的一种特殊方法. 2.    构造函数设计的作用: c#中创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实例构造器来设置对象的初始化状态. 3.    对类没有定义任何共有的或受保护的构造器,导致该

Java:继承关系中的构造函数(转)

1.构造函数不会被继承到子类. 2.子类的构造函数中的第一行(除注释外)必须是父类对象(super)的构造函数. 如果没有显示指定,则有两种情况: 1)如果父类有默认构造器(不带参数的构造器才是默认构造器),则会隐式地调用它(super()),此时不会出错: 2)如果父类没有默认构造器,则会出错. class Game { Game() { System.out.println("Game default constructor"); } Game(int i) { System.ou

抽象类可以有构造函数吗

我们知道,抽象类是不能被实例化的.但抽象类是否可以有构造函数?答案是可以有.抽象类的构造函数用来初始化抽象类的一些字段,而这一切都在抽象类的派生类实例化之前发生.不仅如此,抽线类的构造函数还有一种巧妙应用:就是在其内部实现子类必须执行的代码. 以下就是在抽象类的构造函数中来初始化字段. class Program { static void Main(string[] args) { Employee employee = new Employee(); Console.WriteLine(em

【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问:  抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数. 答案很明确,可以继承.其实从Object就是个实体类,Java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的. 关键在于这答案里所说的"前提是实体类必须有明确的构造函数"一句,是什么意思.

15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?

接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问:  抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数. 答案很明确,可以继承.其实从Object就是个实体类,Java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的. 关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思. 一般学习