【封装、构造方法、标准JavaBean】

模块八 封装

在这里插入图片描述

第一章 封装

将一个物品封装起来,外接不能直接调用,提高了物品的安全性

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. JavaBeanJava语言编写类的一种标准规范。
   
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  ->  ConstructorGetter 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对象放到一个容器中,将此容器返回给页面,在页面上遍历展示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值