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

  
  
在这里插入图片描述

相关文章
|
10天前
|
安全 Java 编译器
Java的封装详解
封装和多态是面向对象编程(OOP)的重要概念。封装通过私有属性和公共方法实现数据隐藏和保护,使类的内部细节对外部不可见;多态则通过方法重载和重写实现同一方法在不同对象上的不同表现形式,增强了代码的灵活性和可维护性。两者结合使用,可以使Java程序更加安全、灵活且易于维护。
|
10天前
|
Java
Java的封装详解
封装是Java中实现数据隐藏和保护的核心机制。它通过将对象的状态和行为结合并限制外部直接访问,确保类的内部细节对外不可见,仅能通过公共方法访问和修改对象状态。封装带来了数据隐藏、提高代码可维护性和增强安全性等好处。在Java中,封装主要通过将属性设为私有并提供getter和setter方法来实现。这种方式不仅保护了数据完整性,还允许在修改类内部实现时不影响外部代码,从而提升程序的健壮性和可读性。
|
7天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
18 10
Java——类与对象(封装)
|
8天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
8天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
8天前
|
安全 Java Go
面向对象程序设计语言:Java
Java语言语法和C语言和C++语言很接近,很容易学习和使用,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的特性,Java语言不使用指针,而是引用,并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧
25 2
|
8天前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
|
24天前
|
存储 Java 数据库
Java封装
Java封装
17 1
|
4天前
|
Java 开发者
Java编程之旅:探索面向对象的力量
【9月更文挑战第16天】在编程的世界中,Java以其强大的面向对象编程特性而闻名。本文将带你走进Java的世界,一起探索类与对象的奥秘,学习如何通过封装、继承和多态性构建健壮的软件系统。无论你是初学者还是有经验的开发者,本文都旨在提供实用的代码示例,帮助你提升Java技能。准备好开始这段旅程了吗?让我们启程吧!
|
28天前
|
Java 开发者 C++