一、封装(Encapsulation)

  1、概述

     封装是面向对象编程的核心思想。把对象的属性和行为封装起来,其载体就是类。

    面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。

    封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

  2、原则

    将 属性隐藏 起来,若需要访问某个属性,提供公共方法 对其访问。

二、封装步骤

  1、使用 private 关键字来修饰成员变量。

  2、对需要访问的成员变量,提供对应的一对 getXXX 方法、setXXX 方法。

三、封装的操作 —— private 关键字

  1、private 含义

    •   private 是一个权限修饰符,代表最小权限;
    • 可以修饰成员变量和成员方法;
    • 被 private 修饰后的成员变量和成员方法,只在本类中才能访问

  2、private 使用格式

    格式:

private 数据类型 变量名;

     a、使用 private 修饰成员变量,代码如下:

 public class Student {
private String name;
private int age;
}

    b、提供 getXXX 方法 / setXXX 方法,可以访问成员变量,代码如下:

 public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}

    注意

    •   对于 Getter 来说,不能有参数,返回值类型和成员变量对应。
    • 对于 Setter 来说,不能有返回值,参数类型和成员变量对应。

四、封装优化1 —— this 关键字

  1、this 的含义【重要】

    this 的意思是当前对象,代表所在类的当前对象的引用(地址值),即对象自己的引用。

    应用: 

    (1)构造器中

      表示正在被创建的对象

    (2)调用方法时

      表示正在调用该方法的对象

     注意:方法被哪个对象调用,方法中的 this 就代表那个对象。即谁在调用,this 就代表谁。

  2、用法

  (1)this.属性

         局部变量和成员变量同名情况,可以在成员变量的前面加 this。

      上面的 setXXX 方法中的形参并不符合见名知意的规定,那么如果修改与成员变量名一致,那么就可以见名知意了。代码如下:

 public class Student {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public void setAge(int age) {
age = age;
}
}

      但是发现这样有问题,成员变量赋值失败了,即修改了 setXXX() 的形参变量名后,方法并没有给成员变量赋值。

      原因:由于形参变量名(局部变量名)与成员变量名重名,根据“就近原则”,优先使用局部变量,导致成员变量名被隐藏。方法中的变量名,无法访问到成员变量,从而赋值失败。

      解决方案: 使用this关键字,来解决这个重名问题。

      使用格式

this.成员变量名;

         使用 this 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:

 public class Student {
private String name;
private int age;
public void setName(String name) {
//name = name;
this.name = name; // 把形参中的 name 赋值给当前类的 name
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age; // 把形参中的 age 赋值给当前类的 age
}
public int getAge() {
return age;
}
}

            注意:方法中只有一个变量名时,默认也是使用 this 修饰,可以省略不写。  

  (2)this.方法

    没有非用不可的时候,多用于调用本类中的方法

    Demo:

 class Circle{
private double radius; public Circle(){} public void setRadius(double radius){
this.radius = radius;
}
public double getRadius(){
return this.radius;//也可以加this.
} public double getArea(){
return 3.14 * radius * radius;
} public void printInfo(){
// System.out.println("半径:" + radius + ",面积:" + getArea());
System.out.println("半径:" + this.radius + ",面积:" + this.getArea());
}
}

  (3)this() 或 this(实参列表)  

    this() 表示调用本类的无参构造

    this(实参列表) 表示调用本类的有参构造

    注意:this() 或 this(实参列表) 必须在构造器的首行

    Demo:

 class Student{
private String name;
private int age;
private char gender;
private int score; public Student(){
System.out.println("创建一个学生对象");
}
public Student(String name, int age){
this();
this.name = name;
this.age = age;
}
public Student(String name, int age, char gender, int score){
/*this.name = name;
this.age = age;*/
this(name,age);//调用上面的有参构造
this.gender = gender;
this.score = score;
}
}

五、封装优化2 —— 构造方法(Constructor)

  1、构造方法作用

    (1)构造对象,创建对象,和 new 一起使用,每次调用它就是在创建新的对象(初始化对象)

    (2)当一个对象被创建时,构造方法用来初始化对象,给对象的成员变量赋初始值

    注意:当自己没有定义构造方法时,Java 自动提供了一个无参数的构造方法,所有的类都有构造方法。一旦自己定义了构造方法,Java将不再提供构造方法。

  2、构造方法特点

    (1)所有类都有构造方法

    (2)如果一个类没有显示声明构造方法,那么编译器将会自动生成一个默认的无参构造

    (3)如果一个类显示声明了构造方法,那么编译器将不会自动生成默认的无参构造

    (4)构造方法的名称必须与类名相同

    (5)构造方法没有返回值类型,也不写void

    (6)构造方法可以发生重载

  3、构造方法的定义格式

    语法格式

修饰符 构造方法名/类名 (【参数列表】){
// 方法体
}

    Demo:

 public class Student {
private String name;
private int age;
// 无参数构造方法
public Student() {}
// 全参数构造方法
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}

    注意

    •   构造方法的名称必须和所在类名称完全一样,包括大小写;
    • 构造方法不要写返回值类型,连 void 都不需要写;
    • 构造方法不能 return 一个具体的返回值;
    • 如果没有手动提供构造方法,系统会提供无参构造方法;
    • 如果手动了提供了构造方法,系统将不再提供无参构造方法;
    • 构造方法是可以重载的,既可以定义参数,也可以不定义参数;

六、标准代码 —— JavaBean

  JavaBean 是 java 语言编写类的一种标准规范。符合  JavaBean 的类,要求类必须是具体的和公开的,并且无参的构造方法,提供用来操作成员变量的 setter 和 getter 方法。

  通常由下面四个组成部分:

   1、所有的成员变量都要使用 private 关键字修饰;

   2、为每一个成员变量编写一对儿 Getter/Setter 方法

   3、编写一个无参数的构造方法 【必须】

   4、编写一个全参数的构造方法 【建议】

   Demo:编写一个 标准的 JavaBean,以学生类为例:

 public class Student {
//成员变量私有化
private String name;
private int age;
private boolean marry;
//构造方法
public Student() {} // 无参构造
public Student(String name,int age) { // 全参构造
this.name = name;
this.age = age;
}
//成员方法:公共的 get/set 方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setMarry(boolean marry){
this.marry = marry;
}
public boolean isMarry() { // boolean 类型的属性的 get 方法,习惯使用 get 换成 is
return marry;
}
}

  注意:标准的 JavaBean中,boolean 类型的属性的 getter方法,习惯使用 get 换成 is。

Java 面向对象(二)封装的更多相关文章

  1. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  2. Java面向对象的封装

    封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些 ...

  3. Java面向对象(二)

    面向对象(Object Oriented) Java支持面向对象三大特性:封装.继承.多态.(抽象)1.封装(Encapsulation)封装:隐藏对象内部的复杂性,只对外公开简单的接口.便于外界调用 ...

  4. java面向对象(封装,继承,多态,抽象,接口的定义和实现)

    1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...

  5. Java面向对象之封装 入门实例(一)

    一.基础概念 (一)面向对象的三大特征:      1.封装         2.继承          3.多态 (二)封装:隐藏实现细节,对外提供公共的访问方式(接口). 封装的体现之一:将属性都 ...

  6. java面向对象之封装性

    面向对象的特征之一:封装和隐藏: 一.问题的引入: 当创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值.这里,赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约 ...

  7. Java面向对象之封装

     面向对象的三个特征:封装.继承和多态. Java开发的过程就是找合适的库对象使用,没有对象创建新对象.找对象,建立对象,使用对象并维护对象之间的关系. 类就是对现实生活中事物的描述,而对象就是这类事 ...

  8. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  9. Java 面向对象,封装,继承

    1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...

  10. Java面向对象(二) 接口、多态和泛型

    一.接口 二.多态 多态是同一个行为具有多个不同表现形式或形态的能力. 2.1 类型转换 转换方式 隐式 向上转型 对于基本数据类型,存储容量低的可自动向存储容量高的类型转换 对于引用变量,子类可被转 ...

随机推荐

  1. 【分类算法】朴素贝叶斯(Naive Bayes)

    0 - 算法 给定如下数据集 $$T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},$$ 假设$X$有$J$维特征,且各维特征是独立分布的,$Y$有$K$种取值.则 ...

  2. java生成RSA公私钥字符串,简单易懂

    java生成RSA公私钥字符串,简单易懂   解决方法: 1.下载bcprov-jdk16-140.jar包,参考:http://www.yayihouse.com/yayishuwu/chapter ...

  3. Linux -- GCC Built-in functions for atomic memory access

    下列内建函数旨在兼容Intel Itanium Processor-specific Application Binary Interface, section 7.4. 因此,这些函数区别于普通的G ...

  4. vue-cli 引入stylus报错

    在App.vue页面添加以下代码报错: <style lang="stylus" rel="stylesheet/stylus"> </sty ...

  5. javascript DOM和DOM操作的四种基本方法

    在了解了javascript的语言特性后,javascript真正大放光彩的地方来了——这就是javascript DOM Javascript DOM DOM(Document Object Mod ...

  6. python 模块import(26)

    一.模块简介 python开发中,每一个.py文件都可以看作是一个模块,模块内部的函数或者方法可以被其他模块调用,至于函数或者方法是具体如何实现的,调用者不需要关心. 假如项目中既含有UI也有逻辑代码 ...

  7. Java面试 - PATH与CLASSPATH 的区别?

    PATH:操作系统提供的路径配置,用于定义所有可执行程序的路径. CLASSPATH:由JRE提供的,用于定义Java 程序解释时类加载路径.

  8. hadoop在eclipse当中如何添加源码?

    [学习笔记] /*org.apache.hadoop.mapreduce.Mapper.Context,java.lang.InterruptedException,想看map的源代码,按contro ...

  9. [tensorflow] 入门day1-数据整理与展示

    tensorflow真是一个我绕不开的坑(苍天饶过谁.jpg) 其实tensorflow1和2的差别挺大的,暂时从1入坑,2的话之后简单过一下. tf2中更改的函数(供参考):https://docs ...

  10. 一个好隐蔽的C/C++代码bug

    来自:微博@ruanyf, 一本书上说,下面的 C 语言代码可能会产生无限循环.看了半天,才意识到 Bug 在哪里. 完美解答: 数组下标越界.数组a总共有10个值,a[0]~a[9].for循环里面 ...