面向对象之父类变量指向子类实例对象分析

父类

public class person
    {

        public static string markup;

        static person()
        {
            markup = "markup";
        }
        //无参数构造函数
        //public person()
        //{
        //    Console.WriteLine("调用person构造函数");
        //}
        public person(int parage, string paraname, string parahobby)
        {
            age = parage;
            name = paraname;
            hobby = parahobby;
        }

        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 string hobby;

        public string Hobby { get; set; }

        public void SayHi()
        {
            Console.WriteLine("Person SayHi Method");
        }

    }

子类

    public  class Student:person
    {

        public string No;

        //调用无参构造函数,同时调用有参数构造函数的方式
        public Student():base(123,"sdf","sd")
        {
            Console.WriteLine("调用Student的无参数构造函数");
        }
        public Student(string s):this()
        {
            Console.WriteLine("调用Student的有参数构造函数");
        }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是{0},{1},{2}", this.Name, this.Age, this.Hobby);
        }

    }

调用

 person stu = new Student("ss");

1、父类变量可以指向子类的实例对象,反之则不可以。

2、当创建一个子类对象时,如果是它的父类变量接收的它的子类对象,那么它只能调用父类的成员;(此过程中,此父类变量指向了父类成员,并没有指向这个子类成员);

3、例外情况:通过重写(override),父类变量可以调用子类的重写方法;

Student onestu = new Student("ss");

1、当创建一个子类对象时,如果声明的变量也是子类类型;调用时,首先查找子类中是否有该成员,有则调用;如果没有,到它的父类中寻找,有则调用

person stu = new Student("ss");
Student onestu = (Student)stu;
onestu.SayHi();

1、强制类型转换成子类,重新指向子类的实例对象

时间: 2024-12-05 01:47:51

面向对象之父类变量指向子类实例对象分析的相关文章

父类引用指向子类的对象;

public class Tuzi {         //父类  public String name; public void show(){   System.out.println(name+"是个笨蛋");  }  public Tuzi(){     }  public Tuzi(String name){   this.name=name;   } public void setname(String name){   this.name=name;  }  public

父类指针指向子类实例:同名非虚函数

场景描述:如果父类指针指向子类的实例,并且调用的函数是一个子类和父类同名的函数,并且这个函数没有被定义为虚函数,肯定无法通过父类指针调用子类的接口.测试代码如下: class CFather{ public:      void Display()     {         cout<<"Father display"<<endl;     } }; class CSon:public CFather { public:      void Display()

JAVA父类引用指向子类的对象意思

类A,另外一个类B继承了类A.有如下代码:A a = new B() ; 这就称父类的引用a 指向了子类的对象new B(); 假如你的A是一个接口,或者抽象类,那么是不可以创建对象的,这样写就可以也能够它的引用去指向他子类或者实现类的对象.这句话写在这里感觉不明显.其实主要是用在方法的参数上,也就是多态性(java的三大特性之一,可想何等重要),为了让你理解深刻,我举个例子.假如有一个类,这个类需要实现吃各种水果,有香蕉,苹果,梨子等等.我们是不是就得写:public void eat(Ban

当父类指针指向子类对象时的函数调用

class A { public: void FuncA() { printf( "FuncA called\n" ); } virtual void FuncB() { printf( "FuncB called\n" ); } }; class B : public A { public: void FuncA() { A::FuncA(); printf( "FuncAB called\n" ); } virtual void FuncB(

关于父类引用指向子类对象

例如: 有以下2个类 public class Father { public int age = 70; public static string name = "父亲"; } public class Son : Father { public int age = 30; public static string name = "儿子"; } Father f=new Son(); 这种用法叫做“父类引用指向子类对象,或者叫“父类指针指向子类对象”,指的是定义一

父类引用指向子类对象--面向对象的多态

先上代码 package com.fuzi.demo; public class FuZi { public static void main(String[] args) { FuLei fuLei = new ZiLei(); fuLei.print_info(); } } class FuLei { public void print_info() { System.out.println("父类的print_info"); System.out.println(this.get

java父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

【转】父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

父类引用指向子类对象

1 public class Test { 2 /** 3 * 对于多态,可以总结它为: 4 5 一.使用父类类型的引用指向子类的对象: 6 7 二.该引用只能调用父类中定义的方法和变量: 8 9 三.如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法:(动态连接.动态调用) 10 11 四.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错. 12 13 多态的3个必要条件: 14 15 1.继承 2.重写