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

时间:2014-12-03 18:46:58

标签: 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? 谢谢。

8 个答案:

答案 0 :(得分:9)

要么创建一个覆盖方法的具体类,要么在 覆盖该方法的具体类中,您可以调用{{1 }}。例如:

super.t1()

如果您只有一个覆盖方法的对象实例,则无法从"外部" 调用原始方法这个类,因为这会破坏封装...覆盖的目的是替换原始方法的行为。

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

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

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

    }

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

答案 3 :(得分:0)

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

例如:

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

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

创建一个匿名的内部类

抽象类:

Test test = new Test() {

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

以下是如何创建匿名内部类:

test.t1();

通过为抽象类

创建的对象调用该类
varchar(max)

答案 6 :(得分:0)

您应该可以使用

Test test = new Test(){};
test.t1();

答案 7 :(得分:0)

当我们希望从抽象类继承的每个类都应实现该抽象方法时,可以使用抽象类,因此必须实现该方法,否则会产生编译时错误。

void t1()
    {
        super.t1; // means the parent methods
        System.out.println("child");
    } 

例如:Bird类具有sing()方法,还有从其继承的其他类,例如麻雀,Pigeon,Duck,这些都具有sing方法,因此我们将Bird类设为Abstract并将sing()方法设为abstract因此,每个实现Bird类的bird子代都应具有on实现的sing()方法。