3.封装和继承

1.封装(set,get)

面向对象三大特征之一

1.1、封装的概念

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
把尽可能多的东西藏起来,对外提供便捷的接口

1.2、访问修饰符

使用访问修饰符修饰不想让别人知道的,和一定让别人知道的

[default | public | protected | private] 其中,default就是没有任何修饰符词

private:表示私有及这个类所有,这个类之外的任何代码都不可以访问
public:表示公开的,所有地方都可以访问
protected:表示受保护的,是在子类中可以访问的,即便不在同一个包下

1.3、封装的好处

  • 便于使用者正确使用系统,防止错误修改属性
  • 有助于系统之间的松耦合,提高系统独立性
  • 提高软件的可重用性
  • 降低了构建大型系统的风险

2.包(package)

包:有效的管理类,解决类的命名冲突问题。
package 包名称
package:包的定义,包存在,是以目录形式表现
包定义只能在源代码中的第一行位置出现
只允许有一个package语句

包的命名规范

  • 包名由小写字母组成,不能以圆点开头或结尾
  • 包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
  • 包名后续部分依不同机构内部的规范不同而不同
  • 部门名.项目名 例如:com.bigdata09.day01

理解了import的作用

3.继承(extends)

面向对象三大特征之二

继承的关键字:extends
Java只支持单继承,也就是最多继承一个父类。

子类与父类是is-a关系

解决问题

  • 不劳而获
  • is-a 的现象

带来的问题

  • 耦合强了

开发中如何取舍?

4.面向对象的设计原则(8种):

开闭原则:

面向对象可复用设计原则中最基础的原则便是开闭原则(Open-Closed Principle,OCP)。开闭原则指的是在设计一个对象(类、模块、函数)时,应遵循或做到对扩展开放、对修改关闭,其核心思想是面向接口/抽象进行编程。比如第四方支付平台,集成微信支付服务时,遵循开闭原则的话,正常的做法就是先抽象设计一个支付接口,然后微信支付类实现该支付接口。以后平台集成更多如支付宝、华为、苹果等支付服务时,只需要扩展一个对应支付方式的支付类即可,这样既扩展了新的支付服务,同时避免了修改现有的支付接口以及微信支付类,最大限度保证了新代码不会影响现有的业务代码。这就是对扩展(新对象)开放,对修改(现有对象)关闭。


对代码修改时,那些是可以修改,那些是不建议修改。

在类的继承过程中,子类可以继承父类public的东西(构造方法除外) , 和 protected 和同包下defaule修饰级别的东西

5.方法重写(Override)

在类的继承过程中:子类不满意父类的方法怎么办? 方法重写 重写的关键字:Override

方法重写:是发生在继承中,子类重新定义了父类方法的现象

5.1、super关键字

  • super只能出现在子类的方法和构造方法中
  • super调用构造方法时,只能是第一句
  • super不能访问父类的private成员

super 和 this 一样,是一个伪引用
super 父类对象的引用
this 表示当前对象的引用

当前阶段回顾总结:封装,继承,方法重写,访问修饰符,包定义和规范(包的名字中不建议出现大写字母)

6.final 关键词

  • final 修饰类时,类不可以继承
  • final 修饰方法时,方法不可以被重写
  • final 修饰变量时,变量只允许赋值一次

后续课程学习:泛化和多态

案例:累加App
方式一:

public class AddApp {
    public static void main(String[] args) {
        // 在控制台不断输入数字并回车,直到输入bye结束程序,此时程序输出你在控制输入的所有数字之和
        Scanner scanner = new Scanner(System.in);
        System.out.println("请不断输入数字:");
        int sum = 0;
        String shang = "0";
        String s = "0";
        while (true){
            shang = s;
            s = scanner.nextLine();
            if (s.equals("bye")){
                System.out.println("累计总数之和是:"+sum);
                break;
            }
            if (s.equals("back")){
                System.out.println("返回上一步!");
                sum -= Integer.parseInt(shang);
                continue;
            }
            sum += Integer.parseInt(s);
        }
    }
}

方式二:

public class Add {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入数字:");

        SupperAddOr addOr = new SupperAddOr();

        while (true){
            String s = scanner.nextLine();
            //addOr.sum = 0;
            if (s.equals("bye")){
                System.out.println("综合:"+addOr.show());
                break;
            }
            if (s.equals("back")){
                addOr.back();
                continue;
            }

            addOr.put(s);
        }
    }
}
public class SupperAddOr extends AddOr {

    // 代码复用 不是只有继承一种方式,在不能使用继承手段复用代码的时候,我们使用组合手段复用代码
    //private AddOr addOr = new AddOr();
    // 存档副本
    private int bak;

    public void back() {
        this.setSum(bak);
        //addOr.setSum(bak);   // 就是把上一次累加时的存档副本,设置为当前累加
    }

    // 方法重写
    @Override
    public void put(String s) {
        this.bak = super.getSum();  // 每次累加时记录累加之前的副本
        super.put(s);   // 调用的父类的代码

    }
}
复制public class AddOr {
    // 成员变量
    private int sum;

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }

    public int show() {

        return sum;
    }

    public void put(String s) {
        sum += Integer.parseInt(s);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值