2014-12-03 2 views
3

У меня есть 3 класса. Кажется, основной вопрос. Но я не могу найти ответ по googling.вызов абстрактного метода в абстрактном классе java

public abstract class Test { 

    void t1() 
    { 
     System.out.println("super"); 

    } 

} 
public class concret extends Test{ 

    void t1() 
    { 
     System.out.println("child"); 

    } 
    void t2() 
    { 
     System.out.println("child2"); 

    } 

} 

public class run { 
    public static void main(String[] args) { 
     Test t=new concret(); 

     t.t1(); 
    } 

} 

Как я могу назвать метод класса abstract t1? Поскольку я не могу создать объект из абстрактного класса, как я могу назвать t1 в абстрактном классе? Спасибо.

+3

Я не вижу абстрактных классов. – rgettman

+0

и где абстрактный класс? –

+0

извините. отредактирован .. – Dilis

ответ

5

Либо создать конкретный класс, который не делает переопределить метод, или в пределах конкретного класса, который делает переопределить метод, вы можете вызвать super.t1(). Например:

void t1() 
{ 
    super.t1(); // First call the superclass implementation 
    System.out.println("child"); 
} 

Если вы только получили экземпляр объекта, который переопределяет метод, вы можете не вызова оригинальный метод от «внешнего» класса, потому что это разрушит инкапсуляцию ... Цель переопределения - заменить поведение исходного метода.

+0

Спасибо. Я понимаю ... Я не понял часть инкапсуляции? – Dilis

+0

@Dilis Проверить [why-is-super-super-method-not-allowed-in-java] (http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed- in-java), чтобы увидеть, как это может нарушить инкапсуляцию. – Pshemo

0

Аннотация Класс означает, что класс имеет модификатор abstract до ключевого слова class. Это означает, что вы можете объявлять абстрактные методы, которые реализованы только в конкретных классах.

Например:

public abstract class Test { 
    public abstract void foo(); 
} 

public class Concrete extends Test { 
    public void foo() { 
     System.out.println("hey"); 
    } 
} 
+0

Это не отвечает на вопрос. OP хочет знать, как вызывать код метода из базового класса на экземпляр производного класса, если производный класс переопределяет этот метод. Базовый класс, являющийся абстрактным, фактически не имеет ничего общего с описанием проблемы ОП. – Pshemo

0

Ваш код, кажется, вызывает t1(). Однако это вызывает конкретный t1(), потому что абстрактный t1() был переопределен конкретным классом.

Если вы хотите назвать абстрактный метод t1 из основного кода, не переопределяйте t1() в бетоне.

Или вы можете создать метод в конкретном классе, например:

public void invokeSuperT1(){ 
     super.t1(); 
    } 
1

См следующие тесты:

public abstract class BaseClass { 

    public void doStuff() { 
     System.out.println("Called BaseClass Do Stuff"); 
    } 

    public abstract void doAbstractStuff(); 
} 

public class ConcreteClassOne extends BaseClass{ 

    @Override 
    public void doAbstractStuff() { 
     System.out.println("Called ConcreteClassOne Do Stuff"); 
    } 
} 

public class ConcreteClassTwo extends BaseClass{ 

    @Override 
    public void doStuff() { 
     System.out.println("Overriding BaseClass Do Stuff"); 
    } 
    @Override 
    public void doAbstractStuff() { 
     System.out.println("Called ConcreteClassTwo Do Stuff"); 
    } 
} 

public class ConcreteClassThree extends BaseClass{ 

    @Override 
    public void doStuff() { 
     super.doStuff(); 
     System.out.println("-Overriding BaseClass Do Stuff"); 
    } 
    @Override 
    public void doAbstractStuff() { 
     System.out.println("Called ConcreteClassThree Do Stuff"); 
    } 
} 

public class Test { 

    public static void main(String[] args) { 
     BaseClass a = new ConcreteClassOne(); 
     a.doStuff(); //Called BaseClass Do Stuff 
     a.doAbstractStuff(); //Called ConcreteClassOne Do Stuff 

     BaseClass b = new ConcreteClassTwo(); 
     b.doStuff(); //Overriding BaseClass Do Stuff 
     b.doAbstractStuff(); //Called ConcreteClassTwo Do Stuff 

     BaseClass c = new ConcreteClassThree(); 
     c.doStuff(); //Called BaseClass Do Stuff 
         //-Overriding BaseClass Do Stuff 
     c.doAbstractStuff(); //Called ConcreteClassThree Do Stuff 
    } 
} 
1

Создать анонимный внутренний класс,

Абстрактный класс:

abstract class Test{ 
     abstract void t(); 
     public void t1(){ 
      System.out.println("Test"); 
     } 
    } 

Вот как создать анонимный внутренний класс:

Test test = new Test() { 

      @Override 
      void t() { 
       //you can throw exception here, if you want 
      } 
     }; 

Вызовите класс с помощью созданного объекта для абстрактного класса,

test.t1(); 
1

использование ключевого слова «супер», чтобы сделать это

void t1() 
    { super.t1(); 
     System.out.println("child"); 

    } 

Однако убедитесь, что вы используете это в методе overriden.

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