Java面向对象(四)

一、面向对象特征(三)---多态

父类引用指向子类的对象,从而产生多种形态
例: Animal dog = new Dog();
同一种事物,在不同的时刻表现不同的状态

前提:二者存在直接或间接的继承关系时,
/*
       //装狗
        public void putDog(Dog dog){
            System.out.println("把狗装进冰箱");
        }
        //装猫
        public void putCat(Cat cat){
            System.out.println("把猫装进冰箱");
        }

        传统方法,不利于程序扩展,每添加一个动物就需要添加一个方法,如果动物多了很麻烦

        //装动物
        public void putAnimal(Animal animal){
            System.out.println("把"+animal+"装进冰箱");
        }
        用父类类型表示任意的子类类型对象,利于程序扩展
    */
父类引用子类的对象,即形成多态
用法:先用父类类型定义子类类型的对象
然后就可以用用父类类型表示任意的子类类型对象
利于程序扩展

对于成员方法:
    Animal dog =new Dog();
    Animal cat = new Cat();
    dog.eat();//编译时调用的是Animal的方法,因为定义的是Animal类
    // 实际运行的时候调用的是dog/cat的方法,因为将Dog/Cat new出来了
    //编译看左边(Animal),运行看右边(new Dog();)
    cat.eat();
    不能调用子类本身有的,但父类没有的方法
对于静态成员方法
全都看左边,只能调用父类的静态成员方法(因为静态不存在重写)

对于成员变量:
只调用父类的成员变量

/*
        虽然多态理由扩展,但也存在问题:
            一旦转为父类类型,就调用不了子类本身特有的方法,只能调用父类的方法
            可以数据转换弥补(向下转型) Dog d = (Dog) dog;
            需要有继承关系
            需要注意的是,在方法中强制转换时,需要注意的时其他子类无法转换成同级子类
            可以在方法中使用if控制语句
            //
            public void putAnimal(Animal animal){
                System.out.println("把"+animal+"装进冰箱");
                animal.eat();//Animal类的方法
                if(animal instanceof Dog){//判断
                    Dog dog=(Dog)animal;//强制转换
                    dog.lookHome();//DOg类的方法
                    }
             }
             //
             instanceof 表示父类类型中持有的实际类型(animal)是否为子类类型(Dog)
             父类与子类类型相同返回true 不同返回false

         */

二、final 关键字

final int a=10;定义常量{属性(成员变量)}、修饰类、方法、参数
final修饰类:不能被定义为抽象类或接口,不能被继承
            例如:java.String类被final修饰,不能被继承
final修饰方法:不能被重写
final修饰参数:初始赋值后不能再被改变
            情况1、在类确定时值就确定,则直接赋值,赋值后值无法改变
                  所以建议用static修饰:final static 数据类型 成员变量
            情况2、在类定义时值不明确,需要在构造方法中对其赋值
                  因为成员变量值不能改变,所以成为常量
                  final int COUNT;
                     public Final(){
                  this.COUNT=10;
                  }
                  public Final(int count){
                     this.COUNT=count;
                  }
常量一般建议全部使用大写字母,多个字母使用下划线(例 MAX_VALUE)

三、接口

接口可以看作一种特殊的抽象类,里面也可以包含抽象方法
接口不能被创建对象,被其它类实现,重写抽象方法
主要也是用来定义功能的
java中的接口如何定义:jdk8之后可以定义常量、抽象方法、静态方法、默认方法
public interface InterfaceDemo {
    int num=10;//常量 public static final int num=10;
    void eat();//默认为public abstract void eat();
    public static void test(){
        //可以直接通过接口名调用
        System.out.println("可以直接通过接口名调用");
    }
    default void test1(){
        //默认方法 被子类继承后调用
    }
}
类通过 implements关键字实现接口,并且将抽象方法重写
类实现接口,要不重写接口的抽象方法,要么定义成抽象类,由他的子类再去实现
public class Class implements InterfaceDemo{

    @Override
    public void eat() {

    }
}
一个接口可以继承多个接口,一个类可以实现多个接口
public interface Interface3 extends Interface,Interface2{
}

默认方法被子类继承使用
public class Demo implements Interface3{
        @Override
        public void eat() {

    }

    @Override
    public void sleep() {

    }

    @Override
    public void test1() {

    }

    public static void main(String[] args) {
        Demo demo=new Demo();
        demo.test1();
    }
}

四、练习

1.按要求编写一个Java应用程序: (1)定义一个接口CanCry,描述会吼叫的方法 void cry(); (2)分别定义狗类(Dog)和猫类(Cat),实现CanCry接口。 实现方法的功能分别为:打印输出“我是狗,我的叫声是汪汪汪”、“我是猫,我的叫声是喵喵喵”。 (3)定义一个主类Test, ①定义一个void makeCry(CanCry c)方法,其中让会吼叫的动物吼叫。 ②在main方法中创建狗类对象(dog)、猫类对象(cat)、Test类对象(t),用t调用makecry方法,让狗和猫吼叫。

//接口 CanCry
package com.wbc.oop.homework.day4;

public interface CanCry {
    void cry();
}
//Dog类
package com.wbc.oop.homework.day4;

public class Dog implements CanCry{
    @Override
    public void cry() {
        System.out.println("我是狗,我的叫声是汪汪汪");
    }
}
//Cat类
package com.wbc.oop.homework.day4;

public class Cat implements CanCry{

    @Override
    public void cry() {
        System.out.println("我是猫,我的叫声是喵喵喵");
    }
}
//Test类
package com.wbc.oop.homework.day4;

public class Test {
    public void makeCry(CanCry c){
        c.cry();
    }

    public static void main(String[] args) {
        CanCry dog = new Dog();
        CanCry cat = new Cat();
        Test t =new Test();
        t.makeCry(dog);
        t.makeCry(cat);
    }
}

2.根据所给类图关系定义类即可

//Interface接口
package com.wbc.oop.homework.day4.TeacherStudent;

public interface Interface {
    void working();
    void rest();
    void show();
}
//Person 类
package com.wbc.oop.homework.day4.TeacherStudent;

public abstract class Person {
    private String name;
    private char sex;
    private int age;

    public Person() {
    }

    public Person(String name, char sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public abstract void saying();
}
//Student类
package com.wbc.oop.homework.day4.TeacherStudent;

public class Student extends Person implements Interface{
    private String id;

    public Student() {
    }

    public Student(String id) {
        this.id = id;
    }

    public Student(String name, char sex, int age, String id) {
        super(name, sex, age);
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public void working() {

    }

    @Override
    public void rest() {

    }

    @Override
    public void show() {

    }

    @Override
    public void saying() {

    }

    public void reading(){

    }
}
//Teacher 类
package com.wbc.oop.homework.day4.TeacherStudent;

public class Teacher extends Person implements Interface{
    private String department;

    public Teacher() {
    }

    public Teacher(String department) {
        this.department = department;
    }

    public Teacher(String name, char sex, int age, String department) {
        super(name, sex, age);
        this.department = department;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    @Override
    public void working() {

    }

    @Override
    public void rest() {

    }

    @Override
    public void show() {

    }

    @Override
    public void saying() {

    }

    public void teaching(){

    }
}

3.设计一个英雄抽象类, 类中属性:姓名,性别 类中有各种攻击的抽象方法例如: 出拳,脚踢...(自己发挥)

 再设计出多个具体英雄子类(自己想象)继承英雄类,重写抽象方法
  
 再设计出一个游戏类供玩家使用,该类可以提供方法启动游戏
 启动后可以输入序号选择英雄人物,
 选择人物后开始游戏, 可以在控制台输入序号(序号个数与英雄类中定义的方法对应)调用英雄具体攻击方法
 
//Hero 类
package com.wbc.oop.homework.day4.Hero;

public abstract class Hero {
    private String name;
    private String gender;

    public Hero() {
    }

    public Hero(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public abstract void throwPunch();//出拳
    public abstract void shoot();//开枪
    public abstract void retreat();//撤退
    public abstract void toBeHurt(String name);
}
//Scout类
package com.wbc.oop.homework.day4.Hero;

public class Scout extends Hero{
    //侦察兵

    private String career;
    private int health;//生命值
    private int defenseValue;//防御力

    public Scout(String name, String gender) {
        super(name, gender);
        health = 100;
        defenseValue = 30;
        career ="侦察兵";
    }

    @Override
    public void throwPunch() {
        System.out.println(getName()+"出拳");
    }

    @Override
    public void shoot() {
        System.out.println(getName()+"开枪");
    }

    @Override
    public void retreat() {
        System.out.println(getName()+"撤退");
    }

    public int getHealth() {
        return health;
    }

    public int getDefenseValue() {
        return defenseValue;
    }

    public void toBeHurt(String name){
        System.out.println(name+"伤害了"+getName());
        health=getHealth()-30;
        defenseValue=getDefenseValue()-10;
        if(getDefenseValue()<=0){
            health-=10;
            defenseValue=0;
        }
        if(health<=0){
            System.out.println(career+getName()+"死了");
            health=0;

        }
        else{
            System.out.println(career+getName()+"被伤害了,生命力:"+getHealth()+"防御力:"+getDefenseValue());
        }

    }

}
//Tank类
package com.wbc.oop.homework.day4.Hero;

public class Tank extends Hero{
    private String career;
    private int health;//生命值
    private int defenseValue;//防御力

    public Tank(String name, String gender) {
        super(name, gender);
        health = 100;
        defenseValue = 100;
        career ="坦克";
    }

    @Override
    public void throwPunch() {
        System.out.println(getName()+"撞过去了");
    }

    @Override
    public void shoot() {
        System.out.println(getName()+"开炮");
    }

    @Override
    public void retreat() {
        System.out.println(getName()+"撤退");
    }

    public int getHealth() {
        return health;
    }

    public int getDefenseValue() {
        return defenseValue;
    }

    public void toBeHurt(String name){
        System.out.println(name+"伤害了"+getName());
        health=getHealth()-15;
        defenseValue=getDefenseValue()-20;
        if(getDefenseValue()<=0){
            health-=10;
            defenseValue=0;
        }
        if(health<=0){
            System.out.println(career+getName()+"炸毁了");
            health=0;

        }
        else{
            System.out.println(career+getName()+"被伤害了,生命力:"+getHealth()+"防御力:"+getDefenseValue());
        }

    }
}
//StartGame类
package com.wbc.oop.homework.day4.Hero;
import java.util.Scanner;
public class StartGame {



    public void startGame() {
        System.out.println("欢迎进入游戏!请选择您的英雄角色:");
        System.out.println("1. 侦察兵");
        System.out.println("2. 坦克");

        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        Hero hero = null;

        switch (choice) {
            case 1:
                hero = new Scout("Jack", "男");
                break;
            case 2:
                hero = new Tank("虎式坦克", null);
                break;
            default:
                System.out.println("请选择正确的英雄角色!");
                return;
        }
        Hero enemy=null;
        System.out.println("您选择了 " + hero.getName() + ",开始游戏!");
        if(hero instanceof Scout){
            enemy = new Tank("虎式坦克", null);
        }
        else if(hero instanceof Tank){
            enemy = new Scout("Jack", "男");
        }

        while (true) {
            System.out.println("请选择您要执行的操作:");
            System.out.println("1. 近身攻击");
            System.out.println("2. shoot");
            System.out.println("3. 撤退");
            System.out.println("4. 被攻击");

            int action = scanner.nextInt();

            switch (action) {
                case 1:
                    hero.throwPunch();
                    break;
                case 2:
                    hero.shoot();

                    break;
                case 3:
                    hero.retreat();
                    break;
                case 4:
                    if(hero instanceof Scout){
                        hero = (Scout) hero;
                        hero.toBeHurt(enemy.getName());
                    }
                    else if(hero instanceof Tank){
                        hero=(Tank)hero;
                        hero.toBeHurt(enemy.getName());
                    }
                default:
                    System.out.println("请输入正确的操作!");
                    break;
            }
        }
    }
}
//Test类
package com.wbc.oop.homework.day4.Hero;

public class Test {
    public static void main(String[] args) {
        StartGame game1 =new StartGame();
        game1.startGame();
    }
}

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京最后的深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值