java基础(一)-----java的三大特性之封装

news/2024/7/4 12:54:19 标签: java, 数据库

面向对象编程有三大特性:封装、继承、多态。本文将介绍java的三大特性之封装

封装

封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。

       对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。

       使用封装有几大好处:

          1、良好的封装能够减少耦合。

           2、类内部的结构可以自由修改。

          3、可以对成员进行更精确的控制。

          4、隐藏信息,实现细节。

       首先我们先来看两个类:Husband.java、Wife.java

 1 public class Husband {
 2     
 3     /*
 4      * 对属性的封装
 5      * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
 6      */
 7     private String name ;
 8     private String sex ;
 9     private int age ;
10     private Wife wife;
11     
12     /*
13      * setter()、getter()是该对象对外开发的接口
14      */
15     public String getName() {
16         return name;
17     }
18  
19     public void setName(String name) {
20         this.name = name;
21     }
22  
23     public String getSex() {
24         return sex;
25     }
26  
27     public void setSex(String sex) {
28         this.sex = sex;
29     }
30  
31     public int getAge() {
32         return age;
33     }
34  
35     public void setAge(int age) {
36         this.age = age;
37     }
38  
39     public void setWife(Wife wife) {
40         this.wife = wife;
41     }
42 }

 

 1 public class Wife {
 2     private String name;
 3     private int age;
 4     private String sex;
 5     private Husband husband;
 6  
 7     public String getName() {
 8         return name;
 9     }
10  
11     public void setName(String name) {
12         this.name = name;
13     }
14  
15     public String getSex() {
16         return sex;
17     }
18  
19     public void setSex(String sex) {
20         this.sex = sex;
21     }
22  
23     public void setAge(int age) {
24         this.age = age;
25     }
26  
27     public void setHusband(Husband husband) {
28         this.husband = husband;
29     }
30  
31     public Husband getHusband() {
32         return husband;
33     }
34     
35 }

 

  从上面两个实例我们可以看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。

  所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。

  通过这个我们还不能真正体会封装的好处。现在我们从程序的角度来分析封装带来的好处。如果我们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样写:

1 public class Husband {
2     public String name ;
3     public String sex ;
4     public int age ;
5     public Wife wife;
6 }

  我们应该这样来使用它:

1 Husband husband = new Husband();
2 husband.age = 30;
3 husband.name = "张三";
4 husband.sex = "男";    //貌似有点儿多余

  但是那天如果我们需要修改Husband,例如将age修改为String类型的呢?你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,你是不是要改到崩溃。如果使用了封装,我们完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。

 1 public class Husband {
 2     
 3     /*
 4      * 对属性的封装
 5      * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
 6      */
 7     private String name ;
 8     private String sex ;
 9     private String age ;    /* 改成 String类型的*/
10     private Wife wife;
11     
12     public String getAge() {
13         return age;
14     }
15     
16     public void setAge(int age) {
17         //转换即可
18         this.age = String.valueOf(age);
19     }
20     
21     /** 省略其他属性的setter、getter **/

  其他的地方依然那样引用(husband.setAge(22))保持不变。

  其他的地方依然那样引用(husband.setAge(22))保持不变。

       到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。

       我们在看这个好处:可以对成员变量进行更精确的控制。

  还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:

1 Husband husband = new Husband();
2 husband.age = 300;

  也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:

 1 public class Husband {
 2     
 3     /*
 4      * 对属性的封装
 5      * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
 6      */
 7     private String name ;
 8     private String sex ;
 9     private int age ;    /* 改成 String类型的*/
10     private Wife wife;
11  
12     public int getAge() {
13         return age;
14     }
15  
16     public void setAge(int age) {
17         if(age > 120){
18             System.out.println("ERROR:error age input....");    //提示錯誤信息
19         }else{
20             this.age = age;
21         }
22         
23     }
24     
25     /** 省略其他属性的setter、getter **/
26     
27 }

  上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。

 1 public String getSexName() {
 2     if("0".equals(sex)){
 3         sexName = "女";
 4     }
 5     else if("1".equals(sex)){
 6         sexName = "男";
 7     }
 8     else{
 9         sexName = "人妖???";
10     }
11     return sexName;
12 }

   在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。

1 public String getCzHTML(){
2     if("1".equals(zt)){
3         czHTML = "<a href='javascript:void(0)' οnclick='qy("+id+")'>启用</a>";
4     }
5     else{
6         czHTML = "<a href='javascript:void(0)' οnclick='jy("+id+")'>禁用</a>";
7     }
8     return czHTML;
9 }

推荐博客

  https://www.cnblogs.com/chen-haozi/p/10227797.html

转载于:https://www.cnblogs.com/java-chen-hao/p/10344497.html


http://www.niftyadmin.cn/n/706649.html

相关文章

08-工厂方法

1. 简介 工厂方法&#xff1a;符合依赖倒置原则、单一职责、开闭原则。 与简单工厂的区别&#xff1a;简单工厂是在一个工厂里生成多个不同的类&#xff0c;而工厂方法是一个对象对应一个生成工厂&#xff0c;这些工厂都实现了一个共同的接口IFactory&#xff0c;很好的符合了依…

ubuntu系统中Qt creator 编辑和应用使用中文输入法

在ubuntu系统的GUI开发过程中遇到在编辑器里面不能使用中文输入法&#xff0c;前提我已经安装了搜狗输入法&#xff0c;但是还是不能使用&#xff0c;原因是QT的库里没有最新fcix的库&#xff0c;、 没有安装搜狗的输入法的 https://pan.baidu.com/s/1pLNo9fX 我这里百度云有链…

剑指offer——面试题10:斐波那契数列

个人答案&#xff1a; 1 #include"iostream"2 #include"stdio.h"3 #include"string.h"4 using namespace std;5 typedef long long ll;6 const int MAXN10000;7 8 ll fib[MAXN];9 ll Fibonacci(int n) 10 { 11 if(fib[n]!-1) 12 ret…

395. Longest Substring with At Least K Repeating Characters

题目要求 Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.Example 1:Input: s "aaabb", k 3Output: 3The longest substring is "aaa&qu…

Asp.Net实现JS前台带箭头的流程图方法总结!(个人笔记,信息不全)

Asp.Net实现JS前台带箭头的流程图方法总结&#xff01;&#xff08;持续更新中&#xff09; 一、返回前台json格式 json5 "[{\"Id\":2259,\"Name\":\"高中\"},{\"Id\":2259,\"tName\":\"初中\"},{"Id&…

Java 对象的继承,抽象类,接口

子父级继承 关键字 extends 首先创建一个父类 1 class Fu 2 { 3 String name; 4 int a1; 5 public void word() 6 { 7 System.out.println("工作"); 8 …

Selenium2+python自动化63-简易项目搭建

前言 到unittest这里基本上可以搭建一个简易的项目框架了&#xff0c;我们可以用一条run_main.py脚本去控制执行所有的用例&#xff0c;并生成报告&#xff0c;发送邮件一系列的动作 一、新建工程 1.打开pycharm左上角File>New Project&#xff0c;在Location位置输入项目名…

后端_服务器

本地搭建服务器 Nginx官网下载,解压放到本地文件夹.打开文件nginx.conf文件 ,做出以下修改:server {# 启动后的端口listen 8880; # 启动时的地址server_name localhost;# 启动后&#xff0c;地址栏输入: localhost:8880, 默认会在html文件夹下找 index.html文件locati…