深入理解封装与继承

简介: 体会OOP的特性

@TOC

一. 封装

1.定义
封装(Encapsulation)
把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作访问
生活中电视机遥控器就是一个封装的产物
2.好处
①隐藏实现的细节
②对数据进行验证,保证安全合理
3.实现步骤
将属性私有化(private)——>提供一个公共的(public)set 方法用于对属性判断赋值——>提供一个公共的get方法获得属性值
4.代码实现
案例引入:
1.Account类要求具有属性:姓名(长度为2位3位或4位)、余额(必须>20).
密码(必须是六位),如果不满足,则给出提示信息,并给默认值
2通过setXxx的方法给Account的属性赋值。

class Account{
    public String name;         //姓名
    private double leftmoney;   //余额
    private String password;   //密码
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        if (name.length()==2||name.length()==3||name.length()==4) {
            //名字是2,3,4个字
            this.name = name;
        }else {
            System.out.println("输入的名字有误");
        }
    }
    public double getleftmoney() {
        return leftmoney;
    }
    public void setleftmoney(double leftmoney) {
        if(leftmoney>20) {  //余额大于20
            this.leftmoney = leftmoney;
        }else {
            System.out.println("您输入的余额有误");
        }
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        if (password.length()==6) { //密码必须是六位
            this.password = password;
        }else{
            System.out.println("输入的密码不符合要求");
        }
    }
    public String outmsg(){
        //可以增加权限的校验
        return "姓名"+name+"余额"+leftmoney+"密码"+password;
    }
}

5.总结
在以上set方法中对姓名,余额,密码进行的操作就是封装的一种体现,由于使用的是get方法获得的属性所以起到了隐藏实现细节的功能,对以上属性值的逻辑判定与限定实现了对数据进行验证,保证合理安全的功能

二. 继承

继承是面向对象最显著的一个特性
1.定义
继承(extends) extends 关键字的意思是“扩展”。子类是父类的扩展。
多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同属性和方法,所有子类不需要重新定义,通过extends声明继承父类即可
在这里插入图片描述
2.好处
①代码复用性提高
②代码扩展性和维护性提高
3.实现步骤
[修饰符列表] class 类名 extends 父类名{

 类体 = 属性 + 方法

}
4.代码实现
案例引入:
编写Computer类,包含CPU、内存、硬盘等属性,getDetails Computer的详细信息
编写PC子类,继承Computer类,添加特有属性 品牌brand
编写NotePad子类,继承Computer类,添加特有属性color
编写Test类,在main方法中创建PC和NotePad对象,分别给对象中特有的属性赋值,
以及从Computer类继承的属性赋值,并使用方法并打印输出信息。

class Computer {
    String CPU;
    String memory;
    String hard_disk;

    public Computer(String CPU, String memory, String hard_disk) {
        this.CPU = CPU;
        this.memory = memory;
        this.hard_disk = hard_disk;
    }
}

class PC extends Computer {
    String brand;
//这里也体现:继承设计的基本思想,父类的构造器完成父类属性初始化
// 子类的构造器完成子类属性初始化
    public PC(String CPU, String memory, String hard_disk, String brand) {
        super(CPU, memory, hard_disk);
        this.brand = brand;
    }

    public void outmsg01() {
        System.out.println("CPU为" + CPU + "内存为" + memory + "硬盘为" + hard_disk + "品牌为" + brand);
    }

}

class NotePad extends Computer {
    String color;
   //构造器完成子类属性初始化
    public NotePad(String CPU, String memory, String hard_disk, String color) {
        super(CPU, memory, hard_disk);
        this.color = color;
    }

    public void outmsg02() {
        System.out.println("CPU为" + CPU + "内存为" + memory + "硬盘为" + hard_disk + "颜色为" + color);
    }
}

5.总结
子类PC和Notepad继承了父类computer的CPU,memory,hard_disk属性,以至于在对应的子类中不需要再声明属性,只需要引用即可,这极大地提高了代码的复用性!!
6.使用细节
①子类继承了父类所有的属性和方法,非私有属性和方法可以在子类直接访问,但是私有属性和方法不可以在子类直接访问,要通过父类提供的公共方法访问
②子类必须调用父类的构造器完成父类初始化
③当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会调用父类的无参构造器,如果父类没有无参构造器,则必须在子类的构造器中使用super关键字去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不会通过
④如果希望指定去调用父类构造器,则显式的调用一下,super(形参列表)
⑤super关键字必须放在第一行,只能在构造器中使用
⑥super()和this()都只能放在构造器的第一行,因此构造器中智能有一种
⑦所有类都是object的子类
⑧父类构造器的调用不限于直接父类!将一直往上追溯到object类
⑨子类最多只能继承一个父类,Java中是单继承机制
⑩不能滥用继承,子类和父类之间必须满足逻辑关系

三. 继承的本质

在这里插入图片描述
当我们加载子类时他会按照就近原则访问加载相应的父类

相关文章
|
5月前
|
C++
C++中的封装、继承与多态:深入理解与应用
C++中的封装、继承与多态:深入理解与应用
121 1
|
12月前
|
Java
1.8 封装、继承、多态
1.8 封装、继承、多态
37 1
|
Java
面向对象编程基础:类、对象、封装、继承和多态
面向对象编程基础:类、对象、封装、继承和多态
102 0
|
设计模式
从“封装、继承、多态”看构建知识网
从“封装、继承、多态”看构建知识网
56 0
|
存储 Java 数据库
Java面向对象之封装和继承
本篇文章记录博主对面向对象部分的学习,带大家认识Java基础知识——包与继承,后续内容将持续更新。
81 0
Java面向对象之封装和继承
|
SQL 关系型数据库 数据库连接
接口继承|学习笔记
快速学习接口继承,接口只能被类去实现,如果想要规范团队,也不能把所有想要规范的东西写在一个接口里,这样会使接口臃肿,不好实现接口的类,因为有可能并不需要这么多规范。为了使接口的体系更加完整,更加具有结构性,就有了接口继承。本节的目标是理解接口的继承体系,掌握具体的接口继承实现。
接口继承|学习笔记
|
网络协议 测试技术 Go
实现接口和继承比较(1) | 学习笔记
快速学习实现接口和继承比较(1)
实现接口和继承比较(1) | 学习笔记
|
网络协议 测试技术 Go
实现接口和继承比较(2) | 学习笔记
快速学习实现接口和继承比较(2)
实现接口和继承比较(2) | 学习笔记
|
设计模式 Java 数据安全/隐私保护
【封装、继承、多态】总结
【封装、继承、多态】总结
86 0