我正在尝试创建一个可以作为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);
}
}
答案 0 :(得分:3)
interface
中声明的方法会自动public
和abstract
。所以你可以从抛弃这两个修饰语开始。
根据定义,抽象方法没有正文......所以也许接口不是你在这里寻找的。 p>
如果您不希望能够实例化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);