我怎么能不实现抽象类的所有方法到另一个继承它的方法

时间:2017-11-07 13:47:44

标签: java abstract-class abstract

我是Java的新手,我无法理解如何不实现抽象类A到类C的所有方法。在我的示例中,我不想在类C中实现方法1.谢谢帮助!

public abstract Class A
{
   public abstract boolean method1(Sting _str);
   public abstract void method2();
   public abstract A getA(Sring str);
}

public abstract class B extends A
{
   \\ ..
}

public class C extends B
{
  public void method2()
  {  
      \\...
  }
  public A getA(String _str)
  {
        ....
  }

  //here I don't want to implement method 1
}

public Class D extends B
{
   public boolean method1(String _str)
   {
      //...
   }
   public void method2(String _str)
   {
      //...
   }
   public A getA()
   { 
        //... 
   }
 }

4 个答案:

答案 0 :(得分:1)

必须在类层次结构中的某处实现抽象方法。

在你的样本中,你必须在B或C中实现它。没有办法解决它。

答案 1 :(得分:0)

使用抽象关键字时,您需要了解的几点

  • 当一个类包含一个或多个抽象方法时,类应该被声明为abstract

  • 使用抽象类时,您无法创建抽象类的对象,因为它未完全定义

  • 抽象类的任何子类必须在超类中实现所有抽象方法,或者本身是抽象的

  • 您无法创建抽象构造函数或抽象静态方法

答案 2 :(得分:0)

已经给出了许多答案,其中大部分都是正确的。但是,我可以预见到这个问题更多的是关于基础知识,而不是代码问题。

首先,您需要了解这一点:

  • 从超类继承会使您的代码“紧密耦合”,因此不需要怀疑需要哪种asbtract方法,或者最终会造成大混乱!

  • 从抽象超类继承的子具体类必须实现所有抽象方法!否则它必须是一个抽象类。

  • 如果您需要默认行为,则需要在界面上使用asbtract类。

意思是你必须计划好了!好吧,这并不意味着你不能有更轻松的类设置,例如你的代码不会从继承等机制中获得太多的支持。

您可以使用界面和/或组合提供相同的结果。如果您需要更多地改变您的设计,请将其设为界面。但是,您可能有抽象类提供一些默认行为,如前所述...

抽象类可以具有具体方法,而接口不能!

您需要了解的另一件事是,您只能继承一个类,但是您可以实现尽可能多的接口!这显然是我的一条路径......许多程序员将Java称为一种糟糕的编程语言,但许多程序员需要理解Java不是继承!所以我的建议是停止使用基于asbtract /具体类的继承作为义务!

最后利用简单的技术为您的工作提供动力;阅读有关依赖注入和组合的内容,例如!

下面的示例仅作为基于asbtract类实现继承的正确方法。

我希望它可以帮助你理解基础知识......有趣的编程!

基于asbtract类的代码示例:

public abstract class AShape {

    public abstract double calculateArea();

    public abstract double calculatePerimeter();

}

public class Circle extends AShape {

    private double radius;

    Circle(double radius){
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * Math.pow(this.radius, 2);
    }

    @Override
    public double calculatePerimeter() {
        return Math.PI * (this.radius * 2);
    }

    //you can add more concrete methods here if you need

}


public class Rectangle extends AShape {

    private double side;

    Rectangle(double side){
        this.side = side;
    }

    @Override
    public double calculatePerimeter() {
        return 4*this.side;
    }

    @Override
    public double calculateArea() {
        return Math.pow(this.side, this.side);
    }

}

//主类

public class Main {

    public static void main(String[] args) {

        Rectangle box = new Rectangle(2);
        System.out.printf("Box area is: %.2f\n", box.calculateArea());
        System.out.printf("Box perimeter is: %.2f\n", box.calculatePerimeter());

        Circle disc = new Circle(2);
        System.out.printf("Disc area is: %.2f\n", disc.calculateArea());
        System.out.printf("Disc perimeter is: %.2f\n",disc.calculatePerimeter());
    }
}

答案 3 :(得分:-1)

实现它并在其中抛出UnsupportedOperationException:

collections:
  uploads:
title: Uploads
  output: true
posts:
  title: posts
  output: true