类——里式转换(C#总结)

类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据类型就是数组和结构体了,数组存放相同数据类型的数据,结构体存放不同数据类型的数据!

值类型和引用类型是数据类型的分类:就想调用分为传值调用和传址调用

值类型:在栈中不同区域直接存储数据,通过复制对象赋值;赋值后重新改动时不会影响被复制对象的值
引用类型:数据存存在堆中,通过栈中的地址指向堆,通过复制对象赋值后,新变量指向被复制对象的地址,,重新改动时会影响被复制的值。
值类型数据:传递拷贝:值
引用类型数据:传递引用:地址

int a = null;//值类型不可能包含null值,不赋值会默认0,引用类型默认NULL
值类型均有一个隐式的默认构造函数来初始化该类型的默认值,所以使用时不用new,直接赋值就可以了
值类型不可存在新的子类,所有的值类型均隐式派生于system.ValueType


结构体数据值类型,类属于引用类型


结构体和类的区别

结构中默认有一个无参的构造函数
在结构中写一个有参的构造函数的话,要把这个构造函数的所有字段都赋值, 无参的构造函数不会因为有参的构造函数存在而消失
           
类中默认有一个无参的构造函数
在类中写一个有参构造函数的话, 类中构造函数参数列表中参数可以不确定,默认构造函数会消失


详细的区别:https://www.cnblogs.com/highven/p/3191775.html



子类继承父类(父类就是基类,子类就是派生类,所有类的基类为object)


子类继承了父类的属性和方法,但子类也具有专属自己的属性和方法
构造函数的出现,使得在实例化一个类后可以方便灵活的给对象赋值
继承的出现,使得子类在实例化一个类时通过调用父类的属性方法,删除了子类的属性方法的冗余代码

继承出现后,也方便灵活实例化一个类:
子类通过带参的构造函数实例化对象时,这时默认调用的是父类默认无参的构造函数

 想要调用父类有参的构造函数:base

调用父类无参的构造函数和调用父类有参的构造函数的区别?
:实质上没什么区别,子类全部通过调用父类无参的构造函数也可以,这不过这时候走的父类默认的构造函数而已,没多大区别!
但是如果父类中对字段进行保护,子类没有办法拿到父类的属性在自己的构造方法中使用,这时候子类就只能使用自己的有参的构造函数通过调用父类的有参构造函数初始化
            1.因为属性保护字段,所以父类中取消set
            2.而子类继承父类,想通过父类的字段给对象赋值
            3.但此时拿不到父类中字段的属性
            4.只能通过调用父类有参的构造函数来
            5.这样子类的对象才能初始化成功
所以,当属性的set无法使用,用无参构造方法不能成功实例化对象的,这时候只能调用父类有参的构造参数。

调用时:子类与父类的构造函数中参数顺序要一致
public 公共的
private 私有的,只能在本类中用
protected 不允许其他非子类访问,父类修饰,子类可以访问到


关于里式转换:其实是隐式转换,判断能不能转换,不能隐式转,那就强制转,但强制可能会出错!


1.【异常】父类不能直接转换为子类
    Person p=new Person();//实例化一个Person类,用Person类变量p接收
    *Student stu=(Student) p;//强制将Person类对象p转换为Student类后,赋值给一个Student类对象Stu
 【解释】:要把父类转为子类,不可以,子类专属的属性方法父类是没有的,所以转换会报异常


2.【正常】如果new的是子类,父类再转换子类的时候可以转
    *Person p=new Student();//实例化一个Student类,用Person类变量p接收,这里在隐式转换,想把子类转换为父类
    Student stu=(Student) p;//强制将Student类对象p转换为Student类后,赋值给一个Student类对象Stu
 【解释】:直接实例化的是一个子类Student,子类可以变为父类,去掉专属的属性和方法就好,转换的时候是可以的;又想调用子类的方法,强制转换保证可以转换为Student类


3.【异常】new子类,转换另一个子类
    Person p=new Teacher();//实例化一个Teacher类,用Person类变量p接收,这里在隐式转换,想把子类转换为父类
    Student stu=(Student) p;//强制将Teacher类对象p转换为Student类后,赋值给一个Student类对象Stu
 【解释】:子类可以先变为父类,子类之间有各自专属的属相方法,想转换为另一个子类,会出错


4.【正常】new子类,转换为父类
    Student stu=new Student();//实例化一个Student类,用Student类变量stu接收
    Person p=stu;//强制将Student类对象stu 赋值给一个Person类对象p
 【解释】:将stu赋值给一个Person类对象p,相当于子类转父类,可以转换



如果隐式转换不了,就需要强制转换,强制转换成功了然后才能调方法;可以隐式转换的就不需要强制转换

子类需要父类的方法,所以转换为父类对象,再去调用方法

但对于出现的异常,不希望发生在程序运行过程中,所以在代码编写阶段要有判断能不能转的方法。通过两种方法来判断:is能够检查异常,并排除异常,能转则转,不能转就提示。as 直接转,转不了就报错。(as有点不负责任。。。)


is 转换,返回是bool值,True就能转换,False就不能转换 ,转换不了时,在转换的时候就报异常
as 也是转换,但是,如果转不了的,不报异常,返回来的是NULL,转换不了时,在调方法的时候报异常

is可以做as做的事,is可以在运行时给出转换不了的提示,as运行时转换不了直接报错!

猜你喜欢

转载自blog.csdn.net/zhaofen_7/article/details/81110366