2013-10-13 3 views
-1

, если у меня есть класс myClass1 и второй класс myClass1Extended, который является продолжением первого класса, у меня есть исходный код:InstanceOf, подклассы и литье

myClass1 c1 = something(); // line 1 
myClass1Extended c1ex = somethingElse(); // line 2 
if (c1ex instanceof myClass1) { // line 3 
    (myClass1)c1ex.doSomething(); // line 4 
} 

У меня есть несколько вопросов:

  1. в строке 3, будет ли оператор instanceof верным?
  2. в строке 4, если первый ответ - да, что произойдет, если doSomething() не было переопределено в myClass1Extended?
  3. И что происходит, если doSomething() был переоценен?
  4. в строке 4, есть (myClass1) необходимо?

Большое спасибо

+0

Этот вопрос не показывает никаких исследований. Сначала попробуйте, затем спросите позже. –

+0

Я думал, что это интересный вопрос, и люди дали мне хорошие ответы, к сожалению, я удалю его, потому что есть другие, которые считают, что я заслуживаю минус за это. –

ответ

3

Почему Don''t вы пытаетесь код, чтобы увидеть?

  1. да
  2. он будет вызывать один в родительском классе
  3. он будет вызывать один в классе ребенка
  4. нет.

Дано:

class Parent 
{ 
    public void foo() 
    { 
     System.out.ptintln("parent::foo"); 
     bar(); 
    } 

    public void bar() 
    { 
     System.out.println("parent::bar"); 
    } 
} 

class Child 
    extends Parent 
{ 
    public void foo() 
    { 
     super.foo(); 
     System.out.ptintln("child::foo"); 
    } 
} 

Вы можете использовать класс ребенка везде, где используется класс Parent, потому что все дети имеют типы родителей.

Когда компилятор смотрит на этот код:

Parent p = new Child(); 

он проверяет, что ребенок расширяет или реализует Parent.

Когда компилятор смотрит на этот код:

p.foo(); 

он проверяет, что тип по p объявлен как, Parent, имеет метод foo.

Во время выполнения, когда p.foo() линия выполнена виртуальная машина смотрит на тип, который p фактически указывая на, Child, и выглядит там для метода foo. Предполагая, что метод foo находится в Child, он запускает его, иначе он смотрит на класс Parent.

В классе Parent, когда метод foo вызывает bar компилятор снова смотрит, чтобы убедиться, что Parent класс имеет метод bar. Во время выполнения VM снова обращается к классу Child для метода bar, и поскольку он не вызывает его в Parent.

Если методы не существуют в Parent, тогда они должны существовать в родительском классе Parent, вплоть до java.lang.Object.

+1

Потому что я думаю, что это часть знаний, отсутствующих здесь, и потому что я на самом деле уже тестировался, но я хотел быть уверенным, что не ошибся. Наконец, потому что это хороший способ глубоко раскрыть язык. Большое спасибо. –

+0

Действительно ясно, спасибо. –

1

Чтобы ответить на ваш вопрос, принять этот пример здесь:

package test; 

public class Parent 
{ 
    public void printFoo() 
    { 
     System.out.println("foo"); 
    } 

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

package test; 

public class Child extends Parent 
{ 
    @Override 
    public void printFoo() 
    { 
     System.out.println("myFoo"); 
    } 
} 

package test; 

public class Main 
{ 
    public static void main(String ... args) 
    { 
     Parent test = new Child(); 
     Parent test2 = new Parent(); 

     print(test); 
     print(test2); 
    } 

    public static void print(Parent parent) 
    { 
     if (parent instanceof Parent) 
     { 
      System.out.println(parent.getClass().getName()+" is Parent"); 
      parent.printFoo(); 
      parent.printBar(); 
     } 
    } 
} 

Как вы можете видеть, Ребенок наследует от Родителя и переопределяет метод printFoo(). На печати этих объектов Родительских вы получите следующий результат:

test.Child is Parent 
myFoo 
bar 
test.Parent is Parent 
foo 
bar 

Так, чтобы ответить на ваши вопросы:
1) да
2) он будет вызывать метод родительского класса
3) она будет вызывать метод overriden - если этот метод содержит супервызов, то также будет выполняться метод родителя
4) Нет - если вы укажете fe Parent o = new Child() и реализовать метод в Ребенке, которого нет в Родительском, и вы хотите вызвать метод дочернего объекта, вам придется отдать его обратно Ребенку ((Child)o).invokeYourMethod()

Смежные вопросы