在Java中,实现接口的子类是否可以拥有自己的方法?

huangapple go评论72阅读模式
英文:

Can a subclass implementing an interface in java have its own methods?

问题

例如,我有以下的代码:

Shape.java

public interface Shape{
    double getArea();
}

Circle.java

public class Circle implements Shape {
    private double radius;

    public Circle(){
        radius = 1.0;
    }

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

    @Override
    public String toString() {
       return "Circle[radius=" + radius + "]";
    }

    @Override
    public double getArea(){
        return 3.14 * radius * radius;
    }
    
    public double getCircumference(){
        return 2 * 3.14 * radius;
    }
}

Rectangle.java

public class Rectangle implements Shape{
    private double length, width;

    public Rectangle(double length, double width) {
       this.length = length;
       this.width = width;
    }

    @Override
    public String toString() {
       return "Rectangle[length=" + length + ",width=" + width + "]";
    }
 
    @Override
    public double getArea() {
       return length * width;
    }
}

以及 TestShape.java 文件

public class TestShape {
    public static void main(String[] args){
        Shape s1 = new Circle(2.0);
        System.out.println(s1.getCircumference());
    }
}

现在,我想让 Circle 类有一个 getCircumference() 方法,但是会遇到 cannot find symbol 错误。是否不可能在实现接口的子类中添加额外的方法?如果有可能,该如何实现呢?

英文:

For Example, I have this code that goes like

Shape.java

public interface Shape{
    double getArea();
}

Circle.java

public class Circle implements Shape {
    private double radius;

    public Circle(){
        radius = 1.0;
    }

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

    @Override
    public String toString() {
       return "Circle[radius=" + radius + "]";
    }

    @Override
    public double getArea(){
        return 3.14 * radius * radius;
    }
}

Rectangle.java

public class Rectangle implements Shape{
    private double length, width;

    public Rectangle(double length, double width) {
       this.length = length;
       this.width = width;
    }

    @Override
    public String toString() {
       return "Rectangle[length=" + length + ",width=" + width + "]";
    }
 
    @Override
    public double getArea() {
       return length * width;
    }
}

And the TestShape.java file

public class TestShape {
    public static void main(String[] args){
        Shape s1 = new Circle(2.0);
        System.out.println(s1.getCircumference());
    }
}

Now, I want the Circle class to have a getCircumference() method but it is running into a cannot find symbol error. Is it not possible to add extra methods to a subclass implementing an interface, and if there is, how to do that?

Edit: Deleted the getPerimeter() method from Rectangle class. It also lead to the same error by the way, on trying to call it.

答案1

得分: 2

你可以在已实现任何接口的类中添加任意多的方法,但在使用接口引用访问方法时,只能访问接口中定义的方法。

Shape s = new Circle();

// 编译器看到了 Shape 接口的引用,它没有 `getCircumference()` 函数

如果你想要访问类中的方法,你需要使用类的引用

Circle s = new Circle();
英文:

You can add as many methods as you want in a class which has already implemented any interface or interfaces but you are accessing the method using interface reference

Shape s = new Circle();

// So compiler see the reference of Shape interface and it did not have any `getCircumfrence() function

If you want to access the class method you need to use class reference

Circle s = new Circle()

答案2

得分: 0

是的,这是可能的。只需在类Circle中添加一个方法getCircumference(),您就可以得到它。

英文:

Yes, it's possible. Just add a method getCircumference() to class Circle and you will have it.

答案3

得分: 0

你在 Rectangle.java 中已经有一个名为 getPerimeter() 的方法,类似地,你可以在 Circle.java 中创建一个名为 getCircumference() 的方法。

英文:

You already have a method in Rectangle.java named getPerimeter(), similarly you can create a method named getCircumference() in Circle.java

huangapple
  • 本文由 发表于 2020年9月15日 12:08:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/63894928.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定