1.案例一:
从键盘接收三门课分数,计算三门课的平均分和总成绩,编写成绩计算类实现功能
namespace demo4
{
/// <summary>
/// 计算成绩类:包括java、csharp、db
/// </summary>
public class ScoreCalc
{
//静态特征(成员变量)
public int java;
public int csharp;
public int db;
//动态特征(行为)
/// <summary>
/// 统计总分
/// </summary>
/// <returns></returns>
public int CalcTotalScore()
{
int total = java + csharp + db;
return total;
}
/// <summary>
/// 显示总分
/// </summary>
public void ShowTotalScore()
{
int sum = CalcTotalScore();
Console.WriteLine($"总成绩为:{sum}");
}
/// <summary>
/// 计算平均成绩
/// </summary>
/// <returns></returns>
public int CalcAvg()
{
int avgscore = (java + csharp + db) / 3;//这里如果写成 CalcTotalScore()/3 也是可以的,但是耦合度高,不推荐
return avgscore;
}
/// <summary>
/// 显示平均成绩
/// </summary>
public void ShowCalcAvg()
{
int avg = CalcAvg();
Console.WriteLine($"平均成绩为:{avg}");
}
}
}
namespace demo4
{
class Program
{
static void Main(string[] args)
{
ScoreCalc scoreCalc = new ScoreCalc();//创建类的对象
Console.WriteLine("请输入你的Csharp成绩:");
scoreCalc.csharp = int.Parse(Console.ReadLine());
Console.WriteLine("请输入你的Java成绩:");
scoreCalc.java = int.Parse(Console.ReadLine());
Console.WriteLine("请输入你的db成绩:");
scoreCalc.db = int.Parse(Console.ReadLine());
//ScoreCalc 抽象的 scoreCalc 内存中具体存在的数据结构
scoreCalc.CalcTotalScore();//统计总成绩
scoreCalc.ShowTotalScore();//显示总成绩
scoreCalc.CalcAvg();//统计平均成绩
scoreCalc.ShowCalcAvg();//显示平均成绩
}
}
}
2.内存分配
【堆】全称托管堆,使用灵活,使用的空间大,自适应长度(理论上无限大)
【栈】系统默认类型、读取数据快
【GC】垃圾回收机制
【值类型】int、char、double、float、struct、enum
在栈中存放值(有固定的字节)
【引用类型】string、class(类)、interface(接口)、Array(数组)
在堆中存放
3.成员变量(全局变量、字段)
特点:在虚拟内存中,分配了一块空间,存放值,
生命周期一直持续,也就是说一直占用着内存
作用域:在整个类中均可使用
4.局部变量
作用域:只能够在方法中使用,还可以再缩小
特点:方法在使用过后,局部变量就释放掉了
【注1】就近原则:
假如局部变量和全局变量重名,那么选择的是作用范围较近的
也就是说,作用范围越小的,优先级越高
【注2】成员变量int | string不赋值,默认值为0 | Null,即成员变量可以不赋值
但是局部变量必须要手动的赋值,否则无法使用
5.案例二:
创建手机类、电池类;
手机类中需要定义的属性有:品牌;方法要实现:下载音乐、播放音乐、充电等功能
电池类中需要定义的方法:充电功能
//创建手机类
namespace demo4_2
{
public class Phone
{
public string brand;//品牌
/// <summary>
/// 下载功能
/// </summary>
/// <returns></returns>
public string DownLoadMusic()
{
//下载的代码
string musicname = "起风了";
return musicname;
}
/// <summary>
/// 播放音乐功能
/// </summary>
public void PlayMusic()
{
//先下载
string music = DownLoadMusic();
//再播放
Console.WriteLine($"{brand}品牌的手机正在播放音乐{music}");
}
/// <summary>
/// 充电功能(属于手机)
/// </summary>
public void ChargeCell()//功能接口:一个个小功能件组装成了一个手机
{
Cell cell = new Cell();//创建电池
cell.GetPower();
}
}
}
//创建电池类
namespace demo4_2
{
public class Cell
{
public void GetPower()
{
//电池功能
Console.WriteLine("电池正在充电...");
}
}
}
//在main()方法中调用类
namespace demo4_2
{
class Program
{
static void Main(string[] args)
{
Phone phone = new Phone();
phone.brand = "华为";
//phone.PlayMusic();
string musicname = phone.DownLoadMusic();
Console.WriteLine($"下载的歌曲名为:{musicname}");
}
}
}
【注】注意手机与电池的关系
实际上,充电时电池的功能,由于电池是手机的组装零件,因此在手机类中,“充电”功能只需要调用一下电池的充电功能即可