什么是封装
就像快递一样我们在网上买的物品,快递都会给我们添加外包装,给我们封装起来,这就是封装
客观世界里每一个事物的内部信息都隐藏在其内部,外界无法直接操作和修改,只能通过指定的方式进行访问和修改。
随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”。
高内聚、低耦合是软件工程中的概念,也是 UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;
耦合指一个软件结构内不同模块之间互连程度的度量。耦合意味着牵一发动全身。
内聚意味着重用和独立,耦合意味着牵一发动全身
而“高内聚,低耦合”的体现之一:
• 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
• 低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。
“高内聚、低耦合”
:其实就是代码之间的相互影响降到最低;
9.2 何为封装性?
所谓封装,就是把客观事物封装到一个类里,并且类可以把自己的数据和方法指定可信的类或者对象开放,向没必要开放的类或者对象隐藏信息。
**通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。**
我们通过使用private修饰封装了属性值那么我们如何获取呢通过get set方法
package com.tedu;
public class Test1 {
public static void main(String[] args) {
Anamail anamail=new Anamail();
//当我添加private修饰符的时候这个地方会报错
// anamail.name="姚明";
// anamail.age=33;
/*
System.out.println(anamail.name);
System.out.println(anamail.age);
*/
anamail.setAge(2);
System.out.println(anamail.getAge());
anamail.eat();
}
}
class Anamail{
String name;
//如果我们在这里不添加private修饰符可以直接调用
private int age;
public void eat(){
System.out.println("今天吃的啥");
}
//set方法是专门用来给属性设置值
public void setAge(int a){
//大于等于0的偶数
if (age>=0 && age % 2==0){
age=a;
}else {
System.out.println("你打印的值是非法的");
}
}
//get方法是用来给属性获取值
public int getAge(){
return age;
}
}
9.3 Java 如何实现数据封装
• 实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符,也称为权
限修饰符来控制。
• 权限修饰符:public、protected、默认(default)、private。具体访问范围如下
TIPS:default是表示不写修饰符,默认,如果写default单词来修饰会报错
注意:类只能使用public 、默认(default)修饰,
类的成员这几种修饰符都可以使用
创建包: cn.tedu.oop
创建类: TestPrivate2.java
package cn.tedu.oop;
/*本类用于练习OOP的第一大特性:封装*/
public class TestPrivate2 {
public static void main(String[] args) {
//4.创建学生类对象s
Student s = new Student();
//5.通过对象修改并查看属性值
s.sno = 1;
//s.name = "黄飞鸿";
//s.subject = "Java培优";
System.out.println(s.sno);
//System.out.println(s.name);
//System.out.println(s.subject);
//6.通过对象调用方法
s.study();
s.eat();
s.sleep();
//7.3使用刚刚生成的set()设置值方法与get()获取值方法
s.setName("十三姨");
s.setSubject("美容美发");
System.out.println(s.getName());
System.out.println(s.getSubject());
}
}
//1.定义类描述学生这一类型Student
class Student {
//2.特征:学号sno 姓名name 科目subject
//7.1 封装属性--用private修饰属性
int sno;
private String name;
private String subject;
//7.2提供被封装属性的get与set方法
//右键->Generate->Getter and Setter->Shift选择属性->OK
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
//3.定义学生的功能:学习 吃饭 睡觉
public void study() {
System.out.println("正在学习中...");
}
public void eat() {
System.out.println("吃饭ing...");
}
public void sleep() {
System.out.println("我一点也不想睡觉,就想学Java!");
}
}
创建包: cn.tedu.oop
创建类: TestPrivate3.java
package cn.tedu.oop;
/*本类用于测试方法的封装*/
public class TestPrivate3 {
public static void main(String[] args) {
//4.创建对象测试
Apple a = new Apple();
//5.没有封装方法时,调用没有限制
//a.eat();//封装eat(),此处调用报错
a.clean();
}
}
//1.创建苹果类
class Apple{
//2.定义方法1
public void clean(){
System.out.println("苹果还是要洗洗的~");
//6.在已有的公共方法clean()中调用被封装eat()方法的功能
eat();
}
//3.定义方法2
private void eat(){
System.out.println("要吃苹果啦~");
}
}
创建包:cn.tedu.oop
创建类:TestCar
package cn.tedu.oop;
/*本类用于面向对象的巩固练习*/
public class TestCar {
//创建程序的入口函数main()
public static void main(String[] args) {
//3.创建汽车类对象c
Car c = new Car();
//4.通过汽车类对象c设置属性值
// c.color = "暗夜紫";
// c.brand = "BMW";
// c.price = 200;
// c.length = 0.2;
//5.查看刚刚设置好的属性值
// System.out.println(c.brand);
// System.out.println(c.price);
// System.out.println(c.color);
// System.out.println(c.length);
//6.通过c对象调用汽车类的方法
c.start();
//c.stop();
//7.3调用提供的set与get方法,设置并获取对应属性的值
c.setBrand("特斯拉");
c.setColor("black");
c.setPrice(200.02);
c.setLength(3);
System.out.println(c.getBrand());
System.out.println(c.getColor());
System.out.println(c.getLength());
System.out.println(c.getPrice());
//8.3 调用公共方法来实现私有方法功能的使用
c.start();
}
}
//1.抽象汽车这一类事物的属性与行为,封装成一个类组件
class Car{
//2.属性--用成员变量来描述
//7.1封装所有的属性值--使用private修饰
private String color;
private String brand;
private double price;
private double length;
//7.2 生成所有属性的get与set方法
/*右键空白处->Generate->Getter and Setter->按住Shift全选所有属性生成即可*/
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
//3.行为--用方法来描述
//8.2 可以在本类公共的方法里,调用私有方法
public void start(){
System.out.println("汽车开动了~");
stop();//我们通过方法名+参数列表确定要调用哪个方法
}
//8.1封装方法,通过private修饰符
private void stop(){
System.out.println("汽车停止了~");
}
}