面向对象的特征之一:封装

这篇具有很好参考价值的文章主要介绍了面向对象的特征之一:封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.封装性

1.面向对象这个编程思想,有三个基本特征:

① 封装

② 继承

③ 多态

2.什么是封装性?

生活中,快递包裹,通常需要用袋子或箱子装起来。

目的:① 包含的内部商品,不会被损坏

           ② 可以包含隐私

           ③ 运输更方便

所以,代码也要考虑这些因素:

① 隐私 -> 安全,当某个类的代码,内部某些成员不希望外部知晓,或者随意的更改,那么就可以进行适当的封装

② 外部使用更方便

比如:生活中,洗衣机,只会留出几个简单的按钮和进水口,出水口,放衣服的入口这几个,它隐藏了内部复杂的结构。

代码中,String类,它内部的结构和实现是很复杂的,但是我们就算不是特别清除每一个内部实现,也不影响我们简单的使用

把代码控制在它的合理的可见性范围内,就是封装。

3.如何实现封装?

必须依赖于权限修饰符,或者又称为访问控制修饰符。

4.权限修饰符有哪些?

public,protected,缺省,private

                              本类                本包的其他类                其他包的子类中            其他包的非子类

private                     √                             ×                                     ×                                  ×

缺省                         √                             √                                     ×                                  ×

protected                 √                             √                                     √                                   ×

public                       √                             √                                     √                                   √ 

5.权限修饰符的使用要注意

① 如果权限修饰符是在class前面(这里暂不讨论内部类),只能是public或缺省

② 如果权限修饰符是在类的成员前面(成员变量,成员方法等),四种都可以

二.成员变量选择那种权限修饰符?

1.实际应用中,习惯上,先声明为private。称为属性私有化。

但是如果确实这个成员变量需要扩大它的可见性范围,那么可以把private修改为其他合适的修饰符。

例如:扩大到本包,那么就是缺省的。

例如:扩大到其他包的子类中,那么就是protected

例如:扩大到其他包的非子类中,那么就是public

2.为什么要使用权限修饰符?

因为属性其实就是代表对象的“数据”,那么对象的数据是非常重要的,不应该完全暴露,至少要可控。

3.如何使用私有化的属性?

如果这个属性确实要被外部使用,需要提供get或set方法。

get方法:供调用者获取属性值的方法

set方法:供调用者修改属性值的方法

4.get/set方法要注意的地方:

① 如果方法中有局部变量(也就是形参)与对象的实例变量“重名”,那么需要在实例变量的前面加“this.”。如果没有重名问题,在实例变量前面可以加“this.”,也可以不加“this.”。

② get/set的方法名,通常都是

get + 属性名,并且属性名的首字母大写

set + 属性名,并且属性名的首字母大写

③ 如果属性是boolean类型,那么它对应的方法,就会把get单词换成  is

Student类代码:

package com.atguigu.encapsulability;
 
public class Student {
    private String name;
    private int score;
    private int age;
    private boolean marry;
 
    //快捷键,自动生成get/set
    //在要写get/set方法的位置,鼠标的光标不要定位错位置了
    //按快捷键 Alt + Insert,部分同学需要同时按Fn
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getScore() {
        return score;
    }
 
    public void setScore(int score) {
        this.score = score;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        //加条件判断,加逻辑的控制
        if(age<=20 || age>=35){
            return;
//            throw new IllegalArgumentException(age +"非法");
        }
        this.age = age;
    }
 
    public boolean isMarry() {
        return marry;
    }
 
    public void setMarry(boolean marry) {
        this.marry = marry;
    }
}

对属性加上权限修饰符的话,也就是属性私有化,可以保证属性(数据)的安全,比如说设置属性值的时候,属性私有化就可以在set方法上加条件判断,看上述代码。

TestField类代码:

package com.atguigu.encapsulability;

public class TestField {
    public static void main(String[] args) {
        Student s1 = new Student();
/*        s1.name = "张三";
        s1.score = 89;
        s1.age = 23;
        //以上代码正常使用没问题,但是如果出现以下代码
        s1.score = -89;
        s1.age = -23;//没有设置权限修饰符,可以随便更改属性值(数据)
        //这样写,逻辑上有问题,语法上没法控制*/
 
        //这里是调用者的角色,调用s1学生对象的姓名name的get和set
        System.out.println("修改之前,姓名:" + s1.getName());
        s1.setName("张三");
        System.out.println("修改之后,姓名:" + s1.getName());
 
        System.out.println("修改之前,年龄:" + s1.getAge()) ;
        s1.setAge(-23);
        System.out.println("修改之后,年龄:" + s1.getAge()) ;
    }
}

练习1:

(1)定义矩形类Rectangle,

- 声明实例变量长和宽,全部私有化private,

- 提供相应的get/set方法,如果set方法的参数值<=0,则提示矩形的长和宽必须是正数

- 声明public double area(),返回矩形面积

- 声明public double perimeter():返回矩形的周长

- 声明public String getInfo():返回矩形的长、宽、面积、周长信息

(2)测试类的main中创建一个可以装3个矩形对象的数组,并调用set方法为对象的属性赋值,依次长是8,7,6,宽是2,3,4

- 遍历输出矩形对象数组

- 按照矩形对象的length属性值从小到大排序后,遍历输出矩形对象数组

- 按照矩形对象的面积从小到大排序后,遍历输出矩形对象数组

编写代码的习惯:先写所有的成员变量的声明,再写方法

Rectangle类代码:

public class Rectangle {
    private double length;
    private double width;
 
    public double getLength() {
        return length;
    }
 
    public void setLength(double length) {
        if(length<=0){
            System.out.println("长方形的长必须是正数");
            return;//结束当前方法的执行,那么 this.length = length;就不执行了
        }
        this.length = length;
    }
 
    public double getWidth() {
        return width;
    }
 
    public void setWidth(double width) {
        if(width<=0){
            System.out.println("长方形的宽必须是正数");
            return;//结束当前方法的执行,那么 this.width = width;就不执行了
        }
        this.width = width;
    }
 
    public double area(){
        return length * width;
    }
    public double perimeter(){
        return 2 * (length + width);
    }
    public String getInfo(){
        return "长:" + length +",宽:" + width +",面积:" + area() +",周长:" + perimeter();
    }
}

TestRectangle类代码:文章来源地址https://www.toymoban.com/news/detail-451554.html

public class TestRectangle {
    public static void main(String[] args) {
        Rectangle[] arr = new Rectangle[3];
 
        System.out.println("排序之前:");
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new Rectangle();
            arr[i].setLength(8-i);
            arr[i].setWidth(2+i);
            System.out.println(arr[i].getInfo());
        }
 
        System.out.println("按照length从小到大排序:");
        for(int i = 1; i < arr.length; i++) {
            for(int j = 0; j < arr.length-i; j++) {
                if(arr[j].getLength() > arr[j+1].getLength()){
                    Rectangle temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                 }
            }
        }
 
       for(int i = 0; i < arr.length; i++) {
           System.out.println(arr[i].getInfo());
       }
 
        System.out.println("按照面积从小到大排序:");
       for(int i = 1; i < arr.length; i++) {
           for(int j = 0; j < arr.length-i; j++) {
               if(arr[j].area() > arr[j+1].area()){
                   Rectangle temp = arr[j];
                   arr[j] = arr[j+1];
                   arr[j+1] = temp;
                }
           }
       }
        
       for(int i = 0; i < arr.length; i++) {
           System.out.println(arr[i].getInfo());
       }
 
    }
}

到了这里,关于面向对象的特征之一:封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面向对象三大特性之一——継承(上篇)

    目录 前文 一.什么是継承? 1.1 継承的定义 1.2 継承的格式 1.2.1 継承的使用格式 1.2.2 継承关系和访问限定符 二,基类和派生类对象复制转换 三,継承中的作用域 四,派生类/子类中的默认成员函数 六,継承与友元  六,継承与静态成员 总结 本篇文章主要是详解面向对象三大

    2024年02月03日
    浏览(40)
  • 【JAVASE】带你了解面向对象三大特性之一(继承)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关

    2024年04月09日
    浏览(52)
  • 【JAVASE】带你了解面向对象三大特性之一(多态)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。 总的来说:同一件事情,发生在不同对象

    2024年04月14日
    浏览(71)
  • 5.面向对象三大特征

    封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。就好像我们看不到挂在墙上的空调的内部的零件信息(也就是属性),但是可以通过遥控器(方法)来控制空调

    2024年02月15日
    浏览(37)
  • C++:多态究竟是什么?为何能成为面向对象的重要手段之一?

    本篇博客基于VS2019X86环境下,后续关于多态原理相关验证都是基于vsX86环境,而虚表本质上是一个虚函数指针数组,在X86环境下VS编译器会在数组最后放一个unllptr!! 多态的概念:通俗来说,就是多种形态,具体点就是去 完成某个行为,当不同的对象去完成时会产生出不同的

    2024年02月02日
    浏览(48)
  • C#学习笔记--面向对象三大特征

    用程序来抽象现实世界,(万物皆对象)来编程实现功能。 三大特性:封装、继承、多态。 类与对象 声明位置: namespace 中 样式: class 类名{} 命名:帕斯卡命名法(首字母大写) 实例化对象:根据类来新建一个对象。 Person p=new Person(); 成员变量 声明在类语句块中 用来描述

    2024年02月08日
    浏览(49)
  • Python学习之路-面向对象:三个基本特征

    封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同的代码不需要重复的编写 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 封装是面向对象编程的一大特点,面向对象编程的第一步就是将属性和方法封装到一个抽

    2024年02月02日
    浏览(56)
  • Java面向对象封装

    目录 封装的概念 封装具体实现步骤 示例代码如下 封装具体语法 Java封装是一种面向对象的编程方法,它的主要思想是将类的内部细节(包括数据和方法)隐藏起来,对外只提供公共的访问接口,从而保证了程序的安全性和稳定性。 1、声明类的成员变量时,使用private

    2024年02月03日
    浏览(43)
  • 面向对象——封装

    C++面向对象的三大特性为: 封装、继承、多态 C++认为 万事万物都皆为对象 ,对象上有其属性和行为 例如: ​ 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… ​ 车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐

    2024年02月14日
    浏览(33)
  • 面向对象的第二个基本特征:继承011026

    生活中:         继承 --- 延续                 --- 扩展 代码中:         继承 --- 重复使用已有的类的代码(复用)                 --- 扩展已有类的代码(扩展) ① 代码的复用和扩展 ② 满足is - a 的关系 事物的分类来说,子类别的关系 Student is a Person. Teacher is a Pe

    2024年02月05日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包