• 技术文章 >Java >java教程

    01.Java 基础 - 封装

    黄舟黄舟2017-02-27 10:08:05原创841

    基本概念

    Java 面向对象有三大特性:封装、继承、多态。而封装与继承基本上是为多态服务的。

    封装(Encapsulation):就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象内部的实现细节。通俗来讲就是私有化类的成员变量,并提供公共方法来访问这些成员变量。

    数据隐藏:一个成员变量声明为私有成员,那么它不能通过外部类直接访问,从而将成员变量隐藏在类的内部。基于这个原因,封装也被称为数据隐藏。


    JavaBean

    JavaBean 是一种规范,它规定了一种良好封装的规范,只要符合该规范的类都称作JavaBean。

    它具有以下特点:

    public void set 成员名(成员类型 arg);public 成员类型 get 成员名();

    实例探究

    1.未封装&封装

    首先我们来看未封装的成员变量:

    class Person{    // 将成员的访问权限设置为 public,这也为意味这谁都访问到它
        public String name;    public int age;
    }public class Test{
        public static void main(String[] args) {
            Person person = new Person();        //通过类,我们可以直接操作成员变量
            person.name ="kobe";
            person.age =1000;        //直接获得成员变量的值
            System.out.println(person.name+"-"+person.age);
        }
    }

    下面我们对上面的类进行封装:

    class Person {    //1.将成员变量私有化,这样一来外部就不能直接访问到它们
        private String name;    private int age;    //2.提供公共的方法来操作成员变量
        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 Test {
        public static void main(String[] args) {
            Person person = new Person();        // 不能直接访问成员变量,而是通过提供的公共方法来设置/获取成员变量的值
            person.setName("kobe");
            person.setAge(1000);
            System.out.println(person.getName() + "-" + person.getAge());
        }
    }

    到目前为止我们看到封装与未封装对象的大概区别了:


    2.封装控制对象

    如果仅仅只是这样,封装似乎也没有什么作用,接下来我们看看如何通过封装实现对对象的控制:

    class Person {    
    private String name;    
    private int age;    
    private int city;    
    //对于 name 的控制,直接取消了 setter 方法,这样外部只能访问,而不能设置 name 的值
        public String getName() {        
        // 直接返回值
            return "kobe";
        }    public int getAge() {        
        return age;
        }    
        // 有两个 setter 方法,可以接收 int,String 类型的参数
        public void setAge(int age) {        
        this.age = age;
        }    public void setAge(String age) {        
        // 对参数值进行验证,默认只能输入数字
            if(age.matches("[0-9]")){            
            this.age = Integer.valueOf(age);
            }else{
                System.out.println("Error:年龄只能为数字");
            }
        }    
        // 在日常开发,我们一般会将文字转换成编码在数据库存储,因此在存储调用时就要做转换
        public String getCity() {        
        switch (city) {        
        case 001:            
        return "北京";        
        default:            
        return "上海";
            }
        }    
        public void setCity(String city) {        
        if("北京".equals(city)){            
        this.city = 001;
            }else if("上海".equals(city)){            
            this.city = 002;
            }else{
                System.out.println("Error:没有找到该城市");
            }
        }
    }public class Test {
        public static void main(String[] args) {
            Person person = new Person();
            person.setAge("a"); //Error:年龄只能为数字
            person.setAge(1000); //既可以接收 String 类型,也可以接收 int 类型
            person.setCity("广州"); //Error:没有找到该城市
            person.setCity("北京"); //此时已经被转换成 001 存储了    
    
            //在访问 city 成员变量时,001 又被转换成 北京 显示
            System.out.println(person.getName()+"-"+person.getAge()+"-"+person.getCity());
        }
    }

    通过以上的代码,我们大致可以总结出封装的作用:


    参考

    以上就是01.Java 基础 - 封装的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java , 封装
    上一篇:Java 的发展(历史)轨迹和历史变迁 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文详解怎么实现微服务鉴权• Java数据结构常见排序算法(总结分享)• Java中Map集合体系的基本使用和常用API• 一起来分析java设计模式之单例• 深入分析Java的序列化与反序列化
    1/1

    PHP中文网