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();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSH tunneling 简明示例

基本概念 SSH tunneling又称为SSH port forwarding。 如果想快速了解其应用场景&#xff0c;这篇文章A short guide to SSH port forwarding 很不错。其详细解释了Client to Server的Local Forwarding。虽然没有涉及Server to Client的Remote Forwarding&#xff0c;但他也指…

高盛:日本这轮通胀是否可持续,关键看房租

租金在日本CPI中的权重高达20%&#xff0c;高盛预计短期内租金将继续拖累通胀至1.7%或以下&#xff0c;长期有望温和上行&#xff0c;使通胀稳在2%的水平。 日本正在转向“去通缩”&#xff0c;房租能否支撑通胀态势&#xff1f; 在日股今年一路高歌、有望“收复失地”时&…

STM32 4位数码管和74HC595

4位数码管 在使用一位数码管的时候&#xff0c;会用到8个IO口&#xff0c;那如果使用4位数码管&#xff0c;难道要使用32个IO口吗&#xff1f;肯定是不行的&#xff0c;太浪费了IO口了。把四个数码管全部接一起共用8个IO口&#xff0c;然后分别给他们一个片选。所以4位数码管共…

想高薪就业鸿蒙HarmonyOS 开发岗位,到底该学习些啥?

鸿蒙是什么&#xff1f; 经过十多年的发展&#xff0c;传统移动互联网的增长红利已渐见顶。万物互联时代正在开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿 IoT 设备。GSMA 预测到 2025 年&#xff0c;全球物联网终端连接数量将达 246 亿个&#xff0c;其中消费物…

Nginx网络服务三-----(三方模块和内置变量)

1.验证模块 需要输入用户名和密码 我们要用htpasswd这个命令&#xff0c;先安装一下httpd 生成文件和用户 修改文件 访问页面 为什么找不到页面&#xff1f; 对应的路径下&#xff0c;没有这个文件 去创建文件 去虚拟机浏览器查看 有的页面不想被别人看到&#xff0c;可以做…

电脑蓝牙在哪里打开?1分钟轻松打开蓝牙!

“我在操作电脑的时候想将电脑的蓝牙打开来连接音响和键盘&#xff0c;但是不知道电脑蓝牙应该如何打开&#xff0c;有什么比较简单的方法吗&#xff1f;” 随着无线技术的日益发展&#xff0c;蓝牙已成为连接各种设备的重要桥梁。无论是传输文件、音频还是与外部设备进行通信&…

mysql优化指南之原理篇

之前碰到一个线上问题&#xff0c;在接手一个同事的项目后&#xff0c;因为工期比较赶&#xff0c;我还没来得及了解业务背景和大致实现&#xff0c;只是了解了上线发布的顺序和验证方式就进行了上线&#xff0c;在上线进行金丝雀的时候系统还没发生什么异常&#xff0c;于是我…

独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?

简介&#xff1a; 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构&#xff0c;从原理上讲明白两者的优劣之处&#xff0c;同时会附上一份覆盖多场景的测试报告给读者作为参考。 作者&#xff1a;阿里云数据库OLAP产品部 仁劼 原文地址:https://developer.ali…

【鸿蒙 HarmonyOS 4.0】路由router

一、介绍 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。 二、页面跳转 2.1、两种跳转模式&#xff1a; router.pushUrl()&…

为全志D1开发板移植LVGL日历控件和显示天气

利用TCP封装HTTP包请求天气信息 Linux还真是逐步熟悉中&#xff0c;现在才了解到Linux即没有原生的GUI&#xff0c;也没有应用层协议栈&#xff0c;所以要实现HTTP应用&#xff0c;必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包&#xff0c;到心知天气请求天气…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion&#xff08;own&#xff09;/ Future wo…

JS基础之JSON对象

JS基础之JSON对象 目录 JS基础之JSON对象对象转JSON字符串JSON转JS对象 对象转JSON字符串 JSON.stringify(value,replacer,space) value:要转换的JS对象 replacer:(可选)用于过滤和转换结果的函数或数组 space:(可选)指定缩进量 // 创建JS对象 let date {name:"张三…

UE蓝图 返回结果(FunctionResult)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 文章目录 系列文章目录一、FunctionResult节点功能二、FunctionResult节点…

利用数字人技术“活”化吉祥物,打造“科技+”数融盛会

在第十四届全国冬季运动会上&#xff0c;吉祥物“蒙古彩娃”安达和塞努不再同于往常静态的吉祥物形象&#xff0c;而是升级为生动活泼、能够与观众实时互动的数字人形象&#xff0c;活跃于赛事宣传、场馆介绍等多个场景&#xff0c;为本届冰雪盛会注入数字活力&#xff0c;提升…

【SQL注入】靶场SQLI DUMB SERIES-26空格和注释被过滤

26题提示所有的空格和注释都会被过滤掉 输入?id0判断闭合方式&#xff0c;回显报错可以确定闭合方式为单引号 正常思路是需要通过注释符将后面的语句注释掉&#xff0c;但是这一关的注释符被过滤了&#xff0c;可以考虑使用将后面的语句也闭合的思路来避免引号带来的报错。输…

【2024软件测试面试必会技能】Postman(1): postman的介绍和安装

Postman的介绍 Postman 是一款谷歌开发的接口测试工具,使API的调试与测试更加便捷。 它提供功能强大的 Web API & HTTP 请求调试。它能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT..)&#xff0c;附带任何数量的参数 headers。 postman是一款支持http协议的接口调试…

获取 Windows 系统托盘图标信息的最新方案(三)

目录 前言 一、实现 CallWndProcHook 二、安装钩子例程 三、创建消息处理窗口 四、完整代码和注意事项 五、总结&更新 文章出处链接:[https://blog.csdn.net/qq_59075481/article/details/136240462] 前言 在《获取 Windows 系统托盘图标信息的最新方案&#xff08…

“目标检测”任务基础认识

“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的&#xff1a;检测在一个窗口中是否有物体。 eg:以猫脸检测举例&#xff0c;当给出一张图片时&#xff0c;我们需要框出猫脸的位置并给出猫脸的大小&#xff0c;如…

MySQL|MySQL基础(求知讲堂-学习笔记【详】)

MySQL基础 目录 MySQL基础一、 MySQL的结构二、 管理数据库1&#xff09;查询所有的数据库2&#xff09;创建数据库3&#xff09;修改数据库的字符编码4&#xff09;删除数据库5&#xff09;切换操作的数据库 三、表的概念四、字段的数据类型4.1 整型4.2 浮点型(float和double)…

MongoDB的介绍和使用

目录 一、MongoDB介绍 二、MongoDB相关概念 三、MongoDB的下载和安装 四、SpringBoot 整合 MongoDB 一、MongoDB介绍 MongoDB是一种NoSQL数据库管理系统&#xff0c;采用面向文档的数据库模型。它以C语言编写&#xff0c;旨在满足大规模数据存储和高性能读写操作的需求。Mo…