美文网首页
继承中的构造函数的实例化细节以及抽象类的继承细节

继承中的构造函数的实例化细节以及抽象类的继承细节

作者: Sir_浅林 | 来源:发表于2017-12-16 15:37 被阅读0次

首先分为两类来介绍

第一种:普通类的继承

基类:

 public class 基类
    {
        public int[] arr;
        public 基类()
        {
            arr = new int[]{1,2,3};
            Console.WriteLine("基类构造函数使用了");
        }
    }

子类

public class 派生类:基类
    {
        public 派生类()
        {
            Console.WriteLine("使用了派生类的构造函数");
        }
    }

主函数

static void Main(string[] args)
    {
        派生类 dd =new 派生类();
        foreach (int VARIABLE in dd.arr)
        {
            Console.WriteLine(VARIABLE);
        }
    }

运行结果


运行结果
    从中可以看出,派生类的new()实例化时,先执行基类的构造函数,后执行子类的构造函数,
    并且子类中能够调用数组arr,那么这里就有一个疑问:子类中的arr确实存在了,那么父类中的arr是否也被实例化了?再看下面的

修改基类

 public class 基类
    {
        private int[] arr;
        public 基类()
        {
            arr = new int[]{1,2,3};
            Console.WriteLine("使用了基类构造函数");
        }
    }

子类不变
修改主函数

 static void Main(string[] args)
    {
        派生类 dd =new 派生类();
    }

此时运行:


运行结果

从中可以看出,运行是可以运行的,那么就说明了一个问题:子类实例化时,先调用了基类的构造函数,那么arr是赋址成功了,但由于这段内存没法调用,不知道arr是属于哪个类的,还是都有?
所以个人是这么理解的:从内存的角度
第一次父类是public修饰时,子类去执行new(),实例化出来的arr的内存引用地址,通过子类对象能够访问
第二次父类时private修饰时,子类去执行new(),实例化出来的arr的内存引用地址,子类对象无法访问,但是可以在父类中调用方法进行访问:

public abstract class 基类
    {
        private int[] arr;
        public 基类()
        {
            arr = new int[]{1,2,3};
            Console.WriteLine("使用了基类构造函数");
        }

        public int[] getarr()
        {
            return arr;
        }
    }

这样在主函数中就可以通过子类对象类获取这个arr的内存地址了。

总结:实际上两次都开辟了内存,只是第一次能访问,第二次不能访问,体现出来的就是第二次没有实例化的感觉。即我这么理解:谁能获取arr的内存地址,这个arr就是属于谁的,并不需要在意这个字段是写在哪个类中,是否被子类继承这个字段
拓展一下:当有多个子类时,实际上就是开辟了多个内存空间,就和正常是一样的

更希望懂原理的兄弟,帮我解释一下其中的道理
第二种:抽象类的继承

基类

public abstract class 基类
    {
        public int[] arr;
        public 基类()
        {
            arr = new int[]{1,2,3};
            Console.WriteLine("使用了基类构造函数");
        }
    }

子类

public class 派生类:基类
    {
        public 派生类()
        {
            Console.WriteLine("使用了派生类的构造函数");
        }
    }

主函数

 static void Main(string[] args)
    {
        派生类 dd =new 派生类();
        foreach (int item in dd.arr)
        {
            Console.WriteLine(item); 
        }
   } 

运行结果


运行结果
从中可以看出,抽象类和普通类在这里没什么区别,尝试另一种情况,也是没有区别的

因为这里我要说明的问题和上面不同,这里是想说明:
1.抽象类可以有普通的字段和方法,这也代表了抽象类可以继承普通类,也可以被普通类继承
2.抽象类里可以有构造函数,抽象方法,以及普通的方法

相关文章

  • 继承中的构造函数的实例化细节以及抽象类的继承细节

    首先分为两类来介绍 第一种:普通类的继承 基类: 子类 主函数 运行结果 修改基类 子类不变修改主函数 此时运行:...

  • 那么 类 抽象类 接口 这三者又是什么关系呢?

    抽象类和普通类的区别 1.抽象类不能被实例化。 2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽...

  • 浅谈javaScript继承

    原型和构造函数 prototype属性对Object添加属性和方法 构造函数实例化过程 原型和继承 简单继承 继承

  • 继承方法

    构造函数/原型/实例的关系 借助构造函数实现继承 借助原型链实现继承(弥补构造函数实现继承不足) 组合方式(组合原...

  • JS面向对象

    类与实例 创建类 实例化 类与继承 实现继承的几种方式 方式一:利用构造函数进行继承 但是这种方法缺点是无法继承父...

  • ES的类与继承

    ES5中的类与继承 构造函数继承,原型继承,组合式继承 静态方法,静态属性,实例方法,实例属性 ES6中的类与继承...

  • 原生JS继承相关概念

    原型链继承 借用构造函数(经典继承) 缺点 :每次new (实例化)都会重现创建一次 组合继承 (结合原型链继承和...

  • C++ 类-2

    虚函数 virtual 修饰有纯虚函数的类叫做抽象类只能被继承不能被实例化。

  • 实现构造函数及实例扩展

    prototype原型机制,在JS中,可以帮助实现对构造函数,以及实例继承和扩展。 定义对象后,定义构造函数,并设...

  • Java抽象类/抽象方法!

    java抽象类的特点: *抽象类无法被实例化 *子类继承抽象类然后实例化子类 *子类继承了抽象类剋必须实现抽象类的...

网友评论

      本文标题:继承中的构造函数的实例化细节以及抽象类的继承细节

      本文链接:https://www.haomeiwen.com/subject/dipswxtx.html