定义:把类中的一些共有的属性和方法,单独的封装到一个类中,这个类就是这些类的父类(基类),其他类称之为子类(派生类)
子类继承父类语法“子类名:父类名”
1、继承减少了大量的冗余代码;让类与类之间产生了练习,为多态打下了技术
2、子类只能继承父类非private的成员,不能继承私有字段
3、子类的成员名称如果和父类成员名称一样,那么子类就会隐藏掉父类的成员。结果就是,子类无法调用父类的重名成员,只能调用自己的成员。这个问题可以通过new关键字来解决
4、可以通过base关键字,显示地调用父类的成员
?
?
class Father
{
public void SayHello()
{
Console.WriteLine("父类说你好");
}
}
class Son : Father
{
public new void SayHello()
{
Console.WriteLine("子类说你好");
}
}
?
5、单根性:一个子类只能有一个父类
6、传递性:父类可以传递给子类的子类
1、子类没有继承父类的构造函数
2、子类虽然没有继承父类的构造函数,但是子类默认会调用父类无参数的构造函数。如果在父类中,有了新的有参数的构造函数,父类默认无参数的构造函数就消失了,子类就调不到了,然后子类就开始报错了。所以想要父类新建有参构造函数时,子类不报错,则需要在父类再写一个无参构造函数
3、为什么要调用父类的无参构造函数?
? ? ? ? 可以专门初始化子类共有并且属性值相同的属性。
?
internal class Program
{
static void Main(string[] args)
{
Man man = new Man();
Console.WriteLine(man.Country);//输出为“中国”
Woman woman = new Woman();
Console.WriteLine(woman.Country);
Console.ReadKey();//输出为“中国”
//因为在创建子类对象的时候,默认会调用父类无参的构造函数
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Country { get; set; }
public Person(string name, int age, string country)
{
Name = name;
Age = age;
Country = country;
}
public Person()
{
this.Country = "中国";
}
}
class Man : Person
{
public Man() { }
}
class Woman : Person
{
public Woman() { }
}
4、子类如果要显示的调用父类的构造函数,使用base关键字
?
static void Main(string[] args)
{
Man man = new Man("张三",20,175);
Woman woman = new Woman("小红", 18, 165);
Console.ReadKey();
//这时候子类只会调用父类有参构造函数,不会调用父类无参构造函数了
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
}
class Man : Person
{
public int ManHeigh { get; set; }
public Man(string name,int age,int manheight):base(name,age)
{
this.ManHeigh = manheight;
}
}
class Woman : Person
{
public int WomanWeight { get; set; }
public Woman(string name, int age, int womanweight) : base(name, age)
{
this.WomanWeight = womanweight;
}
}
C#有一个共同的父类,object。 如果一个类,没有显示的继承另一个类,那么这个类就继承了object 如果一个类,就算是显示的继承了另外一个类,这个类,同样也继承了object
定义:子类可以赋值给父类。如果有个地方需要父类作为参数,我们可以传递一个子类对象
类型转换:
as关键字:1、如果能转换成功,则返回对应的对象。指向的一定是对应的子类对象才能转换成功? ? ? ? ? ? ? ? ? ? 2、如果转换失败,返回null
is关键字:通过is关键字,可以判断是否可以进行类型转换
?
internal class Program
{
static void Main(string[] args)
{
Person p = new Man();
if (p != null)
{
Man m = p as Man;//as转换
}
if(p is Man)//is判断p能否转为Man子类对象
{
Man m = p as Man;
}
if (p is Man)
{
Man man = (Man)p;//强制类型转换
}
}
}
class Person { }
class Man : Person { }
class Woman : Person { }
特点:存储的数据的类型和长度都不固定
1、添加单个元素用Add,添加集合用AddRange
2、为什么可以放任意类型的元素进去?因为子类可以赋值给父类(object)
??????为什么可以放任意长度的集合进去?因为ArryList会每次多开辟一些空间
3、list.Insert(1,"你好")//在索引为1后面的位置插入“你好”。Indert是在指定的位置插入一个元素
4、list.InsertRange(1,new int[]{1,2,3})//在索引为1的元素后面插入一个“1,2,3”集合.InsertRange是在指定的位置插入一个集合
5、list.Clear()//删除集合里的所有元素
6、list.Remove("张三")//把list集合里的值为张三的元素删除了。Remove可以根据值或索引删除元素
7、list.RemoveRange(0,2)//从0开始删除两个
8、list.Sort()//排序,只能是集合里的数据类型相同
9、list.Reverse()//集合里的元素反转