封装之private和this的使用

文章介绍了Java中的封装概念,强调了private修饰符在限制成员变量访问权限上的作用,以及如何通过public的set和get方法进行安全的数据操作。同时,解释了this关键字在解决局部变量和成员变量重名问题上的功能,确保正确地引用类的成员变量。

一、什么是封装

封装是面向对象三大特征之一,对象代表什么,就得封装对应的数据,并提供数据对应的行为

二、private的使用

当把学生测试类的age设置成如下结果时,会有什么样的结果呢?

        s.name = "张三";
        s.age = -23;
        System.out.println(s.name);
        System.out.println(s.age);

 年龄为负数,这是不符合常理的,这时就需要用到private了

private是个权限修饰符,可以修饰成员变量和成员方法,被private修饰的成员只能在本类中使用

private int age;

再使用s.age=-23会报错,可是s.age=23还会报错,因为private修饰的age只能在Student类中使用

接下来每一个属性都要提供一个由public修饰的set和get方法

    //设置值   给成员变量赋值
    public void setAge(int a) {
        if (a > 0 && a < 120) {
            age = a;
        } else {
            System.out.println("输出有误");
        }
    }

    //获取值  对外提供成员变量的值
    public int getAge() {
        return age;
    }

这样,学生的测试类代码如下:

        //创建对象
        Student2 s=new Student2();
        //赋值
        s.setName("张三");
        s.setAge(13);
        //获取并输出
        System.out.println(s.getName());
        System.out.println(s.getAge());

当年龄设置成负数时,代码如下:

         //创建对象
        Student2 s=new Student2();
        //赋值
        s.setName("张三");
        s.setAge(-13);
        //获取并输出
        System.out.println(s.getName());
        System.out.println(s.getAge());

会有以下结果:

 三、this的使用

以上代码中的set和get方法不够严谨,因为定义的变量不能做到见名知意,如setAge中的int a,应该inr age,String na同样如此,完整代码如下:

package oopText;

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

    //设置值
    public void setAge(int age) {
        if (age > 0 && age < 120) {
            age = age;
        } else {
            System.out.println("输出有误");
        }
    }

    //获取值
    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

    public void show() {
        System.out.println(name + "..." + age);
    }
}

可是测试类中会有以下输出结果:

package oopText;

public class StudentTest2 {
    public static void main(String[] args) {
        //创建对象
        Student2 s=new Student2();
        //赋值
        s.setName("张三");
        s.setAge(13);
        //获取并输出
        System.out.println(s.getName());
        System.out.println(s.getAge());
        s.show();
    }
}

 由输出可知,成员变量的赋值失败了,原因:方法中的局部变量和成员变量重名了,当重名时,java会使用就近原则,简单来说就是那个变量离我更近,我就使用谁,由代码可以,局部变量更近,所以name=name使用的都是局部变量,局部变量自己给自己赋值,根本没有触碰到成员变量,所以会输出String 的默认值null,age同样是这个道理。

如果想要重名,还要局部变量给成员变量赋值,就需要使用this关键字,将等号左边的name改为this.name

学生类代码:

package oopText;

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

    //设置值
    public void setAge(int age) {
        if (age > 0 && age < 120) {
            this.age = age;
        } else {
            System.out.println("输出有误");
        }
    }

    //获取值
    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

    public void show() {
        System.out.println(name + "..." + age);
    }
}

学生测试类代码:

package oopText;

public class StudentTest2 {
    public static void main(String[] args) {
        //创建对象
        Student2 s=new Student2();
        //赋值
        s.setName("张三");
        s.setAge(13);
        //获取并输出
        System.out.println(s.getName());
        System.out.println(s.getAge());
        s.show();
    }
}

输出如下:

 由以上可知:this关键字的作用可以调用本类的成员变量或成员方法,解决局部变量和成员变量的重名问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喝可乐的monkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值