Tips:样式蚂蚁森林浇水get

java基础——day05-2 类与对象、封装、构造方法

封装

概述

  封装可以理解为一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类数据,必须通过指定的方式。适当的封装可以让代码更易理解与维护,并增强代码的安全性。

原则

  将属性隐藏起来,若要访问某个属性,提供公共方法对其访问。

封装步骤

  1.使用private(私有的)关键字修饰成员变量。

  2.访问private(私有的)成员变量,提供对应的getXXX方法,setXXX方法。

package day05;
//定义一个学生类
public class Student_1 {
    //将学生类的属性私有化 private
    private String name;
    private int age;
    private int s_id;

    //定义学生的成员方法 学习 吃饭
    public void study(){
        System.out.println("我爱学习 学习使我快乐");
    }
    public void eatFood(){
        System.out.println("今天吃肯德基");
    }

    //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性
    //提供可以 修改的 学生名 年龄 学号
    public void setName(String name){
        name = name;
    }

    public void setAge(int age) {
        age = age;
    }

    public void setS_id(int s_id) {
        s_id = s_id;
    }

    //提供可 访问的 学生名 年龄 学号
    public String getName(){
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getS_id(){
        return s_id;
    }
}
定义含私有变量的学生类
package day05;
//定义一个学生类
public class Student_1 {
    //将学生类的属性私有化 private
    private String name;
    private int age;
    private int s_id;

    //定义学生的成员方法 学习 吃饭
    public void study(){
        System.out.println("我爱学习 学习使我快乐");
    }
    public void eatFood(){
        System.out.println("今天吃肯德基");
    }

    //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性
    //提供可以 修改的 学生名 年龄 学号
    public void setName(String name){
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setS_id(int s_id) {
        this.s_id = s_id;
    }

    //提供可 访问的 学生名 年龄 学号
    public String getName(){
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public int getS_id(){
        return this.s_id;
    }
}
实例化学生类

  //注意:通过输出,我们会发现返回的结果为null,0,0,但是我们也用了set方法;这是由于形参变量与成员变量重名,导致成员变量被隐藏,方法中的变量名无法访问到成员变量,从而赋值失败。所以我们需要通过this关键字,来解决重名问题。

封装优化——this关键字

this的含义

  this代表所在类当前对象的引用(地址值),即对象自己的引用

  方法被哪个对象调用,方法中的this就代表哪个对象。即谁调用,this就代表谁

this的格式

  this.成员变量名;

  对上述代码优化后:

package day05;
//定义一个学生类
public class Student_1 {
    //将学生类的属性私有化 private
    private String name;
    private int age;
    private int s_id;

    //定义学生的成员方法 学习 吃饭
    public void study(){
        System.out.println("我爱学习 学习使我快乐");
    }
    public void eatFood(){
        System.out.println("今天吃肯德基");
    }

    //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性
    //提供可以 修改的 学生名 年龄 学号
    public void setName(String name){
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setS_id(int s_id) {
        this.s_id = s_id;
    }

    //提供可 访问的 学生名 年龄 学号
    public String getName(){
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public int getS_id(){
        return this.s_id;
    }
}
优化后的学生类
package day05;

public class day05_5 {
    public static void main(String[] args) {
        //实例化 学生类1
        Student_1 student = new Student_1();
        //通过set方法 为student成员变量(属性)赋值
        student.setName("刘昊然");
        student.setAge(18);
        student.setS_id(20210304);

        //通过get方法 打印输出刘昊然同学的信息(属性)
        System.out.println("我叫"+student.getName()+",今年"+student.getAge()+"岁"+",我的学号是"+student.getS_id());
        //调用student拥有的方法
        student.study();
        student.eatFood();
    }
}
原实例化

  //现在通过set方法和get方法 打印输出的结果正常了。

封装优化——构造方法

  当一个对象被创建时(被实例化),构造方法用来初始化该对象,给对象的成员变量赋初始值

  无论自己是否自定义构造方法,所有类都有构造方法,因为java提供了一个无参数的构造方法。一旦自己定义了构造方法,java自动提供的无参数构造方法就会失效。(你没定,java有;你定了,那就用你的)

构造方法定义格式

  修饰符 构造方法名(参数列表){

  方法体;

  }  

package day05;
//定义一个学生类
public class Student_1 {
    //将学生类的属性私有化 private
    private String name;
    private int age;
    private int s_id;

    //添加构造方法
    //无参数构造方法 必须
    public Student_1(){}
    //有参数构造方法 此处为全参 建议
    public Student_1(String name,int age,int s_id){
        this.name =name;
        this.age = age;
        this.s_id = s_id;
    }

    //定义学生的成员方法 学习 吃饭
    public void study(){
        System.out.println("我爱学习 学习使我快乐");
    }
    public void eatFood(){
        System.out.println("今天吃肯德基");
    }

    //提供getXXX方法 setXXX方法,可以访问成员变量 即成员属性
    //提供可以 修改的 学生名 年龄 学号
    public void setName(String name){
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setS_id(int s_id) {
        this.s_id = s_id;
    }

    //提供可 访问的 学生名 年龄 学号
    public String getName(){
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public int getS_id(){
        return this.s_id;
    }
}
为学生类添加构造方法
package day05;

public class day05_6 {
    public static void main(String[] args) {
        //通过无参数的构造方法创建对象
        Student_1 s = new Student_1();
        System.out.println("姓名:"+s.getName()+" 年龄:"+s.getAge()+" 学号:"+s.getS_id());
        //输出发现其带有的是默认参数值参数值 null 0 0
        //通过set方法 为s赋值
        s.setName("周杰伦");
        s.setAge(40);
        s.setS_id(19901212);
        //再次输出
        System.out.println("姓名:"+s.getName()+" 年龄:"+s.getAge()+" 学号:"+s.getS_id());
        //发现其有对应的参数值了

        System.out.println("=============================================");

        //通过全参的构造方法 实例化一个学生
        Student_1 s1 = new Student_1("迪丽热巴",18,2021030421);
        System.out.println("姓名:"+s1.getName()+" 年龄:"+s1.getAge()+" 学号:"+s1.getS_id());
        //通过输出 发现不用set方法 就能直接输出对应的名字 年龄 学号
    }
}
对比带参与无参的构造方法

注意事项:

  1.若不自定义构造方法,系统会自动给出无参构造方法

  2.若自己定义了构造方法,系统不再提供无参构造方法

  3.构造方法是可以重载的,即可有参,也可无参

标准代码——JavaBean

  JavaBean(对象)是Java语言编写的一种标准规范

  符合JavaBean的类,要求类必须:

  1.具体的(如学生类、猫类.....)

  2.公共的(public)

  3.含无参数的构造方法

  4.提供操作成员变量的set和get方法 

public class ClassName {
    //成员变量
    //构造方法
    //无参构造方法 必须
    //有参构造方法 建议
    //成员方法
    //getXXX
    //setXXX
}

  编写符合JavaBean的类,学生类,代码如下

package day05;

public class Student_2 {
    //1、定义成员变量 姓名 年龄 性别 学号
    private String name;
    private int age;
    private String sex;
    private int sid;
    //-----------------------------------------------------------------------
    //2、定义构造方法
    //无参
    public Student_2(){}
    //含一个参数的
    public Student_2(String name){
        this.name = name;
    }
    //含两个参数的
    public Student_2(String name,int age){
        this.name = name;
        this.age = age;
    }
    //含三个参数的
    public Student_2 (String name,int age,String sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //含全参的
    public Student_2(String name,int age ,String sex,int sid){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.sid =sid;
    }

    //-----------------------------------------------------------------------
    //3.成员方法 成员方法 放在构造方法上面感觉更直观.....
    public void study(){
        System.out.println("好好学习 天天向上");
    }
    public void eatFood(){
        System.out.println("今天吃麦当劳");
    }
    //-----------------------------------------------------------------------
    //4.添加get 和set方法
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    public String getSex(){
        return sex;
    }
    public int getSid(){
        return sid;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }
}
符合JavaBean的学生类

  注意:

  由于构造方法 以及get set方法 太长 建议使用 idea快捷键 Alt+insert 快速生成

 

posted @ 2021-03-04 21:38  心岛未晴  阅读(125)  评论(0)    收藏  举报