2012-08-06 95 views
2
abstract class A { 

    public void methodA() { 
     System.out.println("methodA"); 
     methodB(); 
     showName(); 
    } 

    public abstract void methodB(); 

    public void showName() { 
     System.out.println("in showname base"); 
    } 
} 

class B extends A { 

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

    public void showName() { 
     System.out.println("in showname child"); 
    } 
} 

public class SampleClass { 

    public static void main(String[] args) { 
     A a = new B(); 
     a.methodA(); 
    } 
} 

输出是:为什么按此顺序输出?

了methodA
的methodB
在showname孩子

问题: -

由于覆盖,对象类型被认为。这是不是类B的showName()方法被称为不是类A的原因?如果不是那么这个输出命令的原因是什么?

+0

请格式化你的代码。 – 2012-08-06 18:47:08

+0

嘿保罗,我很抱歉,但我不知道如何格式化它。 – Jaikrat 2012-08-06 18:48:44

+0

我们应该在这里回答关于学校作业气味的问题吗? – Steve 2012-08-06 18:49:11

回答

3

这很容易:

A a = new B(); 
    a.methodA(); 

这里已知的是,是B类的对象,所以从B类使用的每一个可以在B类中重写方法,如果没有压倒一切,然后从类方法必须使用A

考虑顺序:

调用methodA声明为:

public void methodA() { 
    System.out.println("methodA"); 
    methodB(); 
    showName(); 
} 

methodA()内部调用都methodB()showName()。它们在类B中被覆盖,而对象a是instanceof B,所以这就是它们(来自B类)的原因。

编辑在评论中提到:

@Jaikrat辛格,B类还是A类(它的孩子,但继承类型的关系:IS-A)。类B继承了A类的方法。所以它也有methodA。所以最好说methodA也被称为类B,但是默认代码是 - 类A

+0

但我没有从任何对象类型调用重写的方法。该方法是从另一个由于引用类型而被调用的方法的主体中调用的。 – Jaikrat 2012-08-06 18:57:42

+1

@Jaikrat Singh,B类仍然是A类(它的孩子,但继承是类型的关系:IS-A)。类'B'继承了'A'类的方法。所以它也有'methodA'。所以,最好是说,那'methodA'也从类'B'称为但是是默认代码 - 同样在课堂上提供的'A' – dantuch 2012-08-06 19:02:02

2

虽然对象'a'被声明为类型A,但它被实例化为类型B.多态性导致实例类型的方法被调用而不是声明类型的方法,因为它是B类型的内部,所以调用类B的showName()方法。

+0

但我不是要求从任何OBJECTTYPE是重写的方法。该方法是从另一个由于引用类型而被调用的方法的主体中调用的。 – Jaikrat 2012-08-06 18:58:07

+2

虽然了methodA()仅被定义在类A,它仍然通过多态性决定中了methodA(),每个方法调用运行,是因为showName()在B类的定义,它调用showName(),而不是一个定义在A级。 – Vulcan 2012-08-06 19:02:46

+0

嘿谢谢@Vulcan。我试图选择你的答案也是“接受答案”,但我认为一次只能选择一个答案。谢谢你澄清我的想法。我很困惑。再次感谢。 – Jaikrat 2012-08-06 19:09:52

4

您创建了一个B类型的对象,因此在该对象上调用的所有方法都将在类B上。如果类B没有实现某些方法(如methodA),则Java会尝试在父类中找到一个方法一个)。你应该在面向对象的语言阅读关于多态性

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

+0

最佳答案:解释多态性。 +1 – Vulcan 2012-08-06 18:57:58

0

你有抽象类A,它是由B延长。延伸相当于B "is a" A。例如,如果苹果延长水果,apple 'is a' fruit。它像果实一样行事,但也做苹果的事情,香蕉不会做。因此B的行为方式与A相同,但也可以执行其他操作。因此,在您的示例中,您的B将覆盖两种方法。每个B对象默认会调用它们。为了从B访问A的方法,你需要使用关键字super

它是多态性(java编程中的一个关键点)的一部分,对象将首先在它自己中找到任何方法(即使它们被父类覆盖),然后爬上继承树以找到方法那不是直接在那个班上。

对于示例:

public void methodA() { 
    System.out.println("methodA"); //This prints no problem. 
    methodB(); //This searches the "B" class for a method called "methodB" If it can't find it, it checks its parent for a "methodB" 
    showName();//This searches the "B" class for a method called "showName" If it can't find it, it checks its parent for a "showName" 
} 

上面的代码被调用。你知道这么多(从你做,我假定这一点。其他的评论)一旦行methodB()被调用,您的类型B检查方法对整个B档的对象。如果方法不存在,它只会跳到A。然后它会为showName()做同样的事情。

2

当您拨打a.methodA()时,由于您的对象类型为B,因此它会在B中首先查找methodA。由于B中没有这种方法,因此它会在其超类中寻找此方法,即A。在类A中查找methodA,它将开始执行。

执行,将打印methodA并开始寻找下一个调用的方法(methodB),这是在B类中实现,那么它将打印methodB

下一个被调用的方法是showName,其在这两个类实现的。由于Java将开始寻找与对象类型相同的类中的实现,因此它会在第一次尝试中找到类B

主要规则很简单:Java将首先尝试查找对象类型类(在new运算符后面的名称)中的方法。如果该方法没有在那里实现,它将开始通过超类。

相关问题