2010-05-14 84 views
2

如果我在java中有一个名为Foo的抽象类,它有一个名为Bar的实现者,那么我想知道以下内容。Java中的继承

可以说Foo看起来像

public abstract class Foo { 

    Service serviceFoo 

    ... 

} 

而且Bar

public class Bar extends Foo { 
... 
} 

此外,让我们假设我有Foo一个实例,命名为foo,目前已serviceFoo实例

如果我然后声明:

Foo foo = new Bar(); 

这是否会创建一个Bar的新实例,该实例是否已经实例化了serviceFoo?例如。该字段将被继承和实例化还是继承?

+2

你试过了吗? – Pops 2010-05-14 14:15:41

+0

Java区分大小写 – 2010-05-14 14:19:12

回答

4

当您致电new Bar();时,暗示调用Foo的构造函数。如果Foo的构造函数实例化了serviceFoo,那么Bar也是如此。如果Foo依靠其他人实例化serviceFoo,则Bar也会这样做。

FooBar的现有实例与创建新实例时所发生的情况无关。只有在构造函数中执行的代码(或作为参数传入的内容)对新对象有影响。

4

不,实例之间不会发生继承;只在类定义之间。

当您实例化new Bar()时,serviceFoo将根据其在Foo中的声明进行实例化。在当前情况下,它在Foo中没有实例化,因此它将在Bar的新实例中为空引用。

另外,您应该知道Java中的所有非基元都是引用类型。也就是说,foo不是Foo,而是对Foo的引用。当您将new Bar()指定为foo时,您将完全重新分配其对新对象的引用。

编辑:还有一个,小的鸡蛋里挑骨头 - 如果你已经有一个名为foo你要求的Foo一个实例,则该行

Foo foo = new Bar(); 

不会编译,因为它是一个foo重复声明。

+0

是的,我的意思是foo = new Bar()sorry:p – stevebot 2010-05-14 14:26:36

1

不,serviceFoo不会被实例化。该行

Foo foo = new Bar(); 

删除对foo引用的“旧”对象的引用,并创建一个全新的对象。特别是,它不会将旧的foo(类型Foo)“转换”为Bar类型的对象。

1

当你说Foo foo = new Bar(),你正在创建一个全新的对象。这意味着Bar是从头创建的,并且任何实例变量也都被初始化。如果它继承自超类,如Foo,那么这些继承的变量也会被初始化。

无参数构造函数Bar()无法知道外部Service serviceFoo并以某种方式将其设置为该值。

如果你想这样做,你需要在构造函数中传递对serviceFoo的引用。

Foo foo1 = new Bar(); 
foo1.serviceFoo = new Service(); 
// do something with that serviceFoo 

Foo foo2 = new Bar(foo1.serviceFoo); // make sure you define this constructor 
1

由于serviceFoo是一个实例变量(即它不声明为static)已经把这个字段设置不会对您产生任何新的情况下,任何影响美孚的任何现有实例。

假设Bar没有设置它,所有你会得到的是字段继承,并没有与新实例实例化。

1

如果你改变你的基类的代码

public abstract class Foo { 

    Service serviceFoo = new Service(...); 
    ...... 
} 

然后栏时,栏被实例化将有服务的一个实例。

0

继承意味着当一个子类继承或继承继承类。

public class Parent { 

    public void dostuff() { 
     System.out.println("i am in parent"); 
    } 
} 

public class Child extends Parent { 

    public void dostuff() { 
     System.out.println("i am in child"); 
    } 
} 

public class Test { 

    public static void main(String[] args) { 
     Parent p = new Parent(); 
    Parent p1 = new Child(); 
     p.dostuff(); 
     p1.dostuff(); 
    } 

} 
0

继承用于:

  1. ,使代码的重用
  2. 促进多态性