接口抽象方法不指定主体

时间:2013-06-13 15:36:31

标签: java

我正在尝试创建一个可以作为System.out.print()的快捷方式的界面;但是当我编译时我得到abstract methods do not specify a body并且我不知道这意味着什么

public interface Printing{   
    public  abstract void prt(String print,boolean line){ 
        if(line=true) {   
            System.out.println(print);
        }       
    }   

    public abstract void prt(String print){          
        System.out.print(print);       
    } 
}

7 个答案:

答案 0 :(得分:3)

interface中声明的方法会自动publicabstract。所以你可以从抛弃这两个修饰语开始。

根据定义,抽象方法没有正文......所以也许接口不是你在这里寻找的。

如果您不希望能够实例化Printing但想要“默认实现”,请使用abstract ,它为这两种方法提供基本实现:

public abstract class Printing
{
    public void ptr(String print, boolean line) {
        // do stuff
    }

    public void ptr(String print) {
        // do stuff
    }
}

如果需要,实现必须使用extends Printing@Override默认方法。

答案 1 :(得分:1)

Interface是一个契约,您只需指定应该实现的方法。 抽象方法不包含任何正文,只包含签名。

答案 2 :(得分:0)

将其设为抽象类而不是接口。

接口可能没有任何方法实现。所以你唯一能拥有的就是。

void prt(String print,boolean line);
void prt(String print);

答案 3 :(得分:0)

抽象方法从不指定正文。这就是为什么他们被制作抽象。 如果要在界面中创建方法,它们将始终是公共的和抽象的。

在这种情况下,您可能希望编写一个抽象类,并使用实现编写一个方法,将另一个方法编写为抽象类。

答案 4 :(得分:0)

接口类似于空壳,但未实现成员。

以下是将代码更改为:

所需的内容
void prt(String print,boolean line);

void prt(String print);

http://docs.oracle.com/javase/tutorial/java/concepts/interface.html http://csis.pace.edu/~bergin/papers/Interface.html

答案 5 :(得分:0)

不能指定一个抽象方法的主体。抽象方法意味着它们 不完整

我想你需要更多地了解接口和抽象类。

要了解接口抽象类在Java或任何其他面向对象的编程语言中的含义,您应该首先了解继承。

继承

考虑一辆汽车和一辆公共汽车。它们是两种不同的载体。但他们仍然有一些共同的属性,比如他们有转向,刹车,齿轮,引擎等。

因此,继承概念可以表示为以下内容。

public class Vehicle {

    public Driver driver;
    public Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
    //You can define as many properties as you want here..
}

现在是一辆自行车..

public class Bicycle extends Vehicle {

    //You define properties which are unique to bicycles here..
    public Pedal pedal;

}

还有一辆车..

public class Car extends Vehicle {

    public Engine engine;
    public Door[] doors;
}

这就是继承。我们使用它们将对象分类为更简单的Base形式及其子代,如上所述。

抽象类

抽象类是不完整的对象。为了进一步理解,让我们再次考虑车辆类比 可以驾驶车辆。对?但是不同的车辆以不同的方式行驶。例如,你驾驶自行车时不能驾驶汽车 那么如何表示车辆的驱动功能呢?更难以检查它是什么类型的车辆并用它自己的功能驱动它;添加新型车辆时,您必须反复更改Driver类 这里有抽象类和方法的作用。您可以将驱动方法定义为抽象,以告知每个继承子项必须实现此功能 所以,如果你修改车辆类..

//......Code of Vehicle Class
abstract public void Drive();
//.....Code continues

自行车和汽车还必须指定如何驾驶它。否则代码将无法编译并引发错误。

简而言之,抽象类是一个部分不完整的类,其中包含一些不完整的函数,继承的子函数必须指定它们自己的函数。

<强>接口

接口完全不完整。他们没有任何财产。他们只是表明继承的孩子能够做某事......

假设您有不同类型的手机。他们每个人都有不同的方式来做不同的功能;例如:打电话给一个人。手机制造商指定了如何做到这一点。在这里,手机可以拨打一个号码 - 也就是说,它是可拨号的。让我们将其表示为一个界面。

public interface Dialable {
    public void Dial(Number n);
}

Dialable的制造商定义了如何拨打号码。您只需要拨打一个号码即可拨号。

Dialable myPhone1 = new Dialable() {
    public void Dial(Number n) {
        //Do the phone1's own way to dial a number
    }
}

Dialable myPhone2 = new Dialable() {
    public void Dial(Number n) {
        //Do the phone2's own way to dial a number
    }
}

这里通过使用接口而不是抽象类,您不必担心它的属性。例如:它是否有触摸屏或拨号盘,是固定固定电话还是手机。你只需要知道它是否可以被拨打。它是否继承(或实现)Dialable接口。

开发人员通常使用接口来确保对象之间的互操作性,只要它们共享一个共同的功能(就像您可能更改为固定电话或移动电话一样,只需要拨打一个号码)。简而言之,接口是抽象类的简单版本,没有任何属性。

另请注意,您可以根据需要实现(继承)任意数量的接口,但您只能扩展(继承)单个父类。

更多信息

Abstract classes vs Interfaces
Another similar question in Stackoverflow

答案 6 :(得分:0)

如果您只想添加System.out.println()方法的快捷方式, 无需添加abstract关键字。同时将界面更改为类。

public class Printing{   
    public void prt(String print,boolean line){ 
        if(line=true) {   
            System.out.println(print);
        } else {
            System.out.print(print);
        }       
    }   

    public void prt(String print){          
        System.out.print(print);       
    } 
}

但是在这里你首先需要创建一个Printing对象的实例。就像:

Printing p = new Printing();
//Now you may call the functions on p.
p.prt("Without Line Terminator");
p.prt("Also Without Line Terminator",false);
p.prt("With Line Terminator",true);

如果你需要在不实例化的情况下调用函数,就像Printing.prt("sample")而不是Printing p = new Printing(); p.prt("sample")

您需要将prt()方法定义为静态。

public class Printing{   
    public static void prt(String print,boolean line){ 
        if(line=true) {   
            System.out.println(print);
        } else {
            System.out.print(print);
        }       
    }   

    public static void prt(String print){          
        System.out.print(print);       
    }     
}

现在打电话..

//You may call the functions on Printing itself.
Printing.prt("Without Line Terminator");
Printing.prt("Also Without Line Terminator",false);
Printing.prt("With Line Terminator",true);

更多信息
Static Methods
Oracle Javadoc about static classes