20141214--C#父类,子类

首要:

子类 包含父类的所有的属性方法
所有子类都可以直接转化成父类类型
当父类类型变量里面存的是某个子类的对象的时候,才能转化成那个子类类型。

父类与子类的装换:

Ren r = new Ren();
r = (Ren)m;//Man子类转换为Ren父类
Ren m1 = new Ren();
m1 = (Man)r;//转换成父类后再转换为子类时,只能转换成原先的子类, 不能转换成其他子类

需要使用强制装换。

private与protected:

private 只可在当前类中作为成员变量使用 。

protected 只可在当前类中或子类中作为成员变量 使用。

当初始化子类的时候,都会先初始化一下父类,并且,执行父类中的构造函数。

在父类中写入:

       private int hello;//private  只能在自己类里作为成员变量使用
        protected int world;//protected 只能在自己的类 以及子类里 作为成员变量使用
        public Ren()//构造函数(先执行)
        {
            world += 10;
            hello = 0;
       }
       public void ren1()
       {
            Console.WriteLine(world);
       }

在一个子类中:

class Man : Ren//加上“:Ren” 子类,表示Man是Ren的子类。
    {
         public Man()
        {
            world += 5; //在子类中可以使用protected的 变量。不可使用 private的变量。
        }
        public void man1()
        {
            Console.WriteLine(world);
        }
    }

在另一个子类中:

class women : Ren//加上“:Ren” 子类,表示women是Ren的子类。
    {
        public women()
        {
            world += 7;
        }
        public void women1()
        {
            Console.WriteLine(world);
        }
    }

主函数

static void Main(string[] args)
        {//子类 包含父类的所有的属性方法
            //所有子类都可以直接转化成父类类型
            //当父类类型变量里面存的是某个子类的对象的时候,才能转化成那个子类类型。
              Ren rr = new Ren();
            rr.ren1();//打印结果是10

            Man m=new Man();
            m.man1();//打印结果是15

            women w = new women();
            w.women1();//打印结果是17

            Console.ReadLine();
        }

当在父类中加入 static时

      private int hello;//private  只能在自己类里作为成员变量使用
       protected static int world;//protected 只能在自己的类 以及子类里 作为成员变量使用
       //注意此处,与上文不同,添加了一个static 静态变量(受保护)
       public Ren()//构造函数(先执行)
       {
            world += 10;
            hello = 0;
      }
      public void ren1()
      {
            Console.WriteLine(world);
      }

输出结果:

            Ren rr = new Ren();
            rr.ren1();//打印结果是10

            Man m=new Man();
            m.man1();//打印结果是25

            women w = new women();
            w.women1();//打印结果是42

其原理:

每次初始化(new)的时候被保护的变量都不会改变。

10+15=25;(第一个10是初始化Ren时的改变)

25+17=42;(25是初始化Man时的改变)

父类与子类的方法调用:

当子类父类中各有一个同名的方法时,new的是谁就调用谁的方法。

父类:

public void shuohua()
        {
            Console.WriteLine("说话:");
        }

Man子类:

public void shuohua()
        {
            Console.WriteLine("会英语");
        }

注意两个是同名的方法。

主函数中:

           m.shuohua();//调用的是Man中的方法    打印结果: 会英语
            rr.shuohua();//调用的是Ren中的方法   打印结果: 说话:

            rr = (Ren)m;//把Man类的m强制转换成Ren类。
            rr.shuohua();//调用的是Ren中的方法   打印结果: 说话:

            m = (Man)rr;//把Ren类rr强制转换成Man类。
            m.shuohua();//调用的是Man中的方法   打印结果: 会英语

时间: 2024-10-11 01:51:45

20141214--C#父类,子类的相关文章

【转】父类子类指针相互转换问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的: 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的. 将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数: 当父类子类有同名虚函数的时候呢,调用的是指针转换前指

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父

java 父类子类成员变量,静态变量,构造器创建先后顺序

关于java中父类子类,成员变量,静态变量,构造器创建的先后顺序,在面试中经常会问到该类型的问题 所以用以下代码进行测试: public class Test { public static void main(String args[]) { Father f = new Son(); } } class Father { public Father() { System.out.println("Father Construct"); } static int fatherStat

父类子类指针相互转换问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的: 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的: 将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是指针自己类型的函数: 当父类子类有同名虚函数的时候呢,调用的是指针指向的对象类

java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例) //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化 public String p_Field = "父类--变量"; // 静态初始化块

Object-c父类子类

zilei. h文件 #import <Foundation/Foundation.h> //引入Car父类头文件,让子类知道Car是什么. #import "Car.h" //子类也可以有自己的属性和自己的方法 @interface zilei :Car{ NSString * name; int Speed; } //设置属性 -(void)setSpeed:(int)newSpeed; -(void)setName:(NSString*)newName; //设置方法

Java基础-父类-子类执行顺序

代码解析 子类 package com; /** * 子类 * @author huage * */ public class Test extends Test1{ public static void main(String[] args) { new Test();//测试子类和父类重载关系和调用关系 } public Test() { System.out.println("test"); test("Test"); super.test("Tes

java 类继承,父类子类方法调用的过程d

1.Mytank类继承tank,则Mytank里面的公有部分即public 成员和方法在Mytank中是含有的可以调用和赋值,且在MyTank中不要有新的成员变量与tank中的公有成员名称一样,这样会发生调用紊乱,如: Tank tank = new MyTank(); int c = tank.a; 若 tank类中public a= 3: Mytank子类中新定义public a = 2: 则上述代码中的调用将会使得c = 3: 用了父类中的a.

C#父类子类对象关系

案例: 主要有Vehicle.cs  Airplane.cs   Car.cs  3个类. Car和Airplane都继承与Vehicle类.Vehicle中Drive为虚方法,可在子类中重写,父类引用子类对象,并在car中重写了Drive方法. 1 class Vehicle 2 { 3 public void StartEngine(string noiseToMakeWhenStaring) 4 { 5 Console.WriteLine("starting engine:{0}"

java 类继承,父类子类方法调用的过程

1.Mytank类继承tank,则Mytank里面的公有部分即public 成员和方法在Mytank中是含有的可以调用和赋值,且在MyTank中不要有新的成员变量与tank中的公有成员名称一样,这样会发生调用紊乱,如: Tank tank = new MyTank(); int c = tank.a; 若 tank类中public a= 3: Mytank子类中新定义public a = 2: 则上述代码中的调用将会使得c = 3: 用了父类中的a.