我用父类声明,用子类new,编译不通过

999朵玫瑰 2009-11-05 04:37:56
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();

为什么呢?
...全文
357 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
feng_jyie 2009-11-05
  • 打赏
  • 举报
回复
向下转型
999朵玫瑰 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
因为对象初始化 = 左边的是 Person 类,因此产生对象中所有的方法和属性的可见性都为 Person 中的,而其右边子类中特有的东西,全部被隐藏起来了,暂时不可见。
[/Quote]

那我怎么样才可以调用sayBye呢?
evilphoenix 2009-11-05
  • 打赏
  • 举报
回复
在父类加一个sayBye()的空方法就行了
CC2008NB 2009-11-05
  • 打赏
  • 举报
回复
你直接之类new好了呀,费那么多事干嘛
Child child = new Child();
child.sayBye();

如果你想实现的是父类引用指向之类对象
那就子类的方法override父类的sayHello();

public class Child extends Parent
{
public void sayHello()
{
System.out.println("123");
}
}

zhangw0322 2009-11-05
  • 打赏
  • 举报
回复
就相当于正方形可以是四边形,矩形、梯形都可以是四边形,但是反过来却不然,四边形不见得就是正方形等等,就是这个意思
zhangw0322 2009-11-05
  • 打赏
  • 举报
回复
Child继承了Parent,你可以用Child去实例化Parent,这就是所谓的向上转型,是安全的,但是你可以简单的想想,越是子类,越是具体;越是父类,越是简单。怎么说?就是子类包含的特性肯定绝对多余父类,那么,你用父类的实例去调用子类的方法,自然是不正确的了。
另外,貌似在一个java文件中,只有一个主类可以声明为public。
999朵玫瑰 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 swandragon 的回复:]
声明的是一个Parent对象
要调用子类的方法,要强制转换成子类
Child c = (Child)myInstance ;
c.sayBye();
[/Quote]
强制转换了还是不能调用阿,我试了
smallbear923 2009-11-05
  • 打赏
  • 举报
回复
楼主这个样子定义,相当于是向上转型。。

就是把子类型对象转换成基类对象,但是基类没有sayby方法,所以报错。。
  • 打赏
  • 举报
回复
因为对象初始化 = 左边的是 Person 类,因此产生对象中所有的方法和属性的可见性都为 Person 中的,而其右边子类中特有的东西,全部被隐藏起来了,暂时不可见。
Adebayor 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 swandragon 的回复:]
声明的是一个Parent对象
要调用子类的方法,要强制转换成子类
Child c = (Child)myInstance ;
c.sayBye();
[/Quote]
三界五行外 2009-11-05
  • 打赏
  • 举报
回复
我声明的时候:
Parent myInstance;

我赋值给他:
myInstance = new Child();

但是,我这么写,编译不通过:
myInstance.sayBye();
为什么呢?

myInstance是一个使用Child类型构造器实例的Parent类型的对象。Parent类型没有sayBye()方法,所以编译不通过。
因为myInstance是用Child类型构造器实例的对象,故可以把myInstance强制转换为Child类型对性,下面的代码可以编译通过。
((Child)myInstance).sayBye()
Brodie 2009-11-05
  • 打赏
  • 举报
回复
呵呵,多态是在运行时的,Java是静态语言,方法调用是编译时的,myInstance是Parent类型,而Parent没有sayBye()这个方法。所以通不过编译。
我们可以说Child是一个Parent, 但不可以反过来说,所以Parent不可以调用Child的方法。
swandragon 2009-11-05
  • 打赏
  • 举报
回复
声明的是一个Parent对象
要调用子类的方法,要强制转换成子类
Child c = (Child)myInstance ;
c.sayBye();
wifewifewife 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 windforcecn 的回复:]
Parent 没有sayBye方法

Child继承Parent所有,可以调sayHello

你弄反了
[/Quote]
是的,当时就是这样.
feng_jyie 2009-11-05
  • 打赏
  • 举报
回复
唉,当然不行了啊,sayBay()是子类的函数,父类怎么调用啊,要想调用要向下转型。
windforcecn 2009-11-05
  • 打赏
  • 举报
回复
Parent 没有sayBye方法

Child继承Parent所有,可以调sayHello

你弄反了
GreenVesture 2009-11-05
  • 打赏
  • 举报
回复
你声明的是一个Parent对象,自然不能调用Child对象的方法....

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧