@[toc]
引入与概念
为什么需要封装 ? 封装的作用和含义 ?
我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗?有必要碰电动机吗?
我们的程序设计追求
高内聚,低耦合
。
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅对外暴露少量的方法用于使用。
隐藏对象内部的复杂性,只对外公开简单的接口 。
便于外界调用,从而提高系统的可扩展性、可维护性通俗的说,
把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
具体理解封装性
一、问题的引入:
当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。但除此之外,没有其他制约条件。但是,实际问题中,我们往往需要给属性赋值加入额外限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行条件的添加。比如说,setLegs同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)。此时,针对于属性就体现了封装性。
二、封装性的体现:
我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
拓展:封装性的体现:① 如上 ② 不对外暴露的私有方法 ③ 单例模式 ...
三、封装性的体现,需要权限修饰符来配合
- Java规定的4种权限(从小到大排列):private、缺省、protected、public
- 4种权限可以用来修饰类及类的内部结构: 属性、方法、构造器、内部类
- 具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类。
修饰类
的话,只能用:缺省、public
封装性总结:
Java提供了4种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。
四种权限修饰符
Java 权限修饰符public、protected、default(缺省)、private
置于类的成员(属性、方法)定义前,用来限定对象对该类成员的访问权限。
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | √ | |||
default(缺省) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
修饰类的话,只能用:缺省、public
- public 类可以在任意地方被访问。
- default 类只可以被同一个包内部的类访问。
构造器(构造方法)
一、构造器的作用
- 创建对象
- 初始化对象的信息
简单来说,当我们创建对象时,如 Scanner scanner = new Scanner();。
new 的并不是Scanner类(PS:类后面还加啥括号呢?),而是 Scanner() 构造器!!!所以,只要造对象,就得用构造器!!!
二、说明
- 如果没有显示定义类的构造器的话,则系统默认提供一个空参的构造器
- 定义构造器的格式: 权限修饰符 类名(形参列表) { }
- 一个类中定义的多个构造器,彼此构成重载
- 一旦显式的定义了类的构造器之后,系统就不再提供默认的空参构造器(如果不用的话,不写是不会报错的;如果创建对象时需要用到空参构造器,这时候得自己添上空参构造器)
- 一个类中,至少会有一个构造器
只要造对象,就得用构造器!!!
属性赋值的先后顺序
- 默认初始化(微观看不见,一定义属性就有了)
- 显示初始化(定义属性时给属性赋值)
- 构造器中初始化
- 通过
对象.方法
或对象.属性
的方式,赋值
前三条1.2.3.只能执行一次,最后一条4. 能反复执行
操作先后顺序:1. ——> 2. ——> 3. ——> 4.
JavaBean
JavaBean 是一种 Java 语言写成的可重用组件。
所谓 JavaBean,是指符合如下标准的 Java 类:
- 类是
公共的
- 有一个
无参
的公共的构造器 - 有属性,且有对应的 get、set 方法
this关键字是什么
在Java中,this关键字的作用和其词义很接近。
- this在方法内部使用时,表示这个方法所属对象的引用;
- this在构造器内部使用时,表示该构造器正在初始化的对象。
this表示当前对象,可以调用类的属性、方法、构造器
什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this
具体的:我们可以用this来区分局部变量和属性。
比如:this.name = name;
this关键字的使用
一、this可以用来修饰:属性、方法、构造器
二、this修饰属性和方法
this理解为:当前对象(调用对象的属性和方法时) 或 当前正在创建的对象(构造器中使用)
- 在类的方法中,可以使用
this.属性
或this.方法
的方式,调用当前对象的属性或方法。但是,在通常情况下,我们都选择省略this.
。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显示的使用this.变量
的方式,表示此变量是属性,而非形参。
举个例子:this.name = name
- 在类的构造器中,可以使用
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调用构造器
- 我们在类的构造器中,可以显式的使用
this(形参列表)
方式,调用本类中指定的其它构造器 - 构造器中不能通过
this(形参列表)
方式调用自己 - 如果一个类中有 n 个构造器,则最多有 n-1 个构造器中使用了
this(形参列表)
(因为不能产生死循环) - 规定:
this(形参列表)
必须声明在当前构造器的首行
- 构造器内部,最多只能声明一个
this(形参列表)
,用来调用其他构造器
(不能连着调两个构造器,而且第二个也不满足 4. 啊)
import关键字的使用
import导入:
- 在源文件中显示的使用import结构导入指定包下的类、接口。
- 声明在包的声明和类的声明之间。
- 如果需要导入多个结构,则并列写出即可。
- 可以使用
xxx.*
的方法,表示导入xxx包下的所有结构
。(所有结构指类和接口,子包不算) - 如果使用的类和接口是 java.lang 包下定义的,则可以忽略import结构。
- 如果使用的类或接口是本包下定义的,则可以忽略import结构。
- 如果在源文件中,使用了
不同包下的同名类
,则必须至少有一个类需要以全类名
的方式显示。 - 使用
xxx.*
方式表明可以调用xxx包下的所有结构
。但是如果使用的是xxx子包下的结构,则仍需要显示导入 - 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关键字的使用
- 为了更好的实现项目中类的管理,提供包的概念。
- 使用 package 声明类或接口所属的包,声明在源文件的首行。
- 包,属于标识符,遵循标识符的命名规则、规范
见名知意
。 - 每
.
一次,就代表一层文件目录。
补充:同一个包下,不能命名同名接口或同名类;不同包下,可以命名同名的接口、类。
JDK 中主要的包介绍
- java.lang —— 包含一些 Java 语言的核心类,如 String、Math、Integer、System 和 Thread,提供常用功能。
- java.net —— 包含执行与网络相关的操作的类和接口。
- java.io —— 包含能提供多种输入/输出功能的类。
- java.util —— 包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
- java.text —— 包含了一些 java 格式化相关的类
- java.sql —— 包含了 java 进行 JDBC 数据库编程的相关类/接口
- java.awt —— 包含了构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。B/S C/S