面向对象(基础oop)之继承总结

     你们好,我叫李京阳,,很高兴认识你们,之因此我想开一个本身的博客,就是来把本身所了解的知识点经过本身的话写一下,但愿被博客园的朋友们点评和一块儿讨论一下,也但愿从博客园中多认识一些软件开发人员!如今我开始讲一下面向对象的一点知识,请大家多多点评和讨论!! 程序员


 

              1. 结构体不能继承,可是能够实现接口.
                 可是全部的结构体都默认从ValueType这个类继承.
                 而ValueType这个类从Object类继承.
                 根据继承的传递性 因此咱们的结构体对象中就拥有object类的成员.
              能够从反编译工具去查看,个人反编译工具过时了,没截图
              2. 被sealed修饰的类,叫作密封类.
                 密封类不能做为父类. 可是能够做为子类.
              能够从反编译工具去查看,个人反编译工具过时了,没截图
              3. 子类的访问级别不能比父类高函数


                 类:  public--> internal
                 成员: public--> internal--> protected--> private
               
              4. 静态类是不能被继承的.
                 a. 静态类不能相互继承 由于静态类没有实例构造函数
                 b. 静态类直接从object类继承.
                 c. 静态类的本质实际上是1个密封类.
                
              5. this和base(进入继承那个博客说的挺详细的,能够进入那里看看)
                 a. this关键字
                    1)  表明当前对象
                        在实例方法中使用this关键字就表明当前对象
                        经过this关键字能够点出本类的全部的成员和父类的非私有成员
                    2)  调用本类的其余的构造函数
                        在构造函数的后面 的 this  表明调用本类的其余的构造函数
                 b. base关键字
                    1)  在实例方法中 经过base关键字能够显示的访问子类对象中的非私有的父类成员.
                    2)  调用父类的构造函数
                        在子类的构造函数的后面的 base 表明调用父类的构造函数.
                                  
              6. 在子类中能够存在和父类中的同名方法,若是方法的参数的个数或者类型不一样
                 那么他们子类中构成重载.
              
              7. 在子类对象中是能够存在和父类相同的成员.
                 建立父类对象,经过父类对象调用这个同名成员 毫无疑问调用的是父类的.
                 建立子类对象,经过子类对象调用这个同名成员 调用的是子类本身独有的.
                
                 子类中的同名成员会将父类的同名覆盖掉.因此咱们经过子类对象来调用这个同名成员的时候
                 调用的是子类的同名成员.
                 请记住,经过子类对象是不管如何也调用不到同名的父类成员,由于子类的同名成员将父类的同名成员覆盖掉.
                 可是在子类的内部,仍然是能够经过base关键字调用到父类的同名成员.
             
              8. 默认状况下,子类中的同名成员在隐藏父类的同名成员的时候.
                 编译器会提示程序员.
                 若是咱们不想被编译器提示 咱们确实是要去隐藏父类的同名成员 这个时候就加上new关键字.
                 告诉编译器 我是有意而为之 不要多嘴.
                 new关键字加与不加 都会将父类的同名成员隐藏掉.
                
             
              9. new关键字有什么做用啊?
                 a. 建立对象
                 b. 隐藏父类的同名成员
                 c. 限制泛型的类型.
                
              10. 里氏替换原则(LSP)
                 a. 子类能够替换父类的位置,而且程序的功能不受1丁点影响.
                    为何?
                    1). 由于父类拥有的功能,子类都拥有,子类只会多功能而不会少功能.
                    2). 要1个父类对象. 可是咱们却给了1个子类对象 这是说得通的.
                        由于子类是1个父类.
                    3). 是知足自动类型转换的:
                        父类和子类是相互兼容的. 父类的范围是比子类的范围要大的.
                       
                 b. 里氏替换原则的具体表现形式:
                    当1个父类变量指向1个子类对象的时候. 这个时候就有咱们的里氏替换原则了.
                
                 c. 里氏替换原则的好处在那?
                    a. 最大的好处是为了多态.
                    b. 1个父类变量不只仅能够指向父类对象,还能够指向它的子类对象.
         
                 d. 在替换的时候,只能是子类替换父类. 
                    没有继承关系的绝对不能替换的.
                    父类也不能去替换子类的位置.
                   
                 e. 当1个父类变量指向1个子类对象的时候.
                    经过这个父类变量只能调用到这个子类对象中的父类成员.
                    子类独有的成员 经过这个父类变量是没法调用的.
                   
                    哪怕子类和父类中存在同名成员,经过这个父类变量调用这个同名成员仍然调用的是父类的.
                
              11.  在建立对象的时候,这个对象的大小:
                   本类和父类的全部的字段 再加上1个同步索引快和1个类型指针.
             
             
             
              12. 里氏替换原则最爽的地方
                  1个父类类型的变量中 能够存储1个父类对象的引用和子类对象的引用
                  不爽的地方在于,取出来之后  类型是1个父类类型的 经过这个父类类型只能访问到子类中的父类成员.
                 
                  好处: 存的时候很爽.
                  坏处: 取出来的时候,类型是1个父类类型. 没法调用到子类独有的成员 。
                 
             
              13.  类型转换
                  a.  没有办法直接的将1个父类类型的变量的值 赋值给1个 子类变量.
                  b.  若是必定要赋值的话,那么咱们使用强制转换的语法就能够了.
                  c.  类型转换的意义:
                      强制的把父类变量中的值(对象的地址) 赋值给 子类变量.
                  d.  转换成功的条件:
                      若是子类变量可以指向父类变量指向的对象.那么就能够转换成功.
                      变量可以指向那些对象?
                      变量能够指向本类的对象和本类的子类对象.
                  e.  类型转换只适合于有继承关系的 不然就会报语法错误.
                     
              14. 类型判断
                  is关键字能够判断某个变量的类型.
                  a. 某个变量必定是这个变量的类型
                     Person p;  p变量必定是1个Person类型.
                  b. 若是变量指向1个子类对象, 那么这个变量也是这个子类类型.
                     Person p = new Studnet();
                     p必定是1个Person类型.
                     p也是1个Student类型的.
                 
                  c. 若是1个父类变量指向1个子类对象,那么这个父类变量的类型.
                     便是父类的类型. 也是指向的子类对象的类型 也是指向的子类对象的父类类型.
                     Person p = new ItCastStu();
                     p是1个Person类型.
                     p是ItCastStu
                     p是Student类型.
                 
                  d. 子类必定是1个父类类型.
                     当父类变量指向1个子类对象的时候,这个父类变量也是这个子类类型.
                 
             
                  eg:  p is Student
                       p变量的类型自己就是Student
                       p变量指向1个Student对象.
                       p变量指向1个Student子类对象,.
                 
                  经过is关键字来判断1个引用类型的变量是否指向1个指定的对象.
             
                  is关键字只适合用于判断拥有继承关系的类型.
                 
              15. 在作转换的时候,若是要保证不会发生异常,咱们在转换以前最好是作1个类型判断.
                  as 转换, 与强制转换的效果是同样的.
                 
                  as转换在转换失败的时候,不报异常,返回null
                  强制转换若是转换失败 会报异常工具

相关文章
相关标签/搜索