new对象时干三件事情1、在堆中开辟空间2、在堆中创建对象实例化对象(创建对象)3、调用构造函数初始化成员变量
一.继承的前奏(理论篇)
(1).为什么要用继承? 继承可以减少代码冗余
我们在写一些类的时候可能会重复重复写一些成员,我们可以将这些重复的成员单独封装到一个类中,作为这些类的父类 (2).继承中类的叫法: 子类 --->父类 或者 派生类---->基类
(3) 继承语法: public 子类 : 父类
*(4) 继承的两个特性:(1)继承的单根性(一个子类只有一个父类一个孩子只有一个爹)。(2)继承有传递性(祖宗的迟早是你的)
(5) 继承了什么?要看子类能访问什么。
* 1)子类继承了父类的属性和方法,但是没有继承父类的私有字段
* 2) 子类没有继承父类的构造函数没法在创建子类对象时调用(即不能Student s = new Person()),只能创在建子类 对象调用子类构造函数之前由系统默认的先调用父类的无参构造函数(不调用父类有参构造函数,父类的有参构造函数只能用base关键字显式的调用),创建父类对象,目的是让子类可以使用(继承)父类 中的成员。
* (6)如果在父类中重写了父类有参的构造函数之后,那个无参构造函数就被干掉了,子类就掉不到会报错
解决:1)在父类中重写一个无参构造函数
2)在子类中显示的调用父类有参构造函数,使用关键字:base() (此法较多见可以解决代码冗余少写代码)
代码分析:
1,继承前奏之不用继承我们会写很多重复代码例如我们写三个类会这样写
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _09继承的前奏
{
class Program
{
static void Main(string[] args)
{
}
}
public class Student //学生类
{
private string _name; //名字
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender; //性别
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age; //年龄
public int Age
{
get { return _age; }
set { _age = value; }
}
private int _id; //学号
public int Id
{
get { return _id; }
set { _id = value; }
}
public void CHLSS() //方法
{
Console.WriteLine("吃喝拉撒睡");
}
public void Study() //方法
{
Console.WriteLine("我会学习");
}
}
public class Teacher //老师类
{
private string _name; //名字
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender; //性别
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age; //年龄
public int Age
{
get { return _age; }
set { _age = value; }
}
private double _salary; //工资
private double Salary
{
get { return _salary; }
set { _salary = value