美文网首页
Java基础提升8

Java基础提升8

作者: 努力的土豆 | 来源:发表于2019-03-29 21:34 被阅读0次

    大概有两天没有更新了,是自己懒了点,所以今天更新一篇,把看过的东西记录下来。今天的内容是关于封装的概念。
    之前的文章中,对于知识点的概念,有描述不准确的地方,因此,在以后的文章中,对于概念的描述尽量引用官方的文字。

    Java封装

    • 封装是面向对象程序设计四大基本概念之一,其余的三个分别是继承,多态和抽象。
      封装是一种可以使类中的字段私有化并能通过公有方法访问私有字段的技术。如果一个字段被声明为私有,它就不能在类的外部被访问,从而隐藏了类内部的字段。基于这个原因,封装有时也被称为数据的隐藏。
      封装可以被认为是一种能够保护代码和数据被定义在类外的其他代码任意访问的屏障。访问数据和代码由一个接口严格控制。封装的主要好处是修改我们实现的代码而又不会破坏其他人使用我们的代码。封装的这个特性使得我们的代码具有可维护性、灵活性以及扩展性。

    看了这一大段描述,貌似没有感觉啊有木有。来一段代码冷静一下。

    public class XiaomingDemo {
    
        public String name;
        public int age;
    }
    
    public class XiaomingTest {
        public static void main(String[] args) {
            XiaomingDemo xiaomingDemo = new XiaomingDemo();
            xiaomingDemo.age = 12;
            xiaomingDemo.name = "haha";
            System.out.println(xiaomingDemo.age);
            System.out.println(xiaomingDemo.name);
        }
    }
    

    上面的代码就没有使用封装,没有常见的getXxx(),setXxx()方法(可能这么说不太合适),目前来看,也许觉得这么使用觉得没毛病,XiaomingDemo这个类显得还很简洁,使用类中的成员属性时,只需要 new 出一个实例对象,例如本例中的xiaomingDemo,调用类的成员属性,只需简单的 xiaomingDemo.age 或者 xiaomingDemo.name 。但是,仔细思考过后发现,如果XiaomingDemo 类中的 age 属性被大量的其他的类实例对象访问时,我们该如何传值,难道是 xiaomingDemo.age 这样?这绝对不是一个明智的选择,原因也简单,现实生活中 age 是一年一年发生变化的,因此,当那些获得 小明年龄值的实例,每年还要检查每一处 age 的值,并更新age,我想应该没人会这么做,毕竟这太繁琐,饭不能保证没有遗漏。因此封装应运而生。

    public class XiaomingDemo {
    
        private String name;
        private int age;
        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 class XiaomingTest {
        public static void main(String[] args) {
            XiaomingDemo xiaomingDemo = new XiaomingDemo();
            packageDemo.setAge(12);
            packageDemo.setName("haha");
            System.out.println(packageDemo.getName());
            System.out.println(packageDemo.getAge());
        }
    }
    

    这样一个简单的封装实现了,无论有多少个实例对象想要获得小明的年龄或者年龄,只需要调用相应的 getXxx() 方法就行,此外,关于年龄的变化也不再是一个问题,小明可以改变自己年龄的值,并且其他实例对象调用时,也是最新的年龄,不需要调用的实例对象去改变小明的年龄。

    所以呢,封装就是把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界访问,我们就大可不必提供方法给外界访问。但是如果一个类不暴露任何方法,那么这个类就没有存在的价值了,因为它不能被使用!

    也许这么说还是不清晰,我们考虑一下前面文章中提到的 String 类,假如不看源码,你会知道 String 有哪些属性吗。答案很显然,我们根本不关心它的属性,我们只关心 String 所提供的那些方法,至于这些方法如何实现的我们也不关心,会调用就行(尴尬),这就是关于封装概念的很好的实现。将内部复杂的结果与外界隔离,仅仅暴露出一个接口。或者举个不太恰当的例子,动物是不是也是封装的体现。还有我们曾经学习的过得数据结构是不是也使用到了封装

    参考链接

    java提高篇(一)-----理解java的三大特性之封装

    浅谈java封装思想

    相关文章

      网友评论

          本文标题:Java基础提升8

          本文链接:https://www.haomeiwen.com/subject/jlhrbqtx.html