模块八 封装
第一章 封装
将一个物品封装起来,外接不能直接调用,提高了物品的安全性
1. 封装的介绍
1. 面向对象三大特征: 【封装】 继承 多态 Java的核心思想是面向对象编程思想,面向对象编程又有三个核心:封装,继承,多态 2. 什么是封装思想: a. 我们找来了一个对象(洗衣机),只需要按一下按钮就可以了(使用洗衣机功能的过程就是在使用面向对象思想编程的过程),每一个按钮下面都包含了很多内部结构的细节(细节被封装到按钮里面了 -> 封装),在使用的时候有必要了解洗衣机的内部构造吗?我们没有必要去了解内部结构,我们只知道调用就可以了 所以,洗衣机来说,将细节隐藏起来了,细节我们不要关注,会对外提供了一个公共的接口(按钮),供我们人类使用。 b. 隐藏对象内部的复杂性,只对外提供公开,公共的接口,便于外接调用,从而提高了系统的可扩展性,可维护性,安全性,通俗来说,把该隐藏的隐藏起来(细节),把该暴露的暴露出来(对外提供的供别人使用的接口),这就是封装思想。 我们只需要调用这个接口(功能即可),此接口背后封装起来的细节就开始执行了,但是我们不需要关注细节, 只关注公共的接口怎么调用。 c. 将细节隐藏起来,不让外界随便使用,但是我们可以提供一个公共的接口让外接间接使用隐藏起来的细节 -> 封装思想 3. private 关键字是封装思想中具有代表性的关键字,并不是说有private才用到了封装思想
2. 封装的使用
2.1
private
关键字的使用1. 问题: 定义成员变量,只要是new出来对象,就可以随便调用,随便赋值,哪怕是不合理的值我们也挡不住,怎么办?(int age; person.age = -18;) 将属性封装起来(隐藏细节) a. 关键字: private (私有化的):被private修饰的成员只能在本类中使用,在 别的类中使用不了 b. 注意: 将代码放到一个方法中,也是封装的体现 一个成员被private修饰也是封装的体现,只不过private最具代表性 c. private 的使用 修饰成员变量:private 数据类型 变量名 修饰方法:将 public 改成 private,其他的都一样
2.2
get/set
方法的使用将成员变量用private封装起来之后,外界使用不了。 public class Person { private String name; private int age; } 需要对外提供公共的接口,来间接让外界调用。 ---------------------------------------------------------------- 问题:属性被私有化了,只能在本类中使用,外界直接调用不了,那么此时属性就不能直接赋值 取值了,/*所以需要提供公共的接口 -> get/set方法*/ set方法:为属性赋值 get方法:获取属性值
public class Person { private String name; private int age; //为name提供get/set方法 //set方法是赋值,不需要返回值,所以是void public void setName(String xinMing){ name = xinMing; } //get方法是获取值,需要把name返回,有返回值所以是String public String getName(){ return name; } //为age提供get/set方法供外界间接调用 public void setAge(int nianLing){ if(nianLing< 0 || nianLing > 150){ System.out.println("年龄不合理"); } else{ age = nianLing; } } public int getAge(){ return age; } }
public class Test01 { public static void main(String[] args) { Person person = new Person(); // person.name = "小王"; // person.age = -19; // System.out.println(person.age); // System.out.println(person.name); person.setName("小王"); // person.setAge(-18);//年龄不合理 返回默认值0 person.setAge(18);//年龄合理 返回18 String name = person.getName(); int age = person.getAge(); System.out.println(name); System.out.println(age); } }
执行流程
小结:
用private 将属性封装起来,外界不能直接调用,保护了属性
对外提供一套公共的接口(get/set方法),让外界通过公共的接口间接使用封装起来的属性。
2.3
this
关键字的基本使用1. 如果成员变量和局部变量重名时,遵循"就近原则",离谁近 访问谁。 2. this概述:代表的是当前对象 3. 作用:this可以区分重名的成员变量和局部变量 因为this代表的是对象,this点出来的一定是成员变量,不是局部变量 4. this 代表当前对象,那么具体代表哪个对象? "哪个对象调用的this所在的方法,this就代表哪个对象。"
public class Person { String name; public void speak(String name){ //成员变量和局部变量重名,就近原则 System.out.println(name + "您好,我是" + name); //this代表的是当前对象,this点出来的是成员变量 /* this具体代表的是哪个对象呢?-> 哪个对象调用的this所在的方法,this就代表哪个对象。 在类Test01中 person.speak("王爸"); 是person调用的speak,则speak里面的this就代表person对象。 */ System.out.println(this.name + "您好,我是" + name); System.out.println("this的地址值为" + this); } }
public class Test01 { public static void main(String[] args) { Person person = new Person(); person.name = "小王"; person.speak("王爸"); System.out.println("person的地址值为" + person); Person person1 = new Person(); person1.name = "奥特曼"; person1.speak("奥特曼之父"); System.out.println("person1的地址值为" + person1); } }
执行流程
2.4 标准的get/set方法
标准的get/set方法,成员变量和局部变量重名,用this区分成员变量和局部变量 this.后面的是成员变量 通过局部变量给成员变量赋值。
public class Person { private String name; private int age; //标准的get/set方法,成员变量和局部变量重名 //成员变量和局部变量重名 get/set方法 /* * this.后面的是成员变量 * */ public void setName(String name){ this.name = name; } public String getName(){ return name; } //为age提供get/set方法供外界间接调用 public void setAge(int age){ if(age< 0 || age > 150){ System.out.println("年龄不合理"); } else{ this.age = age; } } public int getAge(){ return age; } }
public class Test01 { public static void main(String[] args) { Person person = new Person(); person.setName("小王"); person.setAge(19); System.out.println(person.getName() + "...." + person.getAge()); } }
3. 构造方法的定义和使用
1. 概述:方法名和类名一致,并且能初始化对象的方法 2. 分类: a. 无参构造:没有参数 b. 有参构造:有参数,参数是为指定的属性赋值 c. 满参构造:给所有属性赋值 以上构造我们就记有参和无参构造就行 3. 特点: a. 方法名和类名一致 b. 没有返回值,且没有void
3.1 无参构造(空参构造)
1. 格式: public 类名(){} //里面可以什么也不写,此方法也可不写,jvm自动提供 2.作用: new对象使用 3. 特点: "每个类中默认都有一个无参构造方法,不写也有,jvm会自动提供。" 4. 使用: 一new对象就是在调用构造方法
3.2 有参构造
1. 格式: public 类名(形参){ 为属性赋值 } 2. 作用: a. new 对象 b. 为属性赋值 3. 特点: jvm会提供无参构造,jvm不会自动提供有参构造, 但是将有参构造手写出来,jvm也不再提供无参构造 所以建议,无参,有参构造都自己手写上去。
public class Person { //无参构造,不写jvm也自动提供 public Person(){ System.out.println("我是无参构造"); } //有参构造 //有参构造写出来后,jvm不自动提供无参构造,得自己手写无参构造 public Person(String name){ this.name = name; } public Person(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 Test01 { public static void main(String[] args) { Person person = new Person(); Person person1 = new Person("小李",21); System.out.println(person.getName() + "..." + person.getAge()); System.out.println(person1.getName() + "..." + person1.getAge()); } }
小结
set方法和有参构造方法都可以属性赋值,但取值只有get方法可以。
如何快手知道调用的成员是哪个类中的哪个成员呢?
按住ctrl不放,鼠标点击对应的成员 -> 会跳到对应的位置
4.标准JavaBean
1. JavaBean 是Java语言编写类的一种标准规范。 2. 符合JavaBean的类 要求: (1)类必须是具体的和公共的, public class 类名 , 非抽象的(abstract) (2)并且具有无参构造和有参构造方法 (3)成员变量私有化(private),并且提供用来操作成员变量的 set/get 方法
com.atguigu.controller -> 专门放和页面打交道的类(表现层) com.atguigu.service -> 专门放业务处理的类(业务层) com.atguigu.dao -> 专门放和数据库打交道的类(持久层) com.atguigu.pojo -> 专门放javabean类 com.atguigu.utils -> 专门放工具类
编写符合JAvaBean规范的类,以学生类为例,标准代码如下: //类是具体且公共的 public class Student { //私有属性 private int sid;//学号 private String sname;//姓名 //无参构造 public Student(){} //有参构造 public Student(int sid,String sname){ this.sid = sid; this.sname = sname; } //set/get方法 public void setSname(String sname) { this.sname = sname; } public String getSname() { return sname; } public void setSid(int sid) { this.sid = sid; } public int getSid() { return sid; } }
快速生成标准javabean快捷键: alt + inset -> Constructor 、Getter and Setter
给学生类赋值,并且取值 public class Test01 { public static void main(String[] args) { //赋值 用有参构造方法赋值 Student stu = new Student(18,"小王"); //用set方法赋值 Student stu2 = new Student(); stu2.setSid(20); stu2.setSname("小黎"); //只能用get方法取值 System.out.println(stu.getSid()+"..." +stu.getSname()); System.out.println(stu2.getSid()+ "..."+ stu2.getSname()); } }
5. 小结
1. private的作用是什么? private 让成员变量变成私有属性,别的类不能直接使用。 2. 空参构造的作用是什么? new对象 -> 具有空参构造,才能让别的类调用这个类的属性。 3. 有参构造的作用是什么? 1. new对象 2. 为属性赋值 4. set方法的作用是什么? 给属性赋值 5. get方法的作用是什么? 获取属性的值 6. this关键字的作用是什么? 用来区分重名的成员变量和局部变量,this点后面的是成员变量 7. IDEA快捷键生成JAvaBean? alt + insert
6 . JavaBean怎么来的
1. 将来的JavaBean都是和数据库的表相关联 a. 类名 对应 表名 b. 属性名 列名 c. 对象 表中每一行数据 d. 属性值 表中单元格中的数据 2. JvaBean主要起封装数据的作用。
将页面填写的数据获取到,封装到 javabean中,一层一层传递到dao层,然后将javabean中的属性获取出来放到表中保存,-> 相当于是一个添加功能。
将所有的数据查询出来,封装成一个一个的javabean对象,然后将封装好的javabean对象放到一个容器中,将此容器返回给页面,在页面上遍历展示。