Наследование в Java - PullRequest
       16

Наследование в Java

2 голосов
/ 14 мая 2010

Если у меня есть абстрактный класс в Java с именем Foo, и у него есть разработчик с именем Bar, тогда я хочу знать следующее.

допустим, Foo выглядит примерно так:

public abstract class Foo {

  Service serviceFoo

  ...

}

А Bar составляет

public class Bar extends Foo {
...
}

Кроме того, давайте предположим, что у меня есть экземпляр с Foo, названный foo, в настоящее время с serviceFoo экземпляром

Если я тогда объявлю:

Foo foo = new Bar();

создаст ли это новый экземпляр Bar с экземпляром serviceFoo или нет? Например. будет ли это поле наследоваться и создаваться или просто наследоваться?

Ответы [ 8 ]

4 голосов
/ 14 мая 2010

Когда вы вызываете new Bar();, конструктор для Foo вызывается неявно. Если конструктор Foo создает экземпляр serviceFoo, то будет Bar. Если Foo полагается на кого-то другого для создания экземпляра serviceFoo, то Bar сделает то же самое.

Существующие экземпляры Foo или Bar не имеют отношения к тому, что происходит при создании нового экземпляра. Только то, что код выполняется в конструкторе (или то, что передается как параметр), влияет на новый объект.

4 голосов
/ 14 мая 2010

Нет, наследование не происходит между экземплярами; только между определениями классов.

Когда вы создаете экземпляр new Bar(), создается экземпляр serviceFoo в соответствии с его объявлением в Foo. В текущем случае он не имеет экземпляров в Foo, поэтому в новом экземпляре Bar.

это будет нулевая ссылка.

Кроме того, вы должны знать, что все не примитивы в Java являются ссылочными типами. То есть foo - это не Foo, а ссылка на Foo. Когда вы присваиваете new Bar() foo, вы полностью переназначаете его ссылку на новый объект.

Редактировать : Еще один незначительный придирки - если у вас уже есть экземпляр Foo с именем foo, как вы заявляете, тогда строка

Foo foo = new Bar();

не будет компилироваться, поскольку это переопределение foo.

1 голос
/ 14 мая 2010

Если вы измените код своего базового класса на

public abstract class Foo {

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

Тогда bar будет иметь экземпляр Service при создании экземпляра bar.

1 голос
/ 14 мая 2010

Поскольку serviceFoo является переменной экземпляра (т. Е. Она не объявлена ​​как static), любые существующие экземпляры Foo, которые установили это поле, не будут влиять на любые новые создаваемые вами экземпляры.

Предполагая, что Bar не устанавливает его, все, что вы получите, это поле, унаследованное и не созданное с новым экземпляром.

1 голос
/ 14 мая 2010

Когда вы говорите 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 голос
/ 14 мая 2010

Нет, serviceFoo не будет создан. Линия

Foo foo = new Bar();

удаляет ссылку на «старый» объект, на который ссылается foo, и создает новый объект. В частности, он не «конвертирует» старый foo (типа Foo) в объект типа Bar.

0 голосов
/ 01 августа 2015

Наследование используется для:

  1. для повторного использования кода
  2. для продвижения полиморфизма
0 голосов
/ 01 августа 2015

Наследование означает, когда дочерний класс расширяется или наследует класс, известный как наследование.

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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...