public class Parent
{
  public void sayHello()
  {
    System.out.println("Hello");
  }
}public class Child extends Parent
{
  public void sayBye()
  {
    System.out.println("Bye");
  }
}我声明的时候:
Parent myInstance;
我赋值给他:
myInstance = new Child();
但是,我这么写,编译不通过:
myInstance.sayBye();
为什么呢?

解决方案 »

  1.   

    你声明的是一个Parent对象,自然不能调用Child对象的方法....
      

  2.   

    Parent 没有sayBye方法Child继承Parent所有,可以调sayHello你弄反了
      

  3.   

    唉,当然不行了啊,sayBay()是子类的函数,父类怎么调用啊,要想调用要向下转型。
      

  4.   

    声明的是一个Parent对象
    要调用子类的方法,要强制转换成子类
    Child c = (Child)myInstance ;
    c.sayBye();
      

  5.   

    呵呵,多态是在运行时的,Java是静态语言,方法调用是编译时的,myInstance是Parent类型,而Parent没有sayBye()这个方法。所以通不过编译。
    我们可以说Child是一个Parent, 但不可以反过来说,所以Parent不可以调用Child的方法。
      

  6.   

    我声明的时候: 
    Parent myInstance;我赋值给他: 
    myInstance = new Child();但是,我这么写,编译不通过: 
    myInstance.sayBye();
    为什么呢?

    myInstance是一个使用Child类型构造器实例的Parent类型的对象。Parent类型没有sayBye()方法,所以编译不通过。
    因为myInstance是用Child类型构造器实例的对象,故可以把myInstance强制转换为Child类型对性,下面的代码可以编译通过。
    ((Child)myInstance).sayBye()
      

  7.   

    因为对象初始化 = 左边的是 Person 类,因此产生对象中所有的方法和属性的可见性都为 Person 中的,而其右边子类中特有的东西,全部被隐藏起来了,暂时不可见。
      

  8.   

    楼主这个样子定义,相当于是向上转型。。就是把子类型对象转换成基类对象,但是基类没有sayby方法,所以报错。。
      

  9.   

    Child继承了Parent,你可以用Child去实例化Parent,这就是所谓的向上转型,是安全的,但是你可以简单的想想,越是子类,越是具体;越是父类,越是简单。怎么说?就是子类包含的特性肯定绝对多余父类,那么,你用父类的实例去调用子类的方法,自然是不正确的了。
    另外,貌似在一个java文件中,只有一个主类可以声明为public。
      

  10.   

    你直接之类new好了呀,费那么多事干嘛
    Child child = new Child();
    child.sayBye();如果你想实现的是父类引用指向之类对象
    那就子类的方法override父类的sayHello();public class Child extends Parent 

        public void sayHello() 
        {
            System.out.println("123");
        } 
    }
      

  11.   

    在父类加一个sayBye()的空方法就行了
      

  12.   


    那我怎么样才可以调用sayBye呢?