注
静态属类不属对象,调用只用类点名。
实例必须对象创建,可以访问所有成员。
静态不能调实例,除非传入实例参。
工具方法用静态,操作状态必实例。
using System; public class Circle { private static double pi = 3.14159; // 静态:所有圆共享 private double radius; // 实例:每个圆有自己的半径 // 静态方法:不需要具体圆对象就能计算 public static double GetPi() { return pi; } // 静态方法:纯工具计算 public static double CalculateArea(double r) { return pi * r * r; } // 构造函数 public Circle(double r) { radius = r; } // 实例方法:依赖具体的radius public double GetArea() { return pi * radius * radius; // 可以访问静态字段pi } public double GetCircumference() { return 2 * pi * radius; } } class Program { static void Main() { // 调用静态方法 Console.WriteLine($"PI = {Circle.GetPi()}"); double areaGeneric = Circle.CalculateArea(5.0); // 创建实例 Circle c1 = new Circle(3.0); Circle c2 = new Circle(5.0); // 调用实例方法 Console.WriteLine($"c1面积 = {c1.GetArea()}"); // 28.27 Console.WriteLine($"c2面积 = {c2.GetArea()}"); // 78.54 // 错误:不能从静态方法中调用实例方法(除非通过对象) // StaticMethodDemo(); } static void StaticMethodDemo() { // ❌ 错误:不能在静态方法中直接调用实例方法 // GetArea(); // ✅ 正确:先创建对象再调用 Circle c = new Circle(2.0); c.GetArea(); } }
在此之前问一句:何为封装?
就是:隐藏对象内部数据(private),通过属性或方法(public)控制外部访问,从而保护对象状态的正确性。
就是:隐藏对象内部数据(private),通过属性或方法(public)控制外部访问,从而保护对象状态的正确性。
相关信息
结构体,枚举,class一般都放在namespace下面.
基本规则:
1.要声明在类语句块中
2.用来描述对象的特征.
3.可以是任意变量类型
4.数量无限制
5.是否赋值根据需求来定.
一个小对比:
struct Person { public int Id; } class person { public int Id = 0; }
结构体不能直接对成员变量初始化,但class就可以.
而且在引用的时候class必须实例化,但结构体就不用:
class Person { public int Age; } Person p; // 没有 new p.Age = 18; // ❌ 运行时错误:NullReferenceException
Play p1 = new Play();//实例化,创建了一个对象. p1.index = 0;//初始化,也就是赋值 p1.Name = "Player1";//初始化. 实例化:创建对象(new) 初始化:设置对象的初始状态(赋值/构造函数) 但实例化,会自动进行“默认初始化” | 类型 | 默认值 | | ------ | ----- | | int | 0 | | float | 0f | | bool | false | | string | null | |引用类型 | null |
enum E_Sex { man, womn } struct Position { } class Pet { } class Person { public string name;//字符串类型 E_Sex sex;//枚举类型 Person GirlFriend;//是个class,变量名字可以和class相同. Person[] Friends; Position pos;//结构体类型 Pet pet;//也是一个class类型. }
观察一下上面,发现class,可以在里面声明一个与类名相同的变量,比如Person GirlFriend;,
在结构体只有,构造函数名字能和结构体名字相同.
这就引出了一个问题,和类名相同的成员变量不能在class里对其实例化,但在外面可以.原因:
class Person { Person GirlFriend=new Person(); }