作者: 张综 时间: 2012-11-14 20:02
这时候父类需要向下转型。转成子类类型。也就是我们说的父类引用指向子类对象。这个过程中也就会有我们平常的所说的多态产生。但是在调用子类方法的过程中必必须调用父类有的这个方法,也就是说调用的是子类重写的父类的方法。这也就是我们平常说的调用的对象受到引用类型的限制。
给你举个例子吧。
class A {
public void fun();
}
class B extends A{
public void fun(){
System.out.println("这是重写的父类的方法。父类的fun()方法里什么都没写。这里简单的写了个输出语句。你也可以重写你要用的方法,然后调用。")
}
}
class MainApp{
public static void main(String[] args){
A a=new B();
a.fun();
}
}作者: 王阳 时间: 2012-11-14 20:05
这个应该这么说吧,不能说父类对象引用调用的子类方法,只能说是调用了子类重写了父类的方法。如果是父类中没有的那么当然不能调用,就好比说,你是你父亲的儿子,你的姓继承自你父亲,但是你的名字是自己的,不属于从父亲那继承的了。。我猜想你说的是另一种情况吧,就是多态。
public Person{
public void name(){
System.out.println("这是父类的方法!!");
}
}
public Son extends Person{
@Override
public void name(){
System.out.println("这是子类复写父类的方法!!!");
}
public void show(){
System.out.println("这是子类自己的方法!!");
}
public class Test{
public static void main(String[] args) throws IOException {
Person p = new Son();
p.name();
}
}
这里虽然是父类引用指向子类的实例对象,但是只能调用父类中有的方法,不过因为子类中复写了此方法,所以此处应输出为 "这是子类复写父类的方法!!!"
而根本调用不到子类的show()方法;作者: 王阳 时间: 2012-11-14 20:06
补充下,上面说的那个另一个情况多态,忘删除了.....希望没有误导楼主。。。。作者: 赵保磊 时间: 2012-11-14 20:13
调用不了,必须是子类的对象调用父类的方法。写一个多态: fuLei zi=new ziLei();
zi.fanfa(); //这个方法是父类中的
ziLei a=(zilei)zi;这样转换后才能调用子类中的方法
a.zifangfa();//这个方法是子类的方法。
而如果子类中也有一个父类中的方法,即如果对父类的方法进行了重写,可以直接zi.fangfa();而如果是子类所特有的方法想调用的话就必须转换。作者: 张钧杰 时间: 2012-11-14 20:43
父类对象不能调用子类的方法,这是多态的表现,可以说,父类的引用指向子类实例对象, father f =new son();前提是,class son extends father,
并且,这个引用受父类影响,子类并须重写父类的方法,才能调用,执行是子类重写的方法。