为什么要封装?

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

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

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

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

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

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

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

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

首先 private

 package com.bjsxt.oop.encapsulation01;

 public class Test01 {
private String str;
private void print(){
System.out.println("Test01.print()");
}
}

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

 package com.bjsxt.oop.encapsulation01;

 public class Test02 {

     /**
* @param args
*/
public static void main(String[] args) {
Test01 t = new Test01();
t.print();//报错 The method print() from the type Test01 is not visible
} }

换成default 默认(不用写)

 package com.bjsxt.oop.encapsulation01;

 public class Test01 {
private String str;
/*private*/ void print(){
System.out.println("Test01.print()");
}
}

同一个包

 package com.bjsxt.oop.encapsulation01;

 public class Test02 {

     /**
* @param args
*/
public static void main(String[] args) {
Test01 t = new Test01();
t.print();//可以用!
} }

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

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

 package com.bjsxt.oop.encapsulation01;

 public class Test01 {
private String str;
private void print(){
System.out.println("Test01.print()");
}
}

不同包

 package com.bjsxt.oop.encapsulation02;

 import com.bjsxt.oop.encapsulation01.Test01;

 public class test03 {

     /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test01 t = new Test01();
t.print();//报错The method print() from the type Test01 is not visible
} }

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

 package com.bjsxt.oop.encapsulation01;

 public class Test01 {
private String str;
/*private*/ void print(){
System.out.println("Test01.print()");
}
}

不同包

 package com.bjsxt.oop.encapsulation02;

 import com.bjsxt.oop.encapsulation01.Test01;

 public class test03 {

     /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test01 t = new Test01();
t.print();//报错The method print() from the type Test01 is not visible
} }

不可以 报错

public 就不用试了 都可以

那么

protected

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

 package com.bjsxt.oop.encapsulation01;

 public class Test01 {
private String str;
/*private*//*public*/protected void print(){
System.out.println("Test01.print()");
}
}
class Test001 extends Test01{
public void pp(){
super.print();
}
}
 package com.bjsxt.oop.encapsulation02;

 import com.bjsxt.oop.encapsulation01.Test01;

 public class Test0001 extends Test01{
public static void main(String[] args) {
Test0001 t = new Test0001();
t.print();
}
}
 package com.bjsxt.oop.encapsulation02;

 import com.bjsxt.oop.encapsulation01.Test01;

 public class Test03 {

     /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test01 t = new Test01();
t.print();//报错The method print() from the type Test01 is not visible
} }

发现 他的子类是可以的

不是子类的就不行了

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

封装要点:

1.类的属性的处理

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

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

2.类的方法的处理

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

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

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

 package com.bjsxt.oop.encapsulation01;
/**
* 一般这么定义类的访问权限
*
* @author Administrator
*
*/
public class Man {
//成员变量私有
private String name;
private int id;
//静态变量公开
public static int cc;
//常量可以公开 也可以不公开 看需求
public static final int MAX_SPEED =;
public boolean man; //设置set、get方法 直接 Source里的set get方法创建就可以
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isMan() {
return man;
}
public void setMan(boolean man) {
this.man = man;
} }

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

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

面向对象三大特性一一封装(encapsulation)的更多相关文章

  1. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

  2. Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法

    Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现 ...

  3. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  4. C# 面向对象三大特性:封装、继承、多态

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  5. python面向对象三大特性之一封装

    一.什么是封装 在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其 含义是其他程序无法调用. 要了解封装,离不开“私有化”,就是将类或者 ...

  6. java面向对象三大特性:封装、继承、多态

    一.封装 封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系.也就是说用户 ...

  7. day24 面向对象三大特性之封装

    本周内容 组合 封装 多态 面向对象高级 异常处理 网络协议 通讯原理 互联网协议 TCP/UDP 基于TCP协议的套接字 上周回顾 1.xml,os,os.path 2.ATM+购物车 三层结构 3 ...

  8. Java入门系列(三)面向对象三大特性之封装、继承、多态

    面向对象综述 封装 封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道 ...

  9. Java中面向对象三大特性之——封装

    概述 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改. 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问.要访问该类的数据,必须通 ...

随机推荐

  1. javascript 变量定义

    一.javascript中,变量定义的位置与写在哪个<script></script>标签对内无关,只分前后顺序,写在前面的后面就能够访问,写在后面的前面会提示“未定义”. 例 ...

  2. windows server 2008 R2 无法启用"网络发现" 需要启动的服务

    必须打开以下服务: 1.dnscache(简写.fdrespub(简写) 2.SSDP Discovery 3. UPnP Device Host 4. Computer Browser 5.Serv ...

  3. ES(2): Build ES Cluster on Azure VM

    目录: 系统环境准备 安装ES集群 安装Kibana 安装x-pack 安装head 系统环境准备 参见: HDP2.4安装(二):Centos7配置 修改network: 修改hosts: 配置ss ...

  4. 【linux】vim/vi常用指令

    0或者"Home”键:光标转移到此段的最前面字节处. $或者"End"键:光标转移到此段的最后面字节处. n<space>:光标向后移动n个字节. n< ...

  5. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  6. debian之apt源

    美国的 deb http://ftp.us.debian.org/debian stable main contrib non-freedeb-src http://ftp.us.debian.org ...

  7. php语言介绍分析

    1,胡说八道 php设计专门用于web开发的编程语言,易学易用得到广泛应用的同时也饱受诟病,简单易学使得初学者用最短的时间很容易实现自己的WEB站点,且开源项目丰富,是中小型公司热衷的选择.但是,随着 ...

  8. git提交忽略不必要的文件或文件夹

    创建maven项目,使用git提交,有时需要忽略不必要的文件或文件夹,只保留一些基本. 例如如下截图,实际开发中我们只需提交:src,.gitignore,pom.xml 而自己项目文件一般都保留,但 ...

  9. 关于attr("checked")的输出

    同样的一段代码,在不同的文件输出不同的答案,好神奇. console.log($("#never").attr("checked")); 一个输出checked ...

  10. Linux下XAMPP装完之后,Navicat无法连上数据库的问题的解决 注意'mypassword'是当前的mysql登录密码

    Linux下装完XAMPP之后,mysql是自带装好了的,这个时候,mysql的root用户没有密码. 在mac 下安装好xampp后,需要在终端命令行操作时,比如输入:mysql -u root - ...