java----面向对象之封装

问题:

1.为什么要进行封装?
2.解决方式?
3.对属性封装的步骤?

答:

1.通过对象名直接访问成员变量的方式来对属性赋值,会存在数据安全隐患
2.解决方式: 不让外界直接访问成员变量(也就是要对属性进行封装)
3.封装的步骤:
1.使用private关键字修饰成员变量
2.提供公共的访问方式: 设置属性值的方法(set方法),获取属性值的方法(get方法)

创建学生对象以及测试类

public class Student {
    // 成员变量
    String name;
    int age;
}

public class Test {
    public static void main(String[] args) {
        // 创建Student对象
        Student stu = new Student();
        // 访问成员变量
        stu.name = "冰冰";
        stu.age = -18;
        System.out.println(stu.name + "," + stu.age);// 冰冰,-18
    }
}

set、get方法书写

public class Student {
  private String name;
  private int age;

  public void setName(String n) {
    name = n;
  }

  public String getName() {
    return name;
  }

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

  public int getAge() {
    return age;
  }
}
  • get方法: 用于获取成员变量的值,方法用public修饰,有返回值,无参数,方法名getXXXX(),一定会返回属性的值
  • set方法: 用于设置成员变量的值,方法用public修饰,无返回值,有参数,方法名setXXXX(),一定会为属性赋值
    this关键字的使用
    我们发现 setXxx 方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下:
public class Student {
  private String name;
  private int age;

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

  public void setAge(int age){// 批量修改名称: shift+f6
        // 判断
        if (age < 0 || age > 100){
            this.age = -1; // -1表示数据不合法
        }else {
            this.age = age;
        }
    }
}

public class Test {
    public static void main(String[] args) {
        /*
            问题1: set方法的形参名没有起到知名达意
            解决1: 修改形参名为属性名
            问题2: 如果set方法的形参名和属性名一致了,就会造成给属性变量赋值不成功
            解决2: 使用this关键字解决
         */

        // 创建Student对象
        Student stu = new Student();

        // 为属性设置值
        stu.setName("冰冰");
        stu.setAge(18);

        // 取出属性的值
        System.out.println(stu.getName());// null
        System.out.println(stu.getAge());// 0
    }
}

经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了setXxx() 的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。

  • this含义: this代表当前调用方法的引用,哪个对象调用this所在的方法,this就代表哪一个对象

  • this关键字其主要作用是区分同名的局部变量和成员变量

    • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
    • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

- this的使用格式:

  • this**.**成员变量名
    使用 this 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student {
    // 成员变量
    private int age;
    private String name;

    // name属性的set方法(为name属性赋值用的)
    public void setName(String name){
        this.name = name;
    }

    // age属性的set方法(为age属性赋值用的)
    public void setAge(int age){// 批量修改名称: shift+f6
        // 判断
        if (age < 0 || age > 120){
            this.age = -1; // -1表示数据不合法
        }else {
            this.age = age;
        }
    }

    // name属性的get方法(获取name属性的值)
    public String getName(){
        return name;
  }

    // age属性的get方法(获取age属性的值)
    public int getAge(){
        return age;
    }
}

public class Test {
    public static void main(String[] args) {
        /*
            问题1: set方法的形参名没有起到知名达意
            解决1: 修改形参名为属性名

            问题2: 如果set方法的形参名和属性名一致了,就会造成给属性变量赋值不成功
            解决2: 使用this关键字解决
            原因: this关键字可以用来区分同名的成员变量和局部变量
            格式:   this.成员变量名
            this表示谁: 哪个对象调用this所在的方法,this就代表哪个对象
         */

        // 创建Student对象
        Student stu = new Student();

        // 为属性设置值
        stu.setName("冰冰");
        stu.setAge(18);

        // 取出属性的值
        System.out.println(stu.getName());// 冰冰
        System.out.println(stu.getAge());// 18
    }
}

总结:谁通过调用this所在的方法,this就是谁!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值