注册 登录
编程论坛 JAVA论坛

为什么这个程序不能实现多态性?(Java新人)

赤云 发布于 2015-09-11 09:19, 616 次点击
程序代码:
package ch01;

class  B extends A//派生类
{
    public void print(){
        System.out.println("子类中的print");
    }
    public static void main(String[] args)
    {
        A a=new B();
        a.print();//此处为什么调用的是类A的print()?
        B b=new B();
        b.print();
    }
}
class A//基类
{
    public A(){
        System.out.println("调用父类构造方法!");
    }
    public void print(){
        System.out.println("类A中的print");
    }
}

这是运行结果:
调用父类构造方法!
子类中的print
调用父类构造方法!
子类中的print
9 回复
#2
诸葛欧阳2015-09-11 10:02
你的运行结果调用的是B中的print
#3
林月儿2015-09-11 13:14
程序代码:
package ch01;

public class  B extends A//派生类      子类就好,不是C++
{
    public void print(){
        System.out.println("子类中的print");
    }
    public static void main(String[] args)
    {
        A a=new B();
        a.print();//此处为什么调用的是类A的print()?
        B b=new B();
        b.print();
    }
}
class A//基类   父类,还是C++学多了
{
    public A(){
        System.out.println("调用父类构造方法!");
    }
    public void print(){
        System.out.println("类A中的print");
    }
}

1.没有一个公有类,你是怎么运行的?
2.多态指的是编译和运行时不一样调用方法不一样!

  通过鼠标悬停(你应该这么做的)找调用方法找到的应该是父类的print方法,也就是编译时的调用方法出处
#4
calix2015-09-11 14:38
能不能运行跟有没有公共类没有直接关系,一个java文件里有多个类,编译后就会生成多个class文件,直接运行需要的那个class就行了
楼主这个应该是运行时多态,执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断调用哪个方法,因为实际对象是子类B,所以调用的是子类B的print方法

楼主的问题描述和运行结果有出入。。。
#5
林月儿2015-09-11 15:11
以下是引用calix在2015-9-11 14:38:00的发言:

能不能运行跟有没有公共类没有直接关系,一个java文件里有多个类,编译后就会生成多个class文件,直接运行需要的那个class就行了
楼主这个应该是运行时多态,执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断调用哪个方法,因为实际对象是子类B,所以调用的是子类B的print方法

楼主的问题描述和运行结果有出入。。。
#6
calix2015-09-11 15:54
回复 5楼 林月儿
这个说法有什么问题吗
#7
林月儿2015-09-11 15:56
回复 6楼 calix
没有,我是菜鸟,刚学java请多指教
#8
calix2015-09-11 16:08
回复 7楼 林月儿

#9
wz3723198772015-09-11 17:44
#10
nbko2020-04-17 16:37
向上转型,实际对象是B,所以调用B的print方法
1