黑马程序员-类和继承

--------------------- ASP.Net+Android+IOS开发.Net培训期待与您交流! ----------------------

类的继承

  通过继承,我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展.

 ■可以使用一个已经存在的类作为新类的基础,已经存在的类称为基类(base class),新类称为派生类(derived class).派生类的组成成员如下.

   □自己声明中的成员

   □基类的成员

 ■要声明一个派生类,需要在类名后加入基类规格说明,基类规格说明由冒号和后面跟着用作基类的类的名称.派生类被描述为直接继承自列出的基类.

 ■派生类被描述为扩展它的基类,因为它包含了基类的成员,加上在它自己的声明中的任何附加功能.

 ■派生类不能删除它所继承的任何成员.

 ■在c#中,所有的类都直接或间接的继承自object类.(当我们定义一个类的时候,如果没有写:继承一个类,那么这个类就继承了object类,这就是为什么C#的所有类都有Equal()方法的原因,因为Equal()方法是Object类的成员)

 ■c#中类都是单继承,不允许某个类同时继承两个及以上的类.可以这样理解,父类(基类)就是父亲,一个人只有一个父亲.一个父亲能有多个小孩,所以一个基类可以派生多个子类

例如,下面展示了类和继承的例子:

class Person//基类,或称为父类
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private char gender;
        public char Gender
        {
            get { return gender; }
            set { gender = value; }
        }
    }
class Student : Person//继承类Student
    {
        private int classId;
        public int ClassId
        {
            set { classId = value; }
            get { return classId; }
        }
        private string hobby;
        public string Hobby
        {
            set { hobby = value; }
            get { return hobby; }
        }
        public void SayHello()
        {
            Console.WriteLine("大家好,我是{0},我今年{1}岁了,我是{2}生,我是{3}班级的,我喜欢{4}", Name, Age, Gender, classId, hobby);//包含基类的成员,加自己的成员,除了基类的私有成员外,其余成员都能访问到
        }
    }

 

class Teacher:Person//继承类,或称子类
    {
        private string course;
        public string Cource
        {
            set{course=value;}
            get{return course;}
        }
        private int yearsOfService;
        public int YearsOfService
        {
            set { yearsOfService = value; }
            get { return yearsOfService; }
        }
    
        public void SayHello()
        {
            Console.WriteLine("你好,我是{0},我今年{1}岁了,教书{2}年了,我是{3}老师",Name,Age,yearsOfService,course);
        }
    }

 

 

class Program
    {
        static void Main(string[] args)
        {
            Teacher t = new Teacher();
            //初始化
            t.Name = "翟群";
            t.Age = 23;
            t.YearsOfService = 2;
            t.Cource = "c#";
            t.SayHello();

            Student s = new Student();
            //初始化
            s.Name = "何雄军";
            s.Age = 24;
            s.Gender = '';
            s.ClassId = 2;
            s.Hobby = "玩计算机";
            s.SayHello();
            Console.ReadKey();
        }
    }

 父类构造方法的调用顺序

 

class Person//基类,或称为父类
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private char gender;
        public char Gender
        {
            get { return gender; }
            set { gender = value; }
        }
        public Person()//会在子类构造方法之前执行
      {
            Console.WriteLine("我是父类");
        }
    }
class Student : Person//继承类Student
    {
        private int classId;
        public int ClassId
        {
            set { classId = value; }
            get { return classId; }
        }
        private string hobby;
        public string Hobby
        {
            set { hobby = value; }
            get { return hobby; }
        }
        public void SayHello()
        {
            Console.WriteLine("大家好,我是{0},我今年{1}岁了,我是{2}生,我是{3}班级的,我喜欢{4}", Name, Age, Gender, classId, hobby);//包含基类的成员,加自己的成员,除了基类的私有成员外,其余成员都能访问到
        }
        public Student()//父类构造方法执行之后才执行
        {
            Console.WriteLine("我是子类Student");
        }
     
        }

 

 

class Program
    {
        static void Main(string[] args)
        {
            Student s1 = new Student();
            //单步调试,发现,创建对象时,首先找到Student()无参构造函数,但暂不会执行Student()构造函数,而是找到父类Person()无参构造方法并执行,然后返回执行Student()构造函数

            Teacher t1 = new Teacher("翟群", 23, '', "c#", 1);
            t1.SayHello();
        }
    }

 


 

 以上例子调用的是无参数构造方法,下面的例子调用的是有参构造方法

 class Person//基类,或称为父类
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private char gender;
        public char Gender
        {
            get { return gender; }
            set { gender = value; }
        }
        public Person()//建议只要自己声明了无参构造方法,务必再声明一个无参构造方法.系统默认会调用无参构造方法
        {
            Console.WriteLine("我是父类");
        }
        public Person(string name, int age, char gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
        }
    }

 

 

  class Teacher:Person//继承类,或称子类
    {
        private string course;
        public string Cource
        {
            set{course=value;}
            get{return course;}
        }
        private int yearsOfService;
        public int YearsOfService
        {
            set { yearsOfService = value; }
            get { return yearsOfService; }
        }
    
        public void SayHello()
        {
            Console.WriteLine("你好,我是{0},我今年{1}岁了,教书{2}年了,我是{3}老师", Name, Age, yearsOfService, course);
        }
        public Teacher(string name,int age,char gender,string course,int yearsOfService):base( name, age, gender)//此处若没写base(name,age,gender)构造方法,便是默认调用Person的无参构造方法即base()
        {
            this.course = course;
            this.yearsOfService = yearsOfService;
        }
        public Teacher()//建议只要自己声明了无参构造方法,务必再声明一个无参构造方法.系统默认会调用无参构造方法
        {

        }
    }

 

构造函数的调用图解过程:

注:若在同时调用一个类中的两个重载构造方法,比如同时调用Person的构造方法Person()和person(string name,int age,char gender)构造方法,代码实现为:Person(string name,int age,char gender):this().这样调用Person(string name,int age,char gender)构造方法之前会先执行person()构造方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
继承是Java中的一种重要的面向对象编程概念,它允许一个(子继承另一个(父)的属性和方法。通过继承,子可以从父中获得已有的属性和方法,并且可以在此基础上进行扩展或者修改。 在Java中,使用关键字"extends"来实现继承。子通过继承,可以使用父中的非私有属性和方法。子可以直接访问父的公有属性和方法,也可以通过super关键字来访问父的构造方法和成员。 下面是一个简单的继承示例: ```java // 父 class Animal { private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + "正在吃饭"); } } // 子 class Dog extends Animal { public Dog(String name) { super(name); } public void bark() { System.out.println("汪汪汪"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog("旺财"); dog.eat(); // 调用父的eat方法 dog.bark(); // 调用子的bark方法 } } ``` 在上面的示例中,Animal是父,Dog是子。Dog通过关键字"extends"继承了Animal,从而可以使用Animal中的属性和方法。在main方法中,我们创建了一个Dog对象,并调用了eat方法(来自父)和bark方法(来自子)。 通过继承,子可以扩展父的功能,并且可以在需要时覆盖父的方法来实现特定的行为。继承是Java中实现代码重用和多态性的重要手段之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值