Java学习笔记 - 第010天

每日要点

继承

继承 : 从已有的类创建新类的过程就是继承
提供继承信息的称为父类
得到继承信息的称为子类
extends - 扩展(子类除了父类的特性之外还有扩充自己特有的东西)
例子:实现Person类,派生出Student、Teacher
Person类:

public class Person {
    // protected - 对子类相当于公开,对其他类相当于私有
    protected String name;
    protected int age;
    
    public Person(String name, int age) {
        this.age = age;
        this.name = name;
    }
    
    public void eat() {
        System.out.println(name + "正在吃饭.");
    }
    
    public void play(String gameName) {
        System.out.println(name + "正在玩" +gameName);
    }
    
    public void watchAV() {
        if (age >= 18) {
            System.out.println(name + "正在观看岛国动作片.");
        }
        else {
            System.out.println(name + "年龄未满18岁不能看.");
        }
    }
}

学生类:

public class Student extends Person{
    private String classCode;
    
    public Student(String name, int age) {
        super(name, age);
    }
    
    public void study(String courseName) {
        System.out.println(name + "正在" + classCode + "班学习" + courseName + ".");
    }
    
    public void setClassCode(String classCode) {
        this.classCode = classCode;
    }
}

老师类:

public class Teacher extends Person{
    private String title;
    
    public Teacher(String name, int age, String title) {
        super(name, age);
        this.title = title;
    }
    
    public void teach(String courseName) {
        System.out.println(name + title +"正在教" + courseName + ".");
    }
}

测试类:

public class Test01 {
    public static void main(String[] args) {
        // 子类跟父类之间是一种is-a关系
        // 把子类对象赋值给父类变量没有任何问题
        Person stu1 = new Student("王大锤", 15);
        Person stu2 = new Student("王尼玛", 13);
        Person teacher = new Teacher("爱迪生", 36, "叫兽");
        ((Student) stu2).setClassCode("JavaEE 1601");
        stu1.eat();
        stu1.play("LOL");
        stu2.watchAV();
        ((Student) stu2).study("Java");
        teacher.eat();
        teacher.play("斗地主");
        teacher.watchAV();
        ((Teacher) teacher).teach("JavaEE企业级开发");
        // 类型转换异常
//      ((Teacher) stu1).teach("高等数学");
    }
}

protected

protected - 对子类相当于公开,对其他类相当于私有

子类和父类

子类跟父类之间是一种is-a关系
把子类对象赋值给父类变量没有任何问题

类型转换异常
((Teacher) stu1).teach("高等数学");

花括号

一对花括号就构成了一个作用域(scope)
在某个作用域中定义的变量只在该作用域生效

昨天作业讲解

  • **1.Craps赌博游戏 - 面向对象 **
    **两颗色子 - **
    第一次:
    玩家摇出 7 和11 玩家胜 2 3 或12 庄家胜 其他点数 游戏继续
    玩家再摇
    如果摇出7点 庄家胜 如果摇出了第一次的点数 玩家胜 其他情况 游戏继续

骰子类:

/**
 * 色子
 * @author Kygo
 *
 */
public class Dice {
    private int face;
    
    /**
     * 摇色子
     */
    public void roll() {
        face = (int) (Math.random() * 6 + 1);
    }
    
    /**
     * 获取色子点数
     * @return 点数
     */
    public int getFace() {
        return face;
    }
}

玩家类:

/**
 * 玩家
 * @author Kygo
 *
 */
public class Player {
    private String name;
    private int money;
    private int bet;
    
    /**
     * 构造器:默认玩家有1000元资产
     * @param name 玩家姓名
     */
    public Player(String name) {
        this(name, 1000);
    }
    
    /**
     * 构造器
     * @param name 玩家姓名
     * @param money 玩家资产
     */
    public Player(String name, int money) {
        this.name = name;
        this.money = money;
    }
    
    /**
     * 获取玩家姓名
     * @return 玩家姓名
     */
    public String getName() {
        return name;
    }
    
    /**
     * 获取玩家资产
     * @return 玩家资产
     */
    public int getMoney() {
        return money;
    }
    
    /**
     * 设置赌注
     * @param bet 赌注金额
     */
    public void setBet(int bet) {
        this.bet = bet;
    }
    
    /**
     * 赢
     */
    public void win() {
        money += bet;
    }
    
    /**
     * 输
     */
    public void lose() {
        money -= bet;
    }
}

Craps游戏类:

/**
 * Craps游戏
 * @author Kygo
 *
 */
public class CrapsGame {
    private Dice dice1 = new Dice();        // 色子1
    private Dice dice2 = new Dice();        // 色子2
    private Player player;                      // 游戏玩家
    private boolean firstRoll;                  // 是不是第一次摇色子
    private boolean roundOver;          // 当前轮次是否结束
    private int firstPoint;                     // 第一次摇出的点数
    private String info;                            // 游戏提示信息
    
    public CrapsGame() {
        this.reset();
    }
    
    /**
     * 摇两颗色子
     */
    public void rollTwoDice() {
        dice1.roll();
        dice2.roll();
        int currentPoint = dice1.getFace() + dice2.getFace();
        info = "玩家摇出了" + currentPoint + "点.";
        if (firstRoll) {
            switch (currentPoint) {
            case 7: case 11:
                info += "玩家胜!";
                player.win();
                roundOver = true;
                break;
            case 2: case 3: case 12:
                info += "庄家胜!";
                player.lose();
                roundOver = true;
                break;
            default:
                firstPoint = currentPoint;
                firstRoll = false;
            }
        }
        else {
            if (currentPoint == firstPoint) {
                info += "玩家胜!";
                player.win();
                roundOver = true;
            }
            else if (currentPoint == 7) {
                info += "庄家胜!";
                player.lose();
                roundOver = true;
            }
        }
    }
    
    /**
     * 获取当前轮次是否分出胜负
     * @return 分出胜负返回true否则返回false
     */
    public boolean isRoundOver() {
        return roundOver;
    }
    
    /**
     * 重置游戏
     */
    public void reset() {
        firstRoll = true;
        roundOver = false;
    }
    
    /**
     * 获取游戏提示信息
     * @return 提示信息
     */
    public String getInfo() {
        return info;
    }
    
    /**
     * 设置游戏玩家
     * @param player 玩家对象
     */
    public void setPlayer(Player player) {
        this.player = player;
    }
}

测试游戏类:

public class CrapsGameRunner {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // 创建游戏对象
        CrapsGame game = new CrapsGame();
        // 创建玩家对象
        Player player = new Player("王大锤");
        // 设置游戏玩家
        game.setPlayer(player);
        do {
            // 显示玩家资产
            System.out.println(player.getName() + "的总资产为: ¥" + player.getMoney() + "元.");
            // 下注
            int bet;
            do {
                System.out.print("请下注: ");
                bet = input.nextInt();
            } while (bet <= 0 || bet > player.getMoney());
            player.setBet(bet);
            // 开始摇色子
            while (!game.isRoundOver()) {
                game.rollTwoDice();
                System.out.println(game.getInfo());
            }
            // 一轮游戏结束后重置游戏
            game.reset();
        } while (player.getMoney() > 0);
        // 玩家钱输光了游戏结束
        System.out.println(player.getName() + "已经破产. 游戏结束!");
        input.close();
    }
}
  • 2.设计ATM - 面向对象
    银行账户类:
/**
 * 银行账户
 * @author Kygo
 *
 */
public class Account {
    private String id;
    private String password;
    private double balance;
    
    /**
     * 构造器
     * @param id 账户ID
     * @param password 初始密码
     * @param blance 初始余额
     */
    public Account(String id, String password, double blance) {
        this.id = id;
        this.password = password;
        this.balance = blance;
    }
    
    /**
     * 验证身份是否有效
     * @param password 密码
     * @return 密码匹配返回true否则返回false
     */
    public boolean isValid(String password) {
        return this.password.equals(password);
    }
    
    /**
     * 存钱
     * @param money 存款金额
     */
    public void deposit(double money) {
        balance += money;
    }
    
    /**
     * 取款
     * @param money 取款金额
     * @return 取款成功返回true,余额不足返回false
     */
    public boolean withdraw(double money) {
        if (money <= balance) {
            balance -= money;
            return true;
        }
        return false;
    }
    
    /**
     * 获得账号
     * @return 账号
     */
    public String getId() {
        return id;
    }
    
    /**
     * 查询余额
     * @return 余额
     */
    public double getBalance() {
        return balance;
    }
    
    /**
     * 设置密码
     * @param password 密码
     */
    public void setPassword(String password) {
        this.password = password;
    }
}

ATM类:

/**
 * 自动柜员机
 * @author Kygo
 *
 */
public class ATM {
    private Account currentAccount;
    
    // 用一个数组来模拟银行的数据库系统 预先保存若干个银行账户
    private Account[] accountArray = {
        new Account("11223344", "123123", 1200),
        new Account("22334455", "123456", 50),
        new Account("33445566", "888888", 9999999)
    };
    
    /**
     * 读卡
     * @param id 银行账户ID
     * @return 读卡成功返回true否则返回false
     */
    public boolean readCard(String id) {
        for (Account account : accountArray) {
            if (account.getId().equals(id)) {
                currentAccount = account;
                return true;
            }
        }
        return false;
    }
    
    /**
     * 验证身份
     * @param password 密码
     * @return 验证通过返回true否则返回false
     */
    public boolean verify(String password) {
        if (currentAccount != null) {
            return currentAccount.isValid(password);
        }
        return false;
    }
    
    /**
     * 查询余额
     * @return 当前账号余额
     */
    public double showBalance() {
        return currentAccount.getBalance();
    }
    
    /**
     * 存钱
     * @param money 存入金额
     */
    public void deposit(int money) {
        currentAccount.deposit(money);
    }
    
    /**
     * 取钱
     * @param money 取款金额
     * @return 取款成功返回ture否则返回false
     */
    public boolean withdraw(int money) {
        return currentAccount.withdraw(money);
    }
    
    /**
     * 修改密码
     * @param newPassword 新密码
     */
    public void changePassword(String newPassword) {
        currentAccount.setPassword(newPassword);
    }
    
    /**
     * 取卡
     */
    public void quitCard() {
        currentAccount = null;
    }
    
    /**
     * 转账
     * @param otherId 转入账号
     * @param money 转账金额
     * @return 转账成功返回true否则返回false
     */
    public boolean transfer(String otherId, double  money) {
        for (Account account : accountArray) {
            if (account.getId().equals(otherId)) {
                Account otherAccount = account;
//              if (currentAccount.getBalance() >= money) {
                if (currentAccount.withdraw(money)) {           
                    otherAccount.deposit(money);
                    return true;
                }
                else {
                    return false;
                }
            }
        }
        return false;
    }
}

测试类:

public class ATMTest {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in); 
        ATM atm = new ATM();
        boolean isRunning = true;
        while(isRunning) {
            System.out.println("欢迎使用中国贱人银行ATM机.");
            System.out.print("请插入银行卡: ");
            String id = input.next();
            if (atm.readCard(id)) {
                int counter = 0;
                boolean isCorrect = false;
                do {
                    counter += 1;
                    System.out.print("请输入密码: ");
                    String password = input.next();
                    isCorrect = atm.verify(password);
                } while (counter < 3 && !isCorrect);
                if (isCorrect) {
                    boolean flag = true;
                    while (flag) {
                        System.out.println("1.查询余额");
                        System.out.println("2.存款");
                        System.out.println("3.取款");
                        System.out.println("4.转账");
                        System.out.println("5.修改密码");
                        System.out.println("6.退卡");
                        int choice;
                        do {
                            System.out.print("请选择: ");
                            choice = input.nextInt();
                        } while (choice < 1 || choice >6);
                        switch (choice) {
                        case 1:
                            System.out.println("账户余额: " + atm.showBalance());
                            break;
                        case 2: {
                            // 一对花括号就构成了一个作用域(scope)
                            // 在某个作用域中定义的变量只在该作用域生效
                            System.out.print("请放入钞票: ");
                            int money = input.nextInt();
                            atm.deposit(money);
                            System.out.println("存款成功!");
                            break;
                        }
                        case 3: {
                            System.out.print("请输入或选择取款金额: ");
                            int  money = input.nextInt();
                            if (atm.withdraw(money)) {
                                System.out.println("请取走你的钞票.");
                            }
                            else {
                                System.out.println("余额不足!");
                            }
                            break;
                        }
                        case 4: {
                            System.out.print("请输入转入账号: ");
                            String otherId = input.next();
                            System.out.print("请输入转账金额: ");
                            double money = input.nextDouble();
                            if (atm.transfer(otherId, money)) {
                                System.out.println("转账成功!");
                            }
                            else {
                                System.out.println("转账失败,请检查转入账号和账户余额是否正确.");
                            }
                            break;
                        }
                        case 5:
                            System.out.print("请输入新密码: ");
                            String newPwd = input.next();
                            System.out.print("请再输入一次: ");
                            String rePwd = input.next();
                            if (newPwd.equals(rePwd)) {
                                atm.changePassword(newPwd);
                                System.out.println("密码已修改.");
                            }
                            else {
                                System.out.println("两次密码不一致.");
                            }
                            break;
                        case 6:
                            System.out.println("请取走你的卡.");
                            flag = false;
                            break;
                        }
                    }
                }
                else {
                    System.out.println("输入密码错误次数超过3次,你的卡已经被回收.");
                }
            }
        }
        input.close();
    }
}

作业

  • 1.描述宠物 使用继承 派生出猫、狗之类的
    宠物类:
public class Pet {
    protected String name;
    protected boolean isAdult;
    protected String variety;
    
    public Pet(String name,String variety, boolean isAdult) {
        this.name = name;
        this.variety = variety;
        this.isAdult = isAdult;
    }
    public void sleep() {
        System.out.println("宠物" + name + "在睡觉.");
    }
    
    public void eat() {
        System.out.println("宠物" + name + "在吃东西.");
    }
    
    public void mating() {
        if (isAdult) {
            System.out.println("宠物" + name + "正在交配.");
        }
        else {
            System.out.println("宠物" + name + "还未成年.");
        }
    }
}

猫类:

public class Cat extends Pet {
    private String yell;
    
    public Cat(String name, String variety, boolean isAdult, String yell) {
        super(name, variety,isAdult);
        this.yell = yell;
    }
    
    public void catchMouse() {
        System.out.println(variety + name + "在抓老鼠.");
    }
    
    public void purr() {
        System.out.println(variety + name + "在叫: " + yell);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 一. Java基础部分.................................................
    wy_sure阅读 3,731评论 0 11
  • 每日要点 面向对象的四大支柱 抽象 - 定义一个类的过程就是一个抽象的过程(数据抽象、行为抽象),通过抽象我们可以...
    迷茫o阅读 356评论 0 0
  • 我是一个生来就害怕孤独的人,原以为不是这样,但是后来逐渐的佐证了,在不思考的时候偶然会听着音乐作伴安静。 ...
    月儿湾阅读 304评论 0 0