我正试图在java中继承我的继承。到目前为止,我理解如果我以下列方式声明一个对象:Superclass object = new Subclass()
创建的子对象仅限于父对象的方法。如果我想访问孩子的其他方法,我将不得不施放给孩子。
但是为什么在子类中仍然会覆盖方法。
这是我的例子
public class Parent {
public Parent() {
}
public void whoAmI(){
System.out.println("I'm a parent");
}
}
public class Child extends Parent {
public Child() {
}
public void whoAmI(){
System.out.println("I'm a child");
}
public void childMethode() {
System.out.println("Foo");
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Parent> list = new ArrayList<>();
Child c = new Child();
Parent p = new Parent();
Parent pc = new Child();
c.whoAmI();
p.whoAmI();
pc.whoAmI();
// Access child methodess
((Child) pc).childMethode();
list.add(c);
list.add(p);
list.add(pc);
System.out.println(list.size());
}
}
pc.whoAmI()
打印“我还是个孩子”。为什么不打印“我是父母”?
答案 0 :(得分:4)
为避免混淆,请务必了解您创建的子类对象始终包含所有方法。倾斜是一种无操作;您只需将同一个对象视为子类型的实例。
推论:你永远不能通过向下转换来改变对象的行为。由此可以直接得出相同的重写方法,而不是超类中的方法。
这种行为允许您为同一声明的超类型替换不同的行为。它被称为多态,是Java编程的主力,也是OOP的主力。没有它,首先要有一个类层次结构是没有意义的。至少,这将是非常有用的。
答案 1 :(得分:1)
为什么这是一个难以回答的问题,这是Java团队很久以前做出的设计决定。
他们认为所有方法都是virtual,除非它们被明确标记为静态。在某些语言中,它是另一种方式(默认情况下方法是静态的,除非声明为虚拟),它没有真正的区别。
重要的是理解how static and virtual methods work。 (或者有时在Java中调用它们:实例和类/静态方法。)
答案 2 :(得分:1)
您可以将继承视为创建名为super
的隐藏成员。
Java中的每个对象实例都有自己的常量类型。你不会在施法时改变它。在演示时,您只需对Java说,您确定此对象属于子类型。
覆盖的方法仍然被覆盖,这是Java的意识形态。如果你了解C ++,你可以说Java中的所有函数都是虚函数。
答案 3 :(得分:0)
class Person{
public void run(){
//running
}
}
class OneLeggedPerson extends Person{
@Override
public void run(){
//cant run have only one leg
}
}
Person p = new OneLeggedPerson();
p.run(); //cannot as it is actually a one legged person
Hope that makes sense now..
答案 4 :(得分:0)
假设您是Apple,而且您正在销售iPod。
在一个工厂和另一个工厂之间建立iPod的方式可能存在细微差别,或者在iPod的第一个版本与最后一个版本之间建立,因为这个过程已经发生了变化。
你,Apple,知道你建立了什么样的iPod:
IPodWithFirstWayOfBuildingIt ipod = new IPodWithFirstWayOfBuildingIt();
或
IPodWithSecondWayOfBuildingIt ipod = new IPodWithSecondWayOfBuildingIt();
但是最终客户(即代码的其余部分)并没有对iPod的构建方式大加妄为。对他而言最重要的是iPod的工作和行为就像一个iPod(它在商业广告中,或在最终用户手册中,或在Ipod类的javadoc中显示)。他并没有要求商店“给我一个带有第一种方法来制作它的iPod”。但实际情况是,无论是第一种构建iPod的方式,还是构建它的第二种方式,他都能获得iPod。而他称之为“iPod”的事实并没有改变iPod的构建方式,因此:
IPod iPod = new IPodWithFirstWayOfBuildingIt();
就是这样说的。我用它的第一种方式构建了一个iPod,但我会像其他iPod一样使用它,而不关心它是如何构建的。