在抽象类java中调用非抽象方法

我有3节课。 这似乎是基本问题。 但我不能通过谷歌搜索找到答案。

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

如何调用抽象类t1方法? 由于我无法从抽象类创建对象,如何在抽象类中调用t1? 谢谢。

要么创建一个覆盖该方法的具体类,要么在一个覆盖该方法的具体类中,可以调用super.t1() 。 例如:

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

如果你只有一个覆盖方法的对象实例,你就不能从类的“外部”调用原始方法,因为这会破坏封装…覆盖的目的是替换原始方法的行为。

参见以下测试:

 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 } } 

使用关键字’super’来做到这一点

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

但请确保在overriden方法中使用它。

抽象类表示类在class关键字之前具有abstract修饰符。 这意味着您可以声明抽象方法,这些方法仅在具体类中实现。

例如 :

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

你的代码似乎调用了t1()。 然而,这是调用具体的t1(),因为抽象的t1()已被具体类覆盖。

如果您希望从主代码中调用抽象t1方法,请不要覆盖具体的t1()。

或者您可以在具体类中创建一个方法,例如:

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

创建一个匿名的内部类,

抽象类:

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