封装与继承

一.封装

封装的定义

面对对象三大特征之一(封装,继承,多态)
隐藏实现细节,仅对外暴露公共的访问方式

封装常见的体现

a.私有(private)成员变量,提供set和get方法
如果有构造方法,则在构造器中调用setter保证封装的安全性
b.将代码抽渠取到方法中,这是对代码的一种封装
c.将属性抽取到类中,这是对数据的一种封装

练习

  • 用封装实现企鹅类

无构造方法的封装

public class Penguin {
    private String name;
    private int health;
    private int love;
    private String sex;
    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }
    public int getHealth() { return health; }
    public void setHealth(int health) {
        if (health < 0 || health > 100) {
            System.out.println("健康值的有效性在0-100间,否则取默认值60");
            health=60;
        }this.health = health;
    }
    public int getLove() { return love; }
    public void setLove(int love) {
        if (love<0||love>100){
            System.out.println("亲密值的有效性在0-100间,否则取默认值60");
            love=60;
        }this.love = love;
    }
    public String getSex() { return sex; }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void show(){
        System.out.println("名字"+name+",性别"+getSex()+",健康值"+health+",亲密值"+love);
    }
}
public class Test {
    public static void main(String[] args) {
        Penguin penguin=new Penguin();
        penguin.setName("ciao");
        penguin.setSex("nan");
        penguin.setLove(1000);
        penguin.setHealth(-100);
        penguin.show();
    }
}

在这里插入图片描述
有参构造的封装

public class Penguin {
    private String name;
    private int health;
    private int love;
    private String sex;

    public Penguin(String name, int health, int love, String sex) {
        setHealth(health);
        setLove(love);
        setSex(sex);
        setName(name);
    }

    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }
    public int getHealth() { return health; }
    public void setHealth(int health) {
        if (health < 0 || health > 100) {
            System.out.println("健康值的有效性在0-100间,否则取默认值60");
            health=60;
        }this.health = health;
    }
    public int getLove() { return love; }
    public void setLove(int love) {
        if (love<0||love>100){
            System.out.println("亲密值的有效性在0-100间,否则取默认值60");
            love=60;
        }this.love = love;
    }
    public String getSex() { return sex; }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void show(){
        System.out.println("名字"+getName()+",性别"+getSex()+",健康值"+getHealth()+",亲密值"+getLove());
    }
}
public class Test {
    public static void main(String[] args) {
        Penguin penguin=new Penguin("xiaoyu",-100,30,"nan");
        penguin.show();
    }
}

在这里插入图片描述

  • 完善宠物店

企鹅类

public class Penguin {
    private String name;
    private int health;
    private String sex;
    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }
    public int getHealth() { return health; }
    public void setHealth(int health) {
        if (health < 0 || health > 100) {
            System.out.println("健康值的有效性在0-100间,否则取默认值60");
            health=60;
        }this.health = health;
    }

    public String getSex() { return sex; }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void show(){
        System.out.println("名字"+getName()+",性别"+getSex()+",健康值"+getHealth());
    }
}

狗狗类

public class Dog {
    private String name;
    private int health;
    private int love;
    private String sex;

    public String getName() {
        return name;
    }

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

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        if (health < 0 || health > 100) {
            System.out.println("健康值的有效性在0-100间,否则取默认值60");
            health=60;
        }this.health = health;
    }

    public int getLove() {
        return love;
    }

    public void setLove(int love) {
        if (love<0||love>100){
            System.out.println("亲密值的有效性在0-100间,否则取默认值60");
            love=60;
        }this.love = love;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
    public void show(){
        System.out.println("名字"+getName()+",性别"+getSex()+",健康值"+getHealth()+",亲密值"+getLove());
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Dog dog = new Dog();
        Penguin penguin = new Penguin();
        System.out.println("欢迎您来到宠物店!");
        System.out.print("请输入要领养宠物的名字:");
        String name = input.next();
        dog.setName(name);
        penguin.setName(name);
        System.out.print("请选择要领养的宠物类型:(1、狗狗 2、企鹅)");
        int num = input.nextInt();
        switch (num) {
            case 1:
                System.out.print("请选择狗狗的性别(1、公 2、母):");
                int num1 = input.nextInt();
                if (num1 == 1) {
                    dog.setSex("公");
                } else {
                    dog.setSex("母");
                }
                System.out.print("请输入狗狗的健康值(1~100之间):");
                int num2 = input.nextInt();
                dog.setHealth(num2);
                System.out.print("请输入主人与狗狗的亲密度(1~100之间):");
                int num3 = input.nextInt();
                dog.setLove(num3);
                System.out.println("宠物的自白:");
                dog.show();
                break;
            case 2:
                System.out.print("请选择企鹅的性别:(1、Q仔 2、Q妹)");
                int num4 = input.nextInt();
                if (num4 == 1) {
                    penguin.setSex("Q仔");
                } else {
                    penguin.setSex("Q妹");
                }
                System.out.print("请输入企鹅的健康值(1~100之间):");
                int num5 = input.nextInt();
                penguin.setHealth(num5);
                System.out.println("宠物的自白:");
                penguin.show();
               break;
        }
    }}

效果图
在这里插入图片描述
在这里插入图片描述

二.继承

概述
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
格式
public class子类名 extends 父类名{}
继承中子类的特点
子类可以有父类的内容
子类还可以有自己特有的内容
继承的好处与弊端
1.提高了代码的复用性
2.提高代码的 维护性
3.当父类发生变化时,子类不得不跟着变化,削弱了子类的独立性
使用继承的原则
继承体现关系is a
举例苹果是水果的一种,可以使用继承的
狗是动物的一种,可以使用继承
猫是狗的一种,错误,所以不可以使用继承
继承中变量的访问特点
在子类方法中访问一个变量
子类局部范围找
子类成员范围找
父类成员范围找
如果都没有就报错(不考虑父亲的父亲)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

super关键字

a.super代表父类对象
b.在子类构造方法中调用且必须是第一句
c.不可以访问父类中定义为private的属性和方法
在这里插入图片描述
子类访问父类成员
在这里插入图片描述

    //我要访问本类的成员变量age,
    System.out.println(this.age);
    //我要访问父类的成员变量age
    System.out.println(super.age);

继承中构造方法的访问特点

子类中的所有构造方法默认都会访问父类中的无参构造方法
super()默认出现在子类构造方法的第一行

如果父类中没有无参构造方法,只有带参构造方法,怎么办呢

  • 通过使用super关键字去显示调用父类的带参构造方法
  • 在父类中自己提供一个无参构造方法

示例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.包

区分同名类,在项目中能有清晰的组织架构
package 包名;
导入包:
import 包名.类名;
在这里插入图片描述
在这里插入图片描述

四.访问权限

在这里插入图片描述

五.static修饰符

普通方法可以调用静态方法和静态属性
普通方法可以直接调用普通方法和普通属性
静态方法可以调用静态方法和静态属性
静态方法不可以直接调用普通方法和普通属性,需要使用对象 . 的方式调用
调用时就可以不用创建对象,直接类名.方法名调用
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习

模拟实现选民投票过程:一群选民进行投票,每个选民只允许投一次票,并且当投票总数达到100时,就停止投票

Voter类

public class Voter {
public static int voteNum = 0;
    public static void vote() {
        voteNum++;
    }
}

TestVoter类

public class TestVote {
    public static void main(String[] args) {
        for (int i = 1; i <= 200; i++) {
            Voter.vote();//调用静态方法
            System.out.println("当前投票数为:" + i);
            if(Voter.voteNum == 100){
                System.out.println("投票完成 ");
                break;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值