24.面向对象关联知识点-万物之父中的方法
24.1 知识点
知识回顾
- 万物之父
object
- 所有类型的基类是一个引用类型
- 利用里氏替换原则可以装载一切对象
- 存在装箱拆箱
辅助举例的测试类
class Test
{
// Test中的值类型变量
public int testInt = 1;
// Test中的引用类型变量
public MyTest mytest = new MyTest();
// Object的成员方法
// MemberwiseClone()在object中是保护类型的,用public包裹一层,在外部测试
public Test Clone()
{
// MemberwiseClone()会返回自己类的一个对象,as转成自己类后返回,用于测试
return MemberwiseClone() as Test;
}
// object中的虚方法
// 重写Object虚方法Equals(object obj)
public override bool Equals(object obj)
{
return base.Equals(obj);
}
// 重写Object虚方法GetHashCode()
public override int GetHashCode()
{
return base.GetHashCode();
}
// 重写Object虚方法ToString()
public override string ToString()
{
return "林文韬申明的Test类";
}
}
class MyTest
{
public int myTestInt = 2;
}
object中的主要成员图示
object中的静态方法
主函数内
静态方法 Equals
// 判断两个对象是否相等
// 最终的判断权,交给左侧对象的Equals方法,
// 不管值类型还是引用类型都会按照左侧对象Equals方法的规则来进行比较
// Object.Equals(,) 省略Object.也可以,因为class Program也默认继承Object类
Console.WriteLine(Equals(1, 1)); // True
// 值类型直接比较值
Console.WriteLine(Object.Equals(1, 1)); // True
Console.WriteLine(Object.Equals(1, 2)); // False
Test t1 = new Test();
Test t2 = t1;
Test t3 = new Test();
// 引用类型比较的是栈中存的地址,地址相同返回True,否则返回False
Console.WriteLine(Object.Equals(t1, t2)); // True
Console.WriteLine(Object.Equals(t1, t3)); // False
静态方法 ReferenceEquals
// 比较两个对象是否是相同的引用,主要是用来比较引用类型的对象。
// 值类型对象返回值始终是False。
Console.WriteLine(Object.ReferenceEquals(1, 1)); // False,值类型对象返回值始终是False
Console.WriteLine(Object.ReferenceEquals(t1, t2)); // True
Console.WriteLine(Object.ReferenceEquals(t1, t3)); // False
object中的成员方法
主函数内
普通方法 GetType
// 该方法在反射相关知识点中是非常重要的方法,之后我们会具体的讲解这里返回的Type类型。
// 该方法的主要作用就是获取对象运行时的类型Type,
// 通过Type结合反射相关知识点可以做很多关于对象的操作。
Test t4 = new Test();
Type type = t4.GetType();
普通方法 MemberwiseClone
// 该方法用于获取对象的浅拷贝对象,口语化的意思就是会返回一个新的对象,
// 但是新对象中的引用变量会和老对象中一致。
Test t5 = t4.Clone();
Console.WriteLine("克隆对象后");
Console.WriteLine("t4.testInt = " + t4.testInt);
Console.WriteLine("t4.mytest.testInt = " + t4.mytest.myTestInt);
Console.WriteLine("t5.testInt = " + t5.testInt);
Console.WriteLine("t5.mytest.myTestInt = " + t5.mytest.myTestInt);
// 观察克隆出来的对象 发现
// 改变对象中的值类型变量时,被克隆对象的对应值类型变量不会变
// 改变对象中的引用类型变量,被克隆对象的对应引用类型变量会变
// 新对象中的引用变量会和老对象中一致,指向同一个地址
t5.testInt = 20;
t5.mytest.myTestInt = 21;
Console.WriteLine("改变克隆体信息后");
Console.WriteLine("t4.testInt = " + t4.testInt);
Console.WriteLine("t4.mytest.testInt = " + t4.mytest.myTestInt);
Console.WriteLine("t5.testInt = " + t5.testInt);
Console.WriteLine("t5.mytest.myTestInt = " + t5.mytest.myTestInt);
object中的虚方法
主函数内
虚方法 Equals
// 默认实现还是比较两者是否为同一个引用,即相当于ReferenceEquals。
// 但是微软在所有值类型的基类System.ValueType中重写了该方法,用来比较值相等。
// 我们也可以重写该方法,定义自己的比较相等的规则
虚方法 GetHashCode
// 该方法是获取对象的哈希码
// (一种通过算法算出的,表示对象的唯一编码,不同对象哈希码有可能一样,具体值根据哈希算法决定),
// 我们可以通过重写该函数来自己定义对象的哈希码算法,正常情况下,我们使用的极少,基本不用。
虚方法 ToString
// 该方法用于返回当前对象代表的字符串,我们可以重写它定义我们自己的对象转字符串规则,
// 该方法非常常用。当我们调用打印方法时,默认使用的就是对象的ToString方法后打印出来的内容。
// 不重写类的ToString方法,直接输出对象时,默认打印 命名空间.类名
Random r = new Random();
Console.WriteLine(r); // System.Random
// 重写类的ToString方法后,打印出什么可以自定义
Console.WriteLine(t5);
// 林文韬申明的Test类
总结
按重要性排序,其他了解即可
- 虚方法
ToString
自定义字符串转换规则 - 成员方法
GetType
反射相关 - 成员方法
MemberwiseClone
浅拷贝 - 虚方法
Equals
自定义判断相等的规则
24.2 知识点代码
using System;
namespace Lesson22_面向对象相关_万物之父中的方法
{
#region 辅助举例的 测试类
class Test
{
//Test中的值类型变量
public int testInt = 1;
//Test中的引用类型变量
public MyTest mytest = new MyTest();
//Object的成员方法
//MemberwiseClone()在object中是保护类型的 用public包裹一层 在外部测试
public Test Clone()
{
// MemberwiseClone()会返回自己类的一个对象 as转成自己类后返回 用于测试
return MemberwiseClone() as Test;
}
//object中的虚方法
//重写Object虚方法Equals(object obj)
public override bool Equals(object obj)
{
return base.Equals(obj);
}
//重写Object虚方法 GetHashCode()
public override int GetHashCode()
{
return base.GetHashCode();
}
//重写Object虚方法 ToString()
public override string ToString()
{
return "林文韬申明的Test类";
}
}
class MyTest
{
public int myTestInt = 2;
}
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("万物之父中的方法");
#region 知识回顾
//万物之父 object
//所有类型的基类 是一个引用类型
//可以利用里氏替换原则装载一切对象
//存在装箱拆箱
#endregion
//主函数内
#region 知识点一 object中的静态方法
//静态方法 Equals 判断两个对象是否相等
//最终的判断权,交给左侧对象的Equals方法,
//不管值类型引用类型都会按照左侧对象Equals方法的规则来进行比较
//Object.Equals(,) 省略Object.也可以 因为class Program也默认继承Object类
Console.WriteLine(Equals(1, 1));//True
//值类型直接比较值
Console.WriteLine(Object.Equals(1, 1));//True
Console.WriteLine(Object.Equals(1, 2));//False
Test t1 = new Test();
Test t2 = t1;
Test t3 = new Test();
//引用类型比较的是栈中存的地址 地址相同返回True 否则返回False
Console.WriteLine(Object.Equals(t1, t2));//True
Console.WriteLine(Object.Equals(t1, t3));//False
//静态方法ReferenceEquals
//比较两个对象是否是相同的引用,主要是用来比较引用类型的对象。
//值类型对象返回值始终是False。
Console.WriteLine(Object.ReferenceEquals(1, 1));//False 值类型对象返回值始终是False
Console.WriteLine(Object.ReferenceEquals(t1, t2));//True
Console.WriteLine(Object.ReferenceEquals(t1, t3));//False
#endregion
#region 知识点二 object中的成员方法
//普通方法GetType
//该方法在反射相关知识点中是非常重要的方法,之后我们会具体的讲解这里返回的Type类型。
//该方法的主要作用就是获取对象运行时的类型Type,
//通过Type结合反射相关知识点可以做很多关于对象的操作。
Test t4 = new Test();
Type type = t4.GetType();
//普通方法MemberwiseClone
//该方法用于获取对象的浅拷贝对象,口语化的意思就是会返回一个新的对象,
//但是新对象中的引用变量会和老对象中一致。
Test t5 = t4.Clone();
Console.WriteLine("克隆对象后");
Console.WriteLine("t4.testInt = " + t4.testInt);
Console.WriteLine("t4.mytest.testInt = " + t4.mytest.myTestInt);
Console.WriteLine("t5.testInt = " + t5.testInt);
Console.WriteLine("t5.mytest.myTestInt = " + t5.mytest.myTestInt);
//克隆对象后
//t4.testInt = 1
//t4.mytest.testInt = 2
//t5.testInt = 1
//t5.mytest.myTestInt = 2
t5.testInt = 20;
t5.mytest.myTestInt = 21;
Console.WriteLine("改变克隆体信息后");
Console.WriteLine("t4.testInt = " + t4.testInt);
Console.WriteLine("t4.mytest.testInt = " + t4.mytest.myTestInt);
Console.WriteLine("t5.testInt = " + t5.testInt);
Console.WriteLine("t5.mytest.myTestInt = " + t5.mytest.myTestInt);
//改变克隆体信息后
//t4.testInt = 1
//t4.mytest.testInt = 21
//t5.testInt = 20
//t5.mytest.myTestInt = 21
//观察克隆出来的对象 发现
//改变对象中的值类型变量时 被克隆对象的对应值类型变量不会变
//改变对象中的引用类型变量 被克隆对象的对应引用类型变量会变
//新对象中的引用变量会和老对象中一致 指向同一个地址
#endregion
#region 知识点三 object中的虚方法
//虚方法Equals
//默认实现还是比较两者是否为同一个引用,即相当于ReferenceEquals。
//但是微软在所有值类型的基类System.ValueType中重写了该方法,用来比较值相等。
//我们也可以重写该方法,定义自己的比较相等的规则
//虚方法GetHashCode
//该方法是获取对象的哈希码
//(一种通过算法算出的,表示对象的唯一编码,不同对象哈希码有可能一样,具体值根据哈希算法决定),
//我们可以通过重写该函数来自己定义对象的哈希码算法,正常情况下,我们使用的极少,基本不用。
//虚方法ToString
//该方法用于返回当前对象代表的字符串,我们可以重写它定义我们自己的对象转字符串规则,
//该方法非常常用。当我们调用打印方法时,默认使用的就是对象的ToString方法后打印出来的内容。
//不重写类的ToString方法 直接输出对象时 默认打印 命名空间.类名
Random r = new Random();
Console.WriteLine(r);//System.Random
//重写类的ToString方法后 打印出什么可以自定义
Console.WriteLine(t5);//林文韬申明的Test类
#endregion
}
}
//总结
//按重要性排序
//1.虚方法 toString 自定字符串转换规则
//2.成员方法 GetType 反射相关
//3.成员方法 MemberwiseClone 浅拷贝
//4.虚方法 Equals 自定义判断相等的规则
//其他了解即可
}
24.3 练习题
有一个玩家类,有姓名,血量,攻击力,防御力,闪避率等特征。请在控制台打印出“玩家XX,血量XX,攻击力XX,防御力XX”XX为具体内容
class语句块外 namespace语句块内
// 玩家类
class Player
{
private string name;
private int hp;
private int atk;
private int def;
private int miss;
public Player(string name, int hp, int atk, int def, int miss)
{
this.name = name;
this.hp = hp;
this.atk = atk;
this.def = def;
this.miss = miss;
}
// 重写ToString
public override string ToString()
{
return string.Format("玩家{0},血量{1},攻击力{2},防御力{3},闪避{4}", name, hp, atk, def, miss);
}
}
主函数内
// 主函数内
Player player = new Player("林文韬", 100, 10, 5, 20);
// Player类内重写了ToString
Console.WriteLine(player);//玩家林文韬,血量100,攻击力10,防御力5,闪避20
一个Monster类的引用对象A,Monster类有 攻击力、防御力、血量、技能ID等属性。我想复制一个和A对象一模一样的B对象。并且改变了B的属性,A不会受到影响。请问如何实现?
class语句块外 namespace语句块内
// 怪物类
class Monster
{
public Monster(int atk, int def, int hp, int skillID)
{
Atk = atk;
Def = def;
Hp = hp;
SkillID = skillID;
}
public int Atk
{
get;
set;
}
public int Def
{
get;
set;
}
public int Hp
{
get;
set;
}
public int SkillID
{
get;
set;
}
// 攻击力、防御力、血量、技能ID都是值类型 使用浅拷贝MemberwiseClone拷贝对象 改变其他对象的属性不会有影响
public Monster Clone()
{
return MemberwiseClone() as Monster;
}
// 重写ToString
public override string ToString()
{
return string.Format("攻击力{0},防御力{1},血量{2},技能{3}", Atk, Def, Hp, SkillID);
}
}
主函数内
// 主函数内
Monster monster1 = new Monster(10, 20, 100, 1);
Monster monster2 = monster1.Clone();
monster2.Atk = 30;
monster2.SkillID = 100;
Console.WriteLine(monster1);//攻击力10,防御力20,血量100,技能1
Console.WriteLine(monster2);//攻击力30,防御力20,血量100,技能100
24.4 练习题代码
using System;
namespace Lesson22_练习题
{
//class语句块外 namespace语句块内
#region 练习题一
//有一个玩家类,有姓名,血量,攻击力,防御力,闪避率等特征
//请在控制台打印出“玩家XX,血量XX,攻击力XX,防御力XX”XX为具体内容
//玩家类
class Player
{
private string name;
private int hp;
private int atk;
private int def;
private int miss;
public Player(string name, int hp, int atk, int def, int miss)
{
this.name = name;
this.hp = hp;
this.atk = atk;
this.def = def;
this.miss = miss;
}
//重写ToString
public override string ToString()
{
return string.Format("玩家{0},血量{1},攻击力{2},防御力{3},闪避{4}", name, hp, atk, def, miss);
}
}
#endregion
#region 练习题二
//一个Monster类的引用对象A,Monster类有 攻击力、防御力、血量、技能ID等属性。
//我想复制一个和A对象一模一样的B对象。并且改变了B的属性,A不会受到影响。请问如何实现?
//怪物类
class Monster
{
public Monster(int atk, int def, int hp, int skillID)
{
Atk = atk;
Def = def;
Hp = hp;
SkillID = skillID;
}
public int Atk
{
get;
set;
}
public int Def
{
get;
set;
}
public int Hp
{
get;
set;
}
public int SkillID
{
get;
set;
}
//攻击力、防御力、血量、技能ID都是值类型 使用浅拷贝MemberwiseClone拷贝对象 改变其他对属性不会有影响
public Monster Clone()
{
return MemberwiseClone() as Monster;
}
//重写ToString
public override string ToString()
{
return string.Format("攻击里{0},防御力{1},血量{2},技能{3}", Atk, Def, Hp, SkillID);
}
}
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("万物之父中的方法");
//主函数内
#region 练习题一
Player player = new Player("林文韬", 100, 10, 5, 20);
//Player类内重写了ToString
Console.WriteLine(player);//玩家林文韬,血量100,攻击力10,防御力5,闪避20
#endregion
#region 练习题二
Monster monster1 = new Monster(10, 20, 100, 1);
Monster monster2 = monster1.Clone();
monster2.Atk = 30;
monster2.SkillID = 100;
Console.WriteLine(monster1);//攻击里10,防御力20,血量100,技能1
Console.WriteLine(monster2);//攻击里30,防御力20,血量100,技能100
#endregion
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com