面向对象第二弹:封装性

前言

面向对象的语言有一般有三大特性:封装性,继承性,和多态性,今天我们就来介绍一下何为封装性.


概念

先来举一个简单的例子,比如:对于电脑这样一个复杂的设备,提供的其实就是开关机,键盘录入,显示屏等让用户进行人机交互. 而对于计算机的使用者来说,他们不用知道计算机内部核心器件是怎么组装,主板如何布线的,所以计算机厂商在出厂时,会把内部的结构使用壳子包起来,将内部细节隐藏掉.

这其实就是封装.

封装其实就是将某些属性和方法实现的细节隐藏起来,如果用户想要访问,可以提供不同的访问接口来实现.

那么如何隐藏又如何访问呢?

这就用到了java中的几种修饰符.

java的修饰符

上图就是不同修饰符修饰方法或者属性后,所能访问的范围,打钩就表示可以访问.

其中子类都概念我们后面再说.

我们今天的重点就在于我们可以通过给属性或者变量加上不同的修饰符就可以限制他们的访问权限.

下面来几个例子.

public class Dog {

    private String name;
    public int age;
    String color;

    public Dog(String name, int age,String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }


    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

对于age是被public修饰,所以任何地方都可以访问,

对于name,被private修饰,所以只能是本类才可以访问,其他地方访问的话,就会报错

对于color,无修饰符,那么在本包中可以访问.


再比如:

我想写一个方法,参数是一个整型数组, 需求是将这个数组升序排序并将结果打印.

如下图:

第一种写法:

public static void print(int[] arr){
        
        for(int i = 0; i < arr.length - 1; i++){
            boolean flag = true;
            for(int j = 0; j < arr.length - 1 - i; j++){
                if(arr[j] > arr[j+1]){
                    flag = false;
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            if(flag){
                break;
            }
        }

        System.out.println(Arrays.toString(arr));

    }

第二种写法:

  private static void sort(int[] arr){
        for(int i = 0; i < arr.length - 1; i++){
            boolean flag = true;
            for(int j = 0; j < arr.length - 1 - i; j++){
                if(arr[j] > arr[j+1]){
                    flag = false;
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            if(flag){
                break;
            }
        }
    }
    

    public static void print(int[] arr){

       sort(arr);

        System.out.println(Arrays.toString(arr));

    }

这里有两种写法:第一种写法是将排序和打印写在了一个方法中,

而第二个方法是写在两个方法中,并且排序方法还使用了private修饰.

那么哪一种方法更好一点呢?

其实是第二种,因为我们的要求其实只是打印排序后的数组,那么我其实是不关心是如何排序的,而是关心结果是否正确,那么我们就没有必要将这个方法暴露在外面.


补充

对于我们定义的Dog或者Cat类,我们一般将它定义为javabean类.

那么什么是javabean类呢?  其实就是成员属性私有化,即使用private修饰,

我们在类内再提供公共的"接口",即被public修饰的方法来让外界的类能够操作我的子类

比如:

public class Dog {

    private String name;
    private int age;
    private String color;

    public Dog(String name, int age,String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }


    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

当然,这都不是一定的,只是一般的标准,千万不要局限住了.

我们还是要具体问题具体分析,看看究竟是使用private修饰,还是public修饰.

谢谢

谢谢大家!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值