Java学习笔记(八):面向对象③ —— 封装性

简介: Java学习笔记(八):面向对象③ —— 封装性

@[toc]
  
  
  

引入与概念

  

为什么需要封装 ? 封装的作用和含义 ?

我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗?有必要碰电动机吗?
  

我们的程序设计追求 高内聚,低耦合

高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅对外暴露少量的方法用于使用。
  

隐藏对象内部的复杂性,只对外公开简单的接口 。

便于外界调用,从而提高系统的可扩展性、可维护性通俗的说,
把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

  
  
  
  

具体理解封装性

  
一、问题的引入:

当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。但除此之外,没有其他制约条件。但是,实际问题中,我们往往需要给属性赋值加入额外限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行条件的添加。比如说,setLegs同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)。此时,针对于属性就体现了封装性。
  

二、封装性的体现:
我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值

拓展:封装性的体现:① 如上 ② 不对外暴露的私有方法 ③ 单例模式 ...

  
三、封装性的体现,需要权限修饰符来配合

  1. Java规定的4种权限(从小到大排列):private、缺省、protected、public
  2. 4种权限可以用来修饰类及类的内部结构: 属性、方法、构造器、内部类
  3. 具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类。

修饰类的话,只能用:缺省、public

  
封装性总结:

Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。

  
  
  

四种权限修饰符

  
Java 权限修饰符public、protected、default(缺省)、private 置于类的成员(属性、方法)定义前,用来限定对象对该类成员的访问权限。

修饰符 类内部 同一个包 不同包的子类 同一个工程
private
default(缺省)
protected
public

修饰类的话,只能用:缺省、public

  • public 类可以在任意地方被访问。
  • default 类只可以被同一个包内部的类访问。

  
  
  

构造器(构造方法)

  

一、构造器的作用

  1. 创建对象
  2. 初始化对象的信息

简单来说,当我们创建对象时,如 Scanner scanner = new Scanner();。
new 的并不是Scanner类(PS:类后面还加啥括号呢?),而是 Scanner() 构造器!!!所以,只要造对象,就得用构造器!!!


二、说明

  1. 如果没有显示定义类的构造器的话,则系统默认提供一个空参的构造器
  2. 定义构造器的格式: 权限修饰符 类名(形参列表) { }
  3. 一个类中定义的多个构造器,彼此构成重载
  4. 一旦显式的定义了类的构造器之后,系统就不再提供默认的空参构造器(如果不用的话,不写是不会报错的;如果创建对象时需要用到空参构造器,这时候得自己添上空参构造器)
  5. 一个类中,至少会有一个构造器


只要造对象,就得用构造器!!!
  
  
  

属性赋值的先后顺序

  

  1. 默认初始化(微观看不见,一定义属性就有了)
  2. 显示初始化(定义属性时给属性赋值)
  3. 构造器中初始化

  

  1. 通过对象.方法对象.属性的方式,赋值


前三条1.2.3.只能执行一次,最后一条4. 能反复执行

操作先后顺序:1. ——> 2. ——> 3. ——> 4.

  
  
  

JavaBean

  
JavaBean 是一种 Java 语言写成的可重用组件。

所谓 JavaBean,是指符合如下标准的 Java 类:

  1. 类是公共的
  2. 有一个无参的公共的构造器
  3. 有属性,且有对应的 get、set 方法

  
  
  

this关键字是什么

  
在Java中,this关键字的作用和其词义很接近。

  • this在方法内部使用时,表示这个方法所属对象的引用;
  • this在构造器内部使用时,表示该构造器正在初始化的对象。

this表示当前对象,可以调用类的属性、方法、构造器
  

什么时候使用this关键字呢?

当在方法内需要用到调用该方法的对象时,就用this
具体的:我们可以用this来区分局部变量和属性。
比如:this.name = name;
  
  
  

this关键字的使用

  

一、this可以用来修饰:属性、方法、构造器
  

二、this修饰属性和方法

this理解为:当前对象(调用对象的属性和方法时) 或 当前正在创建的对象(构造器中使用)

  1. 在类的方法中,可以使用this.属性this.方法的方式,调用当前对象的属性或方法。但是,在通常情况下,我们都选择省略this.。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显示的使用this.变量的方式,表示此变量是属性,而非形参。

举个例子:this.name = name

  1. 在类的构造器中,可以使用this.属性this.方法的方式,调用当前正在创建的对象的属性或方法。但是,通常情况下,我们都选择省略this.。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显示的使用this.变量的方式,表示此变量是属性,而非形参。

实战案例:

public Customer(String name, char gender, int age, String phone, String email) {
    this.name = name;
    this.gender = gender;
    this.age = age;
    this.phone = phone;
    this.email = email;
}

如果不想把类的属性和形参弄混,那就用this.
  
  
三、this调用构造器

  1. 我们在类的构造器中,可以显式的使用this(形参列表)方式,调用本类中指定的其它构造器
  2. 构造器中不能通过this(形参列表)方式调用自己
  3. 如果一个类中有 n 个构造器,则最多有 n-1 个构造器中使用了this(形参列表)(因为不能产生死循环)
  4. 规定:this(形参列表)必须声明在当前构造器的首行
  5. 构造器内部,最多只能声明一个this(形参列表),用来调用其他构造器

(不能连着调两个构造器,而且第二个也不满足 4. 啊)

  
  
  

import关键字的使用

  

import导入:

  1. 在源文件中显示的使用import结构导入指定包下的类、接口。
  2. 声明在包的声明和类的声明之间。
  3. 如果需要导入多个结构,则并列写出即可。
  4. 可以使用xxx.*的方法,表示导入xxx包下的所有结构。(所有结构指类和接口,子包不算)
  5. 如果使用的类和接口是 java.lang 包下定义的,则可以忽略import结构。
  6. 如果使用的类或接口是本包下定义的,则可以忽略import结构。
  7. 如果在源文件中,使用了不同包下的同名类,则必须至少有一个类需要以全类名的方式显示。
  8. 使用xxx.*方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显示导入
  9. import static:导入指定类或接口中的静态结构(属性、方法)

  
全类名的方式显示,举例:

package 封装继承多态.封装性练习基本使用;

import 封装继承多态.封装性练习基本使用.exer1.Account;

public class test {
    public static void main(String[] args) {
        Account account = new Account();
        // 全类名的方式显示
        封装继承多态.封装性练习基本使用.exer2.Account account1 = new 封装继承多态.封装性练习基本使用.exer2.Account();
    }
}

  
  
  

package关键字的使用

  

  1. 为了更好的实现项目中类的管理,提供包的概念。
  2. 使用 package 声明类或接口所属的包,声明在源文件的首行。
  3. 包,属于标识符,遵循标识符的命名规则、规范见名知意
  4. .一次,就代表一层文件目录。

补充:同一个包下,不能命名同名接口或同名类;不同包下,可以命名同名的接口、类。

  
  
JDK 中主要的包介绍

  1. java.lang —— 包含一些 Java 语言的核心类,如 String、Math、Integer、System 和 Thread,提供常用功能。
  2. java.net —— 包含执行与网络相关的操作的类和接口。
  3. java.io —— 包含能提供多种输入/输出功能的类。
  4. java.util —— 包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
  5. java.text —— 包含了一些 java 格式化相关的类
  6. java.sql —— 包含了 java 进行 JDBC 数据库编程的相关类/接口
  7. java.awt —— 包含了构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。B/S C/S

  
  
在这里插入图片描述

相关文章
|
26天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
15 2
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
2月前
|
安全 Java 数据安全/隐私保护
Java 封装怎么理解
封装是Java中的一种重要机制,它将对象的状态(数据)和行为(方法)打包在一起并控制外部访问权限,以保护数据不被随意修改。封装的主要目的包括数据保护、接口设计和增强模块性。通过使用`private`、`protected`及`public`等访问控制修饰符,结合getter和setter方法,可以有效隐藏对象内部实现细节。下面是一个简单的`BankAccount`类示例,展示了如何通过封装保护类的内部状态,确保数据安全和一致性,简化类的使用。理解封装有助于编写高质量代码和设计优秀程序架构。
|
2月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
35 4
|
2月前
|
Java 数据安全/隐私保护
Java 封装详解
在 Java 中,封装是面向对象编程的关键特性,通过将对象的状态(数据)和行为(方法)结合并利用访问控制保护数据,防止外部随意访问和修改。主要特点包括访问控制(如 `private` 和 `protected`)、数据隐藏及方法暴露(如 getter 和 setter)。封装的优点在于保护数据、隐藏实现细节、易于维护以及提高代码可读性。下面是一个简单的 `Person` 类封装示例,展示了如何通过 getter 和 setter 控制对类内部状态的访问,并进行合法性检查。总结而言,封装有助于构建清晰、易用且可维护的代码结构,是编写高质量 Java 程序的重要原则。
|
2月前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
21 1
|
2月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
1月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
17 0
|
1月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
36 0
|
1月前
|
Java 程序员 开发工具
java学习笔记
java学习笔记
38 0
下一篇
无影云桌面