当前位置: 首页 > 编程日记 > 正文

面向对象三大特性一一封装(encapsulation)

为什么要封装?

我们看电视,只要按一下开关和换台就行了。有必要了解电视的内部结构吗?有必要了解显像管吗?

封装是为了隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性,可维护性。

我们设计程序要追求:“高内聚,低耦合”。

高内聚:就是类的颞部数据的操作细节自己完成,不允许外部干涉;

低耦合:仅仅暴露少量的方法给外部使用

哪些应该封装,哪些不应该封装?

类无非就是属性和方法。对他们进行约束行了。

使用访问控制符,现实封装!

首先 private

1 package com.bjsxt.oop.encapsulation01;
2 
3 public class Test01 {
4     private String str;
5     private void print(){
6         System.out.println("Test01.print()");
7     }
8 }

在同一个包的另外一个类,调用test01();

 1 package com.bjsxt.oop.encapsulation01;
 2 
 3 public class Test02 {
 4 
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         Test01 t = new Test01();
10         t.print();//报错 The method print() from the type Test01 is not visible
11     }
12 
13 }

换成default 默认(不用写)

1 package com.bjsxt.oop.encapsulation01;
2 
3 public class Test01 {
4     private String str;
5     /*private*/ void print(){
6         System.out.println("Test01.print()");
7     }
8 }

同一个包

 1 package com.bjsxt.oop.encapsulation01;
 2 
 3 public class Test02 {
 4 
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         Test01 t = new Test01();
10         t.print();//可以用!
11     }
12 
13 }

private和default   看看不同包  可以调用吗?

private 同一个包的肯定不行 上面已经试了

1 package com.bjsxt.oop.encapsulation01;
2 
3 public class Test01 {
4     private String str;
5     private void print(){
6         System.out.println("Test01.print()");
7     }
8 }

不同包

 1 package com.bjsxt.oop.encapsulation02;
 2 
 3 import com.bjsxt.oop.encapsulation01.Test01;
 4 
 5 public class test03 {
 6 
 7     /**
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         // TODO Auto-generated method stub
12         Test01 t = new Test01();
13         t.print();//报错The method print() from the type Test01 is not visible
14     }
15 
16 }

试试 default 同包的肯定可以 上面试了

1 package com.bjsxt.oop.encapsulation01;
2 
3 public class Test01 {
4     private String str;
5     /*private*/ void print(){
6         System.out.println("Test01.print()");
7     }
8 }

不同包

 1 package com.bjsxt.oop.encapsulation02;
 2 
 3 import com.bjsxt.oop.encapsulation01.Test01;
 4 
 5 public class test03 {
 6 
 7     /**
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         // TODO Auto-generated method stub
12         Test01 t = new Test01();
13         t.print();//报错The method print() from the type Test01 is not visible
14     }
15 
16 }

不可以 报错

public 就不用试了 都可以

那么

protected

首先在同一个包下创建一个子类,然后在别的包再创建一个子类

 1 package com.bjsxt.oop.encapsulation01;
 2 
 3 public class Test01 {
 4     private String str;
 5     /*private*//*public*/protected void print(){
 6         System.out.println("Test01.print()");
 7     }
 8 }
 9 class Test001 extends Test01{
10     public void pp(){
11         super.print();
12     }
13 }
 1 package com.bjsxt.oop.encapsulation02;
 2 
 3 import com.bjsxt.oop.encapsulation01.Test01;
 4 
 5 public class Test0001 extends Test01{
 6     public static void main(String[] args) {
 7         Test0001 t = new Test0001();
 8         t.print();
 9     }
10 }
 1 package com.bjsxt.oop.encapsulation02;
 2 
 3 import com.bjsxt.oop.encapsulation01.Test01;
 4 
 5 public class Test03 {
 6 
 7     /**
 8      * @param args
 9      */ 
10     public static void main(String[] args) {
11         // TODO Auto-generated method stub
12         Test01 t = new Test01();
13         t.print();//报错The method print() from the type Test01 is not visible
14     }
15 
16 }

发现 他的子类是可以的

不是子类的就不行了

总之,记住上面的图,或者下面的话就行。

封装要点:

1.类的属性的处理

一般(成员变量)使用private  常量或者static变量的话用public          (除非本属性确定会被子类继承)

提供相应get/set方法(public)  从而对属性进行操作 (boolean类型的get方法变成了is)

2.类的方法的处理

一些只用于本类的辅助方法可以用 private

希望其他类调用的方法用public

下面是一般建类时 属性和方法的设置

 1 package com.bjsxt.oop.encapsulation01;
 2 /**
 3  * 一般这么定义类的访问权限
 4  * 
 5  * @author Administrator
 6  *
 7  */
 8 public class Man {
 9     //成员变量私有
10     private String name;
11     private int id;
12     //静态变量公开
13     public static int cc;
14     //常量可以公开 也可以不公开 看需求
15     public static final int MAX_SPEED =120;
16     public boolean man;
17     
18     
19 
20     //设置set、get方法  直接 Source里的set get方法创建就可以
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public int getId() {
28         return id;
29     }
30     public void setId(int id) {
31         this.id = id;
32     }
33     public boolean isMan() {
34         return man;
35     }
36     public void setMan(boolean man) {
37         this.man = man;
38     }
39     
40 }

注意设置set/get方法时,没必要手写,可以右键source 找到 Generate Getters and Setters...

注意设置boolean布尔类型变量的set/get 变成了is/get  自己写可能会忘,用source里面的Generate Getters and Setters...创建自动添加,选上即可

转载于:https://www.cnblogs.com/PoeticalJustice/p/7617783.html

相关文章:

云计算赋能人工智能,未来的红利在哪?

“云”这个概念对于身处于信息时代的我们而言越来越熟悉,而云计算平台作为对计算机软硬件资源进行集中存储、管理的平台,已经不再是一个遥远的 IT 概念,它开始渗透到各行各业,未来将会像水和电一样,作为基础设施&#…

pxe linux 配置文件,Linux PXE 部署

一、基础环境准备Linux配置静态IP-192.168.5.1# vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICEeth0ONBOOTyesBOOTPROTOstaticIPADDR192.168.5.1NETMASK255.255.255.0:x --保存退出#service network restart#service iptables stop二、准备安装镜像#mount /dev/cdrom /m…

Keras还是TensorFlow?深度学习框架选型实操分享

译者| 王天宇、林椿眄责编| Jane、琥珀出品| AI科技大本营深度学习发展势头迅猛,但近两年涌现的诸多深度学习框架让初学者无所适从。如 Google 的 TensorFlow、亚马逊的 MXNet、Facebook 支持的 PyTorch、Theano、Caffe、CNTK、Chainer、百度的 PaddlePaddle、DSSTN…

Android -- queryIntentActivities

某些时候你想要知道某个APP是否有注册了一个明确的intent,比如说你想要检查某个receiver是否存在,然后根据是否存在来这个receiver来在你的AP里面enable某些功能。我们可以通过PackageManager来check它。 code public boolean isIntentAvailable(Context…

吉大c语言程序设计作业一,吉林大学历年C语言程序设计试题及答案.doc

吉林大学历年C语言程序设计试题及答案吉林大学历年C语言程序设计试题及答案(5)END2000年试题答案一、(1)解题思想&#xff1a; 用5个数 a,b,c,d,e,来回替换&#xff0c;最终f(n)算出。设计程序如下&#xff1a;int F(int n){ if(n <5) return n ;int temp,a1;b2;c3;d4;e5;fo…

忍不住心中的激动

天天上自行车旅行网&#xff0c;看到别人的出行游记&#xff0c;心里很羡慕&#xff0c;也很冲动&#xff0c;想想还有1个多月就可以出发了&#xff0c;不知道能坚持到哪里&#xff0c;恒心是有的&#xff0c;可身体就不知道&#xff0c;不过这次时间可以不用那么紧&#xff0c…

程序员入错行怎么办?

程序员应该选择什么技术领域才能获得最高的回报&#xff1f;本文详细解读了 2018 年最热门的五大领域&#xff0c;对行业现状、薪资概况及具体的技能要求给出了深入的分析&#xff0c;希望给担心“入错行”的你提供些指导。七天国庆黄金周转眼就过&#xff0c;退散的除了出游热…

关于局域网共享访问问题总结

Windows网上邻居互访的基本条件&#xff1a;  1) 双方计算机打开&#xff0c;且设置了网络共享资源&#xff1b;  2) 双方的计算机添加了 "Microsoft 网络文件和打印共享" 服务&#xff1b;  3) 双方都正确设置了网内IP地址&#xff0c;且必须在一个网段中&…

Linq初级班 Linq To XML体验(基础篇)

LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还有许多不足的地方,还请高手们多多耐心指导,好了,下面就开始我们的LINQ to XML旅程吧,在此之前…

c语言字符串机考题,2016全国计算机二级《C语言》机考试题及答案

2016全国计算机二级《C语言》机考试题及答案一、程序填空题(共18分)下列给定程序中&#xff0c;函数fun的功能是&#xff1a;求ss所指字符串数组中长度最短的字符串所在的行下标&#xff0c;作为函数值返回&#xff0c;并把其串长放在形参n所指的变量中。ss所指字符串数组中共有…

如何快速优化机器学习的模型参数

作者 | Thomas Ciha译者 | 刘旭坤编辑 | Jane出品 | AI科技大本营【导读】一般来说机器学习模型的优化没什么捷径可循。用什么架构&#xff0c;选择什么优化算法和参数既取决于我们对数据集的理解&#xff0c;也要不断地试错和修正。所以快速构建和测试模型的能力对于项目的推进…

2004-10-26+ 用户输入的安全问题

最近在看一本叫《asp.net安全性高级编程》&#xff0c;把一些感兴趣的东西写成笔记当到这里吧&#xff0c;今天这一篇主要是讲怎么防御注入攻击的。script injection 1.验证内容a.使用regularexpressionvalidator的正则表达式来限制用户输入2.筛选用户输入a.使用string.replace…

在C语言中break语句称为,在C语言中,break语句的功能是退出函数

摘要&#xff1a;燃烧煤中质在中过程所含矿物&#xff0c;语言k语高温和氧化后分解&#xff0c;称为&#xff0c;体残的固留物生成。出函只装锅炉机时称(引风。语言k语锅炉规格都以其公取的常用称压一般为选力和来作阀门上的。...燃烧煤中质在中过程所含矿物&#xff0c;语言k语…

C语言算法6-15

2019独角兽企业重金招聘Python工程师标准>>> 【程序6】 题目&#xff1a;用*号输出字母C的图案。 1.程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 2.程序源代码&#xff1a; #include "stdio.h" main() { printf("Hello C…

二维数组c语言矩阵加法,C 语言实例 – 两个矩阵相加 - C 语言基础教程

C 语言实例使用多维数组将两个矩阵相加。#include int main(){int r, c, a[100][100], b[100][100], sum[100][100], i, j;printf("输入行数 ( 1 ~ 100): ");scanf("%d", &r);printf("输入列数 ( 1 ~ 100): ");scanf("%d", &c…

自动生成HTML的一段程序

<%ifSaveFile("list.htm","http://192.168.1.4:920/lcy.asp") thenResponse.write "已生成"elseResponse.write "没有生成"endiffunctionSaveFile(LocalFileName,RemoteFileUrl) DimAds, Retrieval, GetRemoteData OnErrorRe…

【JAVA零基础入门系列】Day2 Java集成开发环境IDEA

【JAVA零基础入门系列】&#xff08;已完结&#xff09;导航目录 Day1 开发环境搭建Day2 Java集成开发环境IDEADay3 Java基本数据类型Day4 变量与常量Day5 Java中的运算符Day6 Java字符串Day7 Java输入与输出Day8 Java的控制流程Day9 Java中的那个大数值Day10 Java中的数组Day1…

只讲技术,拒绝空谈!2018 AI开发者大会精彩议程曝光

2018 年 11 月 8-9 日&#xff0c;由中国 IT 社区 CSDN 与硅谷 AI 社区 AICamp 联合出品的 2018 AI 开发者大会&#xff08;AI NEXTCon&#xff09;将于北京盛大召开。届时&#xff0c;近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者将齐聚于此&#xff0c;展开全方位技…

经典的Java基础面试题集锦

问题&#xff1a;如果main方法被声明为private会怎样&#xff1f; 答案&#xff1a;能正常编译&#xff0c;但运行的时候会提示”main方法不是public的”。 问题&#xff1a;Java里的传引用和传值的区别是什么&#xff1f; 答案&#xff1a;传引用是指传递的是地址而不是值本身…

c语言组队,组队列问题。会做的高手帮帮忙啊

算法实验题4.10 组队列问题 问题描述&#xff1a;组队列是一个特殊的抽象数据类型&#xff0c;它所支持的运算类似于队列运算具有附加的组属性。因此入队运算 Enqueue(x)与通常定义的运算不eue(x)运算将元素x加入当前队列中与元素x 属于同一组的元素的尾有与x属于同一组的元素&…

算力超英伟达?华为推出两款“昇腾”芯片;五大AI战略正式公布

整理 | 非主流、费棋 出品 | AI科技大本营 华为也像是要 All in AI 了。 10 月 10 日&#xff0c;华为全联接大会 2018 上&#xff0c;华为轮值董事长徐直军带来了一系列的硬核 AI。在大会上&#xff0c;他系统公布了华为的 AI 发展战略&#xff0c;以及全栈全场景 AI 解决方案…

《SharePoint Portal Server 2003 深入指南》出版预告

《SharePoint Portal Server 2003 深入指南》在8月底、9月初应该就会上市了&#xff0c;如果您想得到这本书&#xff0c;方法包括&#xff1a; 1、等到书店到货之后&#xff0c;在书店购买。 2、网上订购。比如在Dearbook上&#xff1a;http://www.dearbook.com.cn/book/110838…

python内置数据结构之dict

字典是什么 key-value对的集合.可变的、无序、key不重复的序列.key只能是唯一标识,value不限定,只要是合法的value.key和value一一对应.字典的定义初始化空字典定义 dict() 和 {}例;d dict() 或 d {}字典定义初始化- 1dict(**kwargs) 使用namevalue的格式,定义字典例:…

Google发布三大新品,Pixel手机价格直逼苹果

整理 | 费棋出品 | AI科技大本营北京时间 10 月 9 日晚间&#xff0c;Google 在秋季发布会上推出了 Pixel 手机、平板电脑 Pixel Slate 以及智能音箱 Home Hub三大新品。最新旗舰手机 Pixel 3 和 Pixel 3 XL 如约而至&#xff0c;但由于产品信息在发布前就已被泄露&#xff0c;…

github上好的c语言项目,2019 github热门项目

zdogzdog是一款js 3D引擎&#xff0c;zdog不同于其他的js 3D引擎的地方在于所有的API引用全部都是2D绘图&#xff0c;所以zdog项目才会简单&#xff0c;但是高效。一起来做马里奥吧&#xff01;craftcraft是Mojang工作室在github上的开源项目&#xff0c;craft完全采用c语言实现…

性能测试注意事项

作者&#xff1a;不详 性能测试注意事项&#xff1a; 1&#xff0e;服务器端和客户端一定要同一个局域网内&#xff0c;否则网络因素会成为性能测试的瓶颈。 2&#xff0e;在性能测试脚本中要注意检查点的设置&#xff0c;否则都不清楚脚本是否真的成功执行操作。 3&#xff0e…

【笔记】PIL 中的 Image 模块

Image 模块提供了一个同名类&#xff08;Image&#xff09;&#xff0c;也提供了一些工厂函数&#xff0c;包括从文件中载入图片和创建新图片。例如&#xff0c;以下的脚本先载入一幅图片&#xff0c;将它旋转 45 度角&#xff0c;并显示出来&#xff1a; 1 >>>from P…

c语言万年历的设计报告,万年历设计报告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#includechar* month_str[]{"January","February","March","April","May","June","July","August","September","Octob…

SQL Server的数据库开发工具

偶然的机会看到这个工具&#xff0c;看来比Oracle的PL/SQL Dev 有过之而无不及呀。而且是免费的哟这个工具看起来确实很牛呀&#xff0c;只是我还没有试用过。SQL Prompt 为Microsoft SQL Server 编辑器提供一种智能感知形式的自动完成功能&#xff0c;当你正在写你自己的SQL命…

国内首个深度学习工程师认证标准发布

10月10日&#xff0c;深度学习工程师认证发布会暨人工智能人才发展论坛在京召开。会上&#xff0c;基于中国软件行业协会发布的国内AI领域第一个专业技术人才培养标准——《深度学习工程师能力评估标准》&#xff08;以下称《标准》&#xff09;&#xff0c;深度学习技术及应用…