Java-如何正确使用Extends/Implements

Java-如何正确使用Extends/Implements,java,lwjgl,extends,slick2d,implements,Java,Lwjgl,Extends,Slick2d,Implements,好吧,我对extends和implements的用法有些困惑。让我给出一个场景,假设我正在制作一个简单的塔防游戏。所以我的理解是,如果我创建了一个TowerBase.java类,我可以用变量和方法填充它,比如;智力生命,智力伤害,智力攻击{…},等等。。。。我想我可以制作许多类型的塔,比如说一个是archer塔,在toweracher.java中,我想将TowerBase的变量设置为所述塔的唯一值。我的理解是,在TowerAccess内部,如果我扩展TowerBase,我可以访问TowerBas

好吧,我对extends和implements的用法有些困惑。让我给出一个场景,假设我正在制作一个简单的塔防游戏。所以我的理解是,如果我创建了一个TowerBase.java类,我可以用变量和方法填充它,比如;智力生命,智力伤害,智力攻击{…},等等。。。。我想我可以制作许多类型的塔,比如说一个是archer塔,在toweracher.java中,我想将TowerBase的变量设置为所述塔的唯一值。我的理解是,在TowerAccess内部,如果我扩展TowerBase,我可以访问TowerBase的所有变量和方法,因为TowerBase现在是父级。所以我试了一下:

public class TowerBase {
    //Health (Range: 1-100)
    int hp;

    public int attack(int blah){
        //Blah blah how the tower goes about attacking foe
    }
然后在toweracher.java中

public class TowerArcher extends TowerBase{
    //Set TowerArcher's unique values
    hp = 10;
}
现在在游戏的某个地方

TowerArcher archer;
archer.attack(blah);

Eclipse在hp=10;的toweracher.java中抛出此语法错误:此标记后应为VarableDeclaratorId。我猜它是在说它不知道惠普是什么。这让我很困惑,因为我以为它会知道hp是什么,因为它在父类中。我已经找到了一些解决方法,但它们似乎没有那么有效,即使它们有效,它们仍然让我困惑于extends和implements的真正用途。基本上,我想在这里找到的是;1:extends做什么2:我如何在我的程序中直观地使用extends 3:implements做什么4:我如何在我的程序中直观地使用implements 5:在这种情况下我应该使用什么,在这种情况下,我有许多不同的对象在做几乎相同的事情,也许TowerArcher TowerBunker TowerSnipernest TowerBarricade等。我知道我要求很多,但我找不到一个好的帖子,所以这也可以帮助其他人:P.S.如果我缺少任何需要的信息,请让我知道。在这一点上我是如此的无知。

您的问题与扩展和实现之间的差异无关。你似乎对继承是如何工作的有很好的理解,或者至少你所说的没有错。你只是把语法搞乱了。您需要在构造函数中设置hp:

public class TowerArcher extends TowerBase {
    // Can't set hp here; the syntax just doesn't work that way.
    // hp = 10;

    public TowerArcher() {
        // Initialize it here, instead.
        // This runs when you construct a TowerArcher.
        hp = 10;
    }
}
回答你的问题

extends用于扩展一个类或将接口扩展到另一个接口。在java中只能扩展一个类。当A扩展B时,A继承了B的行为

Toweracher延伸了TowerBase

implements用于实现接口。您可以在java中为一个类实现多个接口。您必须重写类中接口中的所有方法签名

将抽象类型的方法放入接口中,并将其实现到类中

创建抽象类或接口作为基类,并将常见行为放在那里


在您的示例代码中,您试图在类主体中设置变量值——这是无效的,因为除了字段初始化之外,类主体的直接内容永远不会执行。您必须将代码放在某个方法中,例如放在构造函数中

public class TowerArcher extends TowerBase{
    public TowerArcher() {
        super(); //set values as in TowerBase constructor
        hp = 10; //archers don't wear armor, so they have low HP.
    }
}
extends只是将指定父类的形式用于子类的字段,并作为方法的基础,这些方法可以,但不必被重写。在超级类中设置为public或protected但非private的字段在扩展对象中可访问,超级类是类的正式名称,位于extends关键字之后

在您的程序中,您正确地使用了扩展。新类型的塔楼将带来新的等级,这将扩展TowerBase

请注意,extends关键字只能使用一个类作为父类

实现接口,因为您可以实现更多接口。在理论基础上,接口类似于超类,但它们通常只持有一个属性,并使用它进行操作。在您的程序中,您可以创建iFlow或iStonThrowing接口,这些接口将只管理混凝土塔的一个属性。例如,弓箭手不能投掷石头,但他们可以发射射箭


你有很多不同的塔,所以创建一个结构,它将所有提到的塔和属性分开。然后实施它。若你们想让玩家在游戏中升级他的塔,比如学习他的弓箭手如何投掷石头,那个么使用装饰图案

谢谢你,我想知道会不会是那样的小混乱。你是个救生员!这里有一个。谢谢你,看起来会很有帮助的!非常感谢,这更有意义。谢谢,你的界面解释真的很有帮助!
public class TowerArcher extends TowerBase{
    public TowerArcher() {
        super(); //set values as in TowerBase constructor
        hp = 10; //archers don't wear armor, so they have low HP.
    }
}