JavaOOP学习(第六天)

首先,我没想到我连标题都能打错,真是不好意思。本人以后会多加注意这些问题(话说健忘这种问题怎么可能解决啊喂 [○・`Д´・ ○] )。前两天双休日,所以为什么没有更新大家懂的都懂,不懂得也不给你说,哼╭(╯^╰)╮。

直接上今天的笔记:

抽象与接口:
抽象类(abstract class):
1.抽象类针对的是类,接口针对的是行为(方法)
2.当对于对象描述模糊时,他的类便可以定义为抽象类
3.抽象类中可以没有抽象方法,但有抽象方法的一定是抽象类。
4.如果一个类继承了一个抽象类,那么他就要去实现这个抽象类中的抽象方法。
5.如果一个类继承了一个抽象类,但并没有实现他的抽象方法,那么这个类也一定是抽象类。
6.抽象类不能实例化,只能指向子类
7.当一个对象引用子类时,无法直接获取子类中的set与get时可以通过有参构造方法进行赋值。
接口(interface):
1.接口是标准和规范
2.接口中包含未实现的方法和常量
3.接口只能被public修饰
4.因为接口是一种规范,所以任何类想要实现接口,必须实现接口中的方法遵循规范。
5.接口不能实例化。
6.接口可以继承接口而且可以多继承,其他类实现接口也可以多实现。

一到了面向对象的学习阶段,任务凸的一下就重了起来,原本一个包就可以解决的问题,现在竟然要10个包o(╥﹏╥)o。不信?,不信有图:

一天的练习让我对这一章节印象十分深刻,难以磨灭。我永远不会忘了,我和室友鏖战到12点,我都不知道明天自己在课上是否会眼皮打架 (T _T)。

这些面向对象的题解法不难但是其中的类与接口过于繁杂,反正肯定不能像以前一样一个类的代码直接 c+v了,所以从今天起这类型的题会调几道我觉得比较有代表性的题进行展示,这些题可能少也可能多,这个量由我发博客的时间决定(再哭一次),毕竟不能耽搁了正事嘛~,这些题我会分享一些思路,希望能帮到因为被困在这些抽象概念,所以来CSDN加强学习的小伙伴。

1.

按如下要求编写Java应用程序:

(1)编写一个用于表示战斗能力的接口Fightable,该接口包含:整型常量MAX;方法void win(),用于描述战斗者获胜后的行为;方法int injure(int x),用于描述战斗者受伤后的行为。

(2)编写一个非抽象的战士类Warrior,实现接口Fightable。该类中包含两个整型变量:经验值experience和血液值blood。当战士获胜后经验值会增加,而受伤后血液值会减少x,并且当战斗者的血液值低于MAX时会输出危险提示。

(3)编写战士类Warrior的子类BloodWarrior,该类创建的战士在血液值低于MAX/2时才会输出危险提示。

(4)编写主类TestWarrior,对上述接口和类进行测试。

 先分析题目

题中有明显诉求,第一点要求:接口(Fightable)*1,常量*(MAX)1,未实现方法*2(win方法,injure方法)有第一条我们可以得出一下的代码:

package java_1213_nine;

public interface Fightable {
    int MAX=20;
    void win();
    int injure(int x);
}

 做完以上操作后我们往下继续看 非抽象类*1(Warrior) 变量*2(experience,blood) 以及实现接口并实现方法*2,得出以下代码:

package java_1213_nine;

public class Warrior implements Fightable{
    int experience;
    int blood=100;
    @Override
    public void win() {
        experience++;
    }

    @Override
    public int injure(int x) {
        return blood-=x;
    }

}

以上方法中的逻辑代码以及返回值全都可以根据题目中的要求得出。

接下来,子类*1(BloodWarrior) 以及一个自己独有的方法(危险提示),得出以下代码:

package java_1213_nine;

public class BloodWarrior extends Warrior{
    void hint(){
        if(blood<(MAX/2)) System.out.println("危险!");
    }
}

在子类独有的方法中加入逻辑使其具有功能性。

最后来到Tset类进行测试:

package java_1213_nine;

public class TestWarrior {
    public static void main(String[] args) {
            BloodWarrior b=new BloodWarrior();
        while (b.blood>1){
        int num=(int)Math.floor(Math.random()*10);
        if (num>5){
            b.win();
            System.out.println("你赢了!你现在有:"+b.experience+"经验值");
        }else{
            b.injure(2);
            System.out.println("你输了!现在还有:"+b.blood+"血量~~~~~~~~~~~~~~~~");
        };
        b.hint();
        }
        System.out.println("你已去世");
    }
}

其中简单的逻辑不在赘述,在这个只调用子类是因为父类无法实现子类中的方法,因为前边要求父类是个非抽象类,所以在这里只能调用子类。

走完上边的流程会得到如下的执行过程:

因为本人设置一次只掉2滴血,所以结果很长,大概有这么长长长长。开个玩笑,这个题目主要体现的是接口的规范性以及继承的复用性以及简洁性,子类与父类同用方法与变量,却只定义一次就行 这就省了很多麻烦了。

时间不早了,今天的文章应该就到这里结束了,希望可以通过这些笔记和我的思路能够帮助更多需要帮助的人。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值