面向对象之封装
1. 面向对象思想概述
什么是面向对象?
- 面向:
基本义:面对、朝向
引申义:注重、关注 - 对象:
世间一切的事物 - 面向对象思想:
面向对象思想就是把关注点放在一件事或一个活动中涉及到的人或事(也就是对象) 上的思想(或思维方式) - 面向过程思想
面向过程思想就是把关注点放在一件事或一个活动中涉及到的步骤(也就是过程) 上的思想(或思维方式)
面向对象思想特点
- 是一种更符合人们思考习惯的思想
- 把复杂的事情简单化
- 把人们从执行者变成了指挥者
面向对象的程序开发
就是不断的找对象、使用对象、指挥对象做事情的过程
没有对象? 创建一个!
面向对象思想特征
- 封装(encapsulation)
- 继承(inheritance)
- 多态(polymorphism)
2. 类与对象
Java中如何描述一个事物?
Java中通过“类”来描述事物,类主要由属性和行为构成。
类的概念
即归类,分类,是一系列具有相同属性和行为的事物的统称
属性:品牌、型号、名称…
行为:打电话、发短信、玩游戏…
抽象
把一系列相关事务共同的属性和行为提取出来的过程
什么是对象
某一类事物的某个具体存在
类和对象的关系
类:属性和行为的集合,是一个抽象概念
对象:是该类事物的具体体现,是一种具体存在
举例:
手机——————>类
这部iphone手机—>对象
3. 类的定义和使用
如何定义一个类?
定义类的过程,就是把一系列相关事务共同的属性和行为抽取出来的过程
事物的属性,在类中叫成员变量
事物的行为,在类中叫成员方法
如何创建一个对象?
类名 对象名 = new 类名();
如何使用一个对象?
对象名.变量名
对象名.方法名(…)
手机类的定义和使用
- 代码演示
/*
定义一个手机类
*/
public class Phone {
// 成员变量:定义在类中,方法外的变量
// 品牌
String brand;
// 型号
String model;
// 名称
String name;
// 成员方法:先不写static修饰符
// 打电话
public void call(String name) {
System.out.println("给" + name + "打电话");
}
// 发短信
public void sendMessage() {
System.out.println("发短信");
}
// 打游戏
public void playGame() {
System.out.println("打游戏");
}
}
/*
手机类的测试类
*/
public class TestPhone {
// main方法时程序的主入口,所有代码的执行都是从这里开始的
public static void main(String[] args) {
// 1. 创建对象
Phone p = new Phone();
// 2. 调用成员变量,并打印
// 给成员变量赋值
p.brand = "苹果";
p.model = "X";
p.name = "程序猿";
// 打印成员变量的值
System.out.println(p.brand);
System.out.println(p.model);
System.out.println(p.name);
// 3. 调用成员方法
System.out.println("----------------------");
p.call("乔布斯");
p.sendMessage();
p.playGame();
}
}
- 运行结果
学生类的定义和使用
- 代码演示
/*
定义一个学生类
*/
public class Student {
// 成员变量
// 姓名
String name; // 成员变量
// 年龄
int age;
// 成员方法
// 学习
public void study() {
// String name = "李四"; // 局部变量
System.out.println(name + "正在学习");
}
}
/*
学生类的测试类
局部位置:
方法的参数列表或者方法体语句(方法内部)
成员位置:
类中,方法外
Java中使用变量的规则:
使用变量遵循“就近原则”,如果局部位置有,就使用
没有就去本类的成员位置找,有就使用,没有就报错.(先这么记,不严谨)
*/
public class TestStudent {
// main方法时程序的主入口,所有的代码都是从这里开始执行的
public static void main(String[] args) {
// 1. 创建学生类的对象
Student student = new Student();
// 2. 给成员变量赋值,并打印结果
student.name = "张三";
student.age = 10;
System.out.println(student.name);
System.out.println(student.age);
System.out.println("--------------");
// 3. 调用成员方法
student.study();
}
}
- 运行结果
如果把学生类中study方法中的注释去掉,打印结果就是李四正在学习(就近原则)
一个对象创建过程的内存图解
两个对象创建过程的内存图解
对象作为参数的内存图解
Java中使用变量的规则
成员变量和局部的区别
- 定义位置
成员变量:类中,方法外
局部变量:方法中,或形式参数 - 初始化值
成员变量:有默认初始化值
局部变量:无默认初始化值,必须先赋值再使用 - 作用范围
成员变量:在类中
局部变量:在方法中 - 内存中的位置
成员变量:堆内存
局部变量:栈内存 - 生命周期
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法调用完毕而消失 - 注意事项
局部变量和成员变量重名时,采用就近原则
4. 封装概述
什么是封装?
- 引申义
把一些列功能打包到一台设备里,提供使用这些功能的界面 - 常见的封装体
汽车、电脑、洗衣机…
封装的好处
- 提高安全性
- 提高复用性
- 将复杂的事情简单化
思考:Java中那些内容体现了封装?
方法、类…
Java中的封装载体
- 方法:
安全性:调用者不知道方法的具体实现
复用性:方法可以被重复使用
简单化:将繁多的代码以一个方法的方式呈现,
仅通过调用方法就尅实现功能;代码维护也变得简单 - 类:
安全性:调用者不知道类的具体实现
复用性:类的对象可以被重复使用
简单化:类的对象包含了更多的功能,使用起来也更方便
Demo
- 代码演示
/*
定义一个类,演示封装
*/
public class Student {
// 成员变量
String name; // 姓名
private int age; // 年龄
// 提供公共的访问方式,分别设置值,获取值
// 设置age的值
public void setAge(int a) {
// 在这里,对Age的值进行限定
// 这里虽然可以对age的值做限定,但是不用做
// 因为从前端传过来的数据本身就是已经校验过的合法的数据.
/*if (a > 200 || a <= 0) {
// 非法值
age = 1;
} else {
// 合法值
age = a;
}*/
age = a;
}
// 获取age的值
public int getAge() {
return age;
}
// 成员方法
// 学习
public void study() {
System.out.println(name + "正在学习");
}
}
// private一般用来修饰成员变量
// public一般用来修饰成员方法
public class TestStudent {
public static void main(String[] args) {
// 创建学生类的对象
Student stu = new Student();
// 给它的年龄赋值为23
/*stu.age = 23;
// 打印结果
System.out.println(stu.age);*/
// 设置值
stu.setAge(23);
stu.name = "张三";
// 获取值
System.out.println(stu.getAge());
// 需求调用成员方法
stu.study();
}
}
- 运行结果
5. private关键字
private的基本概念
私有的,一种访问权限修饰符,用来修饰类的成员
特点
被修饰的成员只能在本类中访问
用法
private 数据类型 变量名;
private 返回值类型 方法名(参数列表){ }
拓展
public,公用的,访问权限修饰符,用来修饰类、成员变量、成员方法等,被修饰的内容可以在任意类中访问
6. this关键字
this的基本概念
这,这个,表示本类对象的引用,本质是一个对象
特点
每一个普通方法都是一个this,谁调用该方法,this就指向谁
用法
rhis.属性名;
this.方法名(参数);
案例使用this完善set方法
- 代码演示
/*
定义一个学生类,用来演示this关键字
*/
public class Student {
// 成员变量
private int age = 20;
// 设置年龄
public void setAge(int age) {
this.age = age;
}
// 获取年龄
public int getAge() {
return age;
}
// 为了让你更好的理解this的作用,先做一个测试题
public void show() {
// 局部变量
int age = 10;
System.out.println(age);
System.out.println(this.age);
}
}
public class TestStudent {
public static void main(String[] args) {
// 需求1:调用show()方法
Student stu = new Student();
stu.show();
System.out.println("-----------------");
// 需求2:按照格式,优化setAge()中的参数名,并调用
// 设置年龄
stu.setAge(21);
// 获取年龄
System.out.println(stu.getAge());
}
}
- 运行结果
7. 标准代码:JavaBean
构造方法的基本概念
构造、创建,也叫构造器,用来帮助创建对象的方法,准确的说,构造方法的作用是初始化对象。
谁来创建对象?
new关键字。Java中通过new关键字创建对象,并在内存中开辟空间,然后使用构造方法(构造器)完成对象的初始化工作。
构造方法的定义
格式
修饰符 构造方法名()参数列表{
// 方法体
}
要求
方法名必须与类名相同
没有返回值
没有返回值类型
注意事项
若未提供任何构造方法,系统会给出默认无参构造
若已提供任何构造方法,系统不再提供无参构造
构造方法可以重载
案例
- 代码演示
/*
定义一个学生类
*/
public class Student {
// 构造方法
// 无参构造
public Student() { }
// 带参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 成员变量
private String name;
private int age;
// 设置姓名
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 class TestStudent {
public static void main(String[] args) {
// 需求:定义一个姓名叫:张三,年龄为23岁的学生
// 格式一:通过无参构造实现
Student stu = new Student();
stu.setName("张三");
stu.setAge(23);
System.out.println(stu.getName());
System.out.println(stu.getAge());
System.out.println("---------------");
// 格式二:通过构造方法实现快速初始化
Student stu2 = new Student("李四",24);
System.out.println(stu2.getName());
System.out.println(stu2.getAge());
}
}
- 运行结果
标准代码:JavaBean
Java语言编写类的标准规范。符合JavaBean标准的类,必须是具体的、公开的,并且具有无参数的构造方法,提供用来操作成员变量的set和get方法
Java中封装的概念
将一系列相关事务共同的属性和行为提取出来,放到一个类中,隐藏对象的属性和实现细节,仅对外提供公共的访问方式
封装的关键
绝对不能让诶中的方法直接访问其他类的数据(属性),程序仅通过对象的方法与对象的数据进行交互
案例
- 代码演示
/*
定义一个标准的JavaBean类
*/
public class Student {
// 成员变量,全部用private修饰
private String name;
private int age;
// 构造方法,无参构造,全参构造
// 无参构造
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 class TestStudent {
public static void main(String[] args) {
// 需求:通过空参创建对象
Student stu1 = new Student();
stu1.setName("张三");
stu1.setAge(23);
System.out.println(stu1.getName());
System.out.println(stu1.getAge());
// 需求:通过全参创建对象
Student stu2 = new Student("李四", 21);
System.out.println(stu2.getName());
System.out.println(stu2.getAge());
}
}
- 运行结果