内存介绍 - 继承
2016-12-16 00:02
816 查看
内存:
虚拟内存总体划分为五大区域,栈区(堆栈),堆区(托管堆),常量,静态(静态未初始化和静态初始化),其他区域
栈区:由计算机虚拟内存自动进行释放管理,栈区的存储方式为先进后出,用于分配类型,栈由操作系统进行管理
不受GC(垃圾回收机制)管理,当值类型不在其作用域,其所在的内存空间自动释放,栈的执行效率为最高
堆区:用于分配小对象实例(85000),所谓小对象就是小于85000字节的实例对象。GC堆分三代垃圾管理进行管理
当GC操作时(垃圾回收的时候),垃圾收集器会对GC堆进行压缩回收,原理有点类似IOS中的autorelease(自动释放池)
大对象区:(large object heap):大对象就是指大小超过85000字节的实例对象。大对象分配在LOH上不受GC管理,
不会被压缩,只有在完成GC回收时才会被回收
ps:
栈的分配是高位-->低位进行扩展
堆的分配是低位-->高位进行扩展
值类型参数与引用参数的本质,值类型是对栈中数据进行拷贝,拷贝出来的数据相当于之前数据的副本,引用类型是对栈中数据
地址的引用,当值参数为某对象引用时,可以改变该对象的某些值,但是不能将值编程新对象的地址
继承:
继承使用条件:当你在设计类的时候,发现有字段重复.
具有相同特征不同行为的可以抽取出来,单独称为一个类,这个类供派生类使用.
简称:基类.
在现实生活中继承的关系有很多
1.儿子继承父亲
2.黄焖鸡米饭
....
在程序中使用关键符号:表示继承
格式: ( : + 类)
这个类是指继承的类
继承关系中的特点:
1.子类可以继承父类中的公有字段
2.子类可以继承父类中的公开属性
3.子类可以继承父类中的公开方法
4.父类不能拥有子类的字段/方法/属性/索引器
5.在c#中不支持多重继承,也就是说一个类只能继承一个类.
如果你想支持多继承,那么请使用Interface
继承关系中的构造函数(重点)
1.在继承关系中,首先会调用父类的构造函数,然后再调用子类的构造函数
2.在继承关系中,子类初始化对象的时候,先调用父类的构造函数,然后再看子类构造函数有没有显式
通知编译器指定调用父类的哪个构造函数,如果没有,那么默认去调用父类的无参数构造函数.
此时如果父类重写了带有参数的构造函数,程序编译不通过.那么解决办法就是给父类添加无参构造函数
或者在子类构造函数中声明指定调用父类的哪个构造函数.
this 当前类的实例
base 基类(父类对象)
using System;
namespace OOPExtend
{
public class Hero
{
//字段
public string hero_Name;
public string hero_Ding;
public string hero_Te;
public string hero_Ext;
public string hero_Live;
public string hero_Hurt;
public string hero_Effect;
//私有字段
private string _hero_Operation;
//属性
public string HeroOperation
{
set{
Console.WriteLine (value);
_hero_Operation = value;
}
get{
return _hero_Operation;
}
}
//行为
public void Baoji(){
Console.WriteLine ("暴击效果!~");
// Baoji2 ();
}
//行为1--私有方法
private void Baoji2(){
Console.WriteLine ("暴击效果2!~");
}
//构造函数
public Hero()
{
// Console.WriteLine ("父类中的构造函数!");
}
//构造函数2
public Hero(string name,string ding){
Console.WriteLine ("父类中的构造函数2!");
this.hero_Name = name;
Console.WriteLine ("ding的值{0}",ding);
this.hero_Ding = ding;
}
}
class Hero_Monkey:Hero
{
public string age;
public Hero_Monkey(string age)
{
this.age = age;
}
public Hero_Monkey(string name,string ding,string age):base(name,ding)
{
this.age = age;
}
public static void Main(){
Hero_Monkey hm = new Hero_Monkey ("18","男","99");
Console.WriteLine (hm.age);
// Hero_Monkey hm2 = new Hero_Monkey ("99");
// Console.WriteLine (hm2.age);
// hm.HeroOperation = "你好";
// Console.WriteLine (hm.HeroOperation);
// hm.Baoji ();
// Hero h = new Hero ("19","李");
// Console.WriteLine (h.hero_Ding);
}
}
}
虚拟内存总体划分为五大区域,栈区(堆栈),堆区(托管堆),常量,静态(静态未初始化和静态初始化),其他区域
栈区:由计算机虚拟内存自动进行释放管理,栈区的存储方式为先进后出,用于分配类型,栈由操作系统进行管理
不受GC(垃圾回收机制)管理,当值类型不在其作用域,其所在的内存空间自动释放,栈的执行效率为最高
堆区:用于分配小对象实例(85000),所谓小对象就是小于85000字节的实例对象。GC堆分三代垃圾管理进行管理
当GC操作时(垃圾回收的时候),垃圾收集器会对GC堆进行压缩回收,原理有点类似IOS中的autorelease(自动释放池)
大对象区:(large object heap):大对象就是指大小超过85000字节的实例对象。大对象分配在LOH上不受GC管理,
不会被压缩,只有在完成GC回收时才会被回收
ps:
栈的分配是高位-->低位进行扩展
堆的分配是低位-->高位进行扩展
值类型参数与引用参数的本质,值类型是对栈中数据进行拷贝,拷贝出来的数据相当于之前数据的副本,引用类型是对栈中数据
地址的引用,当值参数为某对象引用时,可以改变该对象的某些值,但是不能将值编程新对象的地址
继承:
继承使用条件:当你在设计类的时候,发现有字段重复.
具有相同特征不同行为的可以抽取出来,单独称为一个类,这个类供派生类使用.
简称:基类.
在现实生活中继承的关系有很多
1.儿子继承父亲
2.黄焖鸡米饭
....
在程序中使用关键符号:表示继承
格式: ( : + 类)
这个类是指继承的类
继承关系中的特点:
1.子类可以继承父类中的公有字段
2.子类可以继承父类中的公开属性
3.子类可以继承父类中的公开方法
4.父类不能拥有子类的字段/方法/属性/索引器
5.在c#中不支持多重继承,也就是说一个类只能继承一个类.
如果你想支持多继承,那么请使用Interface
继承关系中的构造函数(重点)
1.在继承关系中,首先会调用父类的构造函数,然后再调用子类的构造函数
2.在继承关系中,子类初始化对象的时候,先调用父类的构造函数,然后再看子类构造函数有没有显式
通知编译器指定调用父类的哪个构造函数,如果没有,那么默认去调用父类的无参数构造函数.
此时如果父类重写了带有参数的构造函数,程序编译不通过.那么解决办法就是给父类添加无参构造函数
或者在子类构造函数中声明指定调用父类的哪个构造函数.
this 当前类的实例
base 基类(父类对象)
using System;
namespace OOPExtend
{
public class Hero
{
//字段
public string hero_Name;
public string hero_Ding;
public string hero_Te;
public string hero_Ext;
public string hero_Live;
public string hero_Hurt;
public string hero_Effect;
//私有字段
private string _hero_Operation;
//属性
public string HeroOperation
{
set{
Console.WriteLine (value);
_hero_Operation = value;
}
get{
return _hero_Operation;
}
}
//行为
public void Baoji(){
Console.WriteLine ("暴击效果!~");
// Baoji2 ();
}
//行为1--私有方法
private void Baoji2(){
Console.WriteLine ("暴击效果2!~");
}
//构造函数
public Hero()
{
// Console.WriteLine ("父类中的构造函数!");
}
//构造函数2
public Hero(string name,string ding){
Console.WriteLine ("父类中的构造函数2!");
this.hero_Name = name;
Console.WriteLine ("ding的值{0}",ding);
this.hero_Ding = ding;
}
}
class Hero_Monkey:Hero
{
public string age;
public Hero_Monkey(string age)
{
this.age = age;
}
public Hero_Monkey(string name,string ding,string age):base(name,ding)
{
this.age = age;
}
public static void Main(){
Hero_Monkey hm = new Hero_Monkey ("18","男","99");
Console.WriteLine (hm.age);
// Hero_Monkey hm2 = new Hero_Monkey ("99");
// Console.WriteLine (hm2.age);
// hm.HeroOperation = "你好";
// Console.WriteLine (hm.HeroOperation);
// hm.Baoji ();
// Hero h = new Hero ("19","李");
// Console.WriteLine (h.hero_Ding);
}
}
}
相关文章推荐
- java--Struts2入门示例教程(五)
- Java中Date插入数据库的一些问题总结(二)
- Java中数组的问题(三)
- 浏览器--如何让登陆页面的表单不默认显示账号和密码
- JS切换卡效果
- java项目HTTP Status 404(The requested resource is not avail)的问题
- Java 关于Ajax的实例--验证用户名(四)
- (四)基于myeclipse的RocketMQ--Demo实践
- Java中类与方法的学习笔记(一):
- 由数组随机化排序引出的对于js中sort()方法的理解分析
- JavaEE--prepareStatement后面的setString()方法是为何?
- javaEE--request.getRequestDispatcher--URL后带参数实现自定义跳转
- (五)基于RocketMQ--Demo项目的测试和原理说明
- (三)RocketMQ集群部署实践
- tomcat端口号的配置
- Spring boot 设置登录页面,以及放开需要的页面或文件夹
- Nginx 文档阅读记录
- Nginx 配置示例
- Catalina\localhost下的xml文件配置
- Nginx 代理多个 Tomcat