protected //保护的,可以让子类访问
protected //保护的,可以让子类访问
实现继承:
派生类:基类
派生类会继承基类所有的字段和函数。在继承中,派生类采用所有基类的代码,除非派生类制定重写某个函数的实现代码。
基类可以有多个派生类
类变量2=类变量1
这种类变量赋值给类变量其实是内存地址赋值,并不是参数赋值(原本类变量2的内存地址与类变量1的内存地址不一致,通过类变量赋值给类变量实际上是赋值了类变量1在栈内的内存地址给类变量2)所以此时更改类变量1或类变量2的参数时,由于两个变量指向同一个堆的内存地址,所以此时类变量1与类变量2的参数都会变更。
GC(垃圾回收)
每一个对象都会被一个变量所引用的,GC对于每一个对象都会有一个计数器表示栈内有几个类变量在引用该对象,每个对象GC都会给它持有一个计数器,堆区内的GC每隔一段时间会检查所有的对象,看那些对象的计数器是否为0。在该对象的计数器为0时会回收该对象所占用的内存区域给回收掉,供新的对象使用。
如何把这个引用给他去掉呢?
类变量=null;
这种情况下可以把该类变量在栈区内的内存地址清空。同时该类变量指向堆区的内存地址计数器-1。
null//空 空引用 空对象
除了数组,类,string其余都是值类型。
值类型和引用类型://枚举对应数字,是一个值类型
值类型(整数 bool struct(结构体) char 小数)
引用类型(string 数组 自定义的类 内置类)
值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)
引用类型需要两段内存
第一段存储实际的数据,它总是位于堆中
第二段是一个引用,指向数据在堆中的存放位置(这个引用指的是它的内存地址)
变量名是我们在程序当中使用的
实际使用时每个变量名都会转换成一个内存地址的
整数数组保存在堆里,栈里存在它的内存地址。
每个字符串本质上都是一个常量,都存储在静态存储区内,如(字符串数组、new类的字符串类型参数)都保存在静态存储区。
字符串数组、new类的字符串类型参数,实际上是栈(内存地址)→堆(内存地址)→静态存储区内数据。
为什么string要放在静态存储区,因为每个字符串都是一个常量,不可被修改。更改字符串类型赋值时实际上是修改了该变量栈内指向静态存储区的内存地址。
栈:空间比较小,但读取速度快
堆:空间比较大,但读取速度慢
栈只能从最上面的开始删除(先进后出)
堆可以任意任意顺序存⼊和移除(不按顺序)
抽象类 acstract
密封类 sealed
基类
派生类
protected
隐藏方法
base只能访问父类里面的值
this只能访问子类里面的值
虚方法:
方法重写:
父类:virtual
子类:override
继承
父类,子类(派生类)
单继承,多继承
接口
栈和堆
可以单独控制set或get的访问权限。
属性可以单独只有set 或get。//只写或只读
属性函数只写可以不管返回值类型
get和set可以简写,/*属性找的是属性名小写之后的数据成员。*/这一段可能有错 并未赋值。
public int Age{get;set;}
匿名类型:
var=45;
var=“你好”
这是一个不确定类型,会在你初始化的时候确定类型,确定下来就不能修改了。
静态存储区
基本类型的默认赋值都是0
值类型的默认类型的默认值都是0
应用类型的默认值都是null
用构造函数可以直接在new括号内填写创建初始化的值
栈内存,值内存,静态存储区
字符串一般存储在静态存储区中,栈存储字符串地址
栈在堆里面
栈和堆
栈比较小,但是速度快,只能从栈的顶端插入或者删除,把数据放入成为入栈,把数据删除成为出栈
堆比较大,但是速度慢,可以从任意位置加入或者移除
匿名类型
v
一个类可以创建多个对象的,两个数据是互不干扰的,类只是个模板。
对象可以有多个的,类只需要有一个类
类就相当于模板,对象就相当于利用模板创造出来的一个实例的物品
private //私有的,只能访问类内部
如何调用
对象本质上就是变量;
类名 变量名 =new 类名();
第一步 声明一个对象,
第二部 给这个对象赋值”给这个对象实例化“
结构体不需要new 对象需要new赋值。
对象必须得new出来,不能空赋值null;