5.3 封装性

5.3 封装性

package basic;

class Person{
    String name;
    int age;
    public void tell(){
        System.out.println("姓名:"+name+",年龄"+age);
    }
}
public class ClassDemo02 {
    public static void main(String[] args) {
        Person per=new Person();                       //创建并实例化对象
        per.name="张三";                                //为name属性赋值
        per.age=-30;                                   //为age属性赋值
        per.tell();                                    //调用类中的方法
    }
}

用对象直接访问类中的属性,这在面向对象法则中是不允许的。为了避免这种错误,在一般的开发中往往要将类中的属性封装(private)

格式:

属性封装:  private  属性类型  属性名称;

方法封装:  private  方法返回值   方法名称(参数列表){}

package basic;

class Person{
    private String name;
    private int age;
    public void tell(){
        System.out.println("姓名:"+name+",年龄"+age);
    }
}
public class ClassDemo02 {
    public static void main(String[] args) {
        Person per=new Person();                       //创建并实例化对象
        per.name="张三";                                //为name属性赋值
        per.age=-30;                                   //为age属性赋值
        per.tell();                                    //调用类中的方法
    }
}
java: name 在 basic.Person 中是 private 访问控制

private使程序无法通过编译,不能由对象直接访问控制

1.为了解决属性必须封装且又必须访问的矛盾,Java中对私有属性的访问有以下规定“只要是被封装的属性,则必须通过setter和getter方法设置和取得

2.使用setter和getter方法还有一个原因,就是在Java中存在反射机制,在各个程序中,反射机制都会利用setter和getter设置和取得属性内容

package basic;

class Person{
    private String name;
    private int age;

    public String getName() {                   //取得姓名
        return name;
    }

    public void setName(String name) {          //设置姓名
        this.name = name;
    }

    public int getAge() {                       //取得年龄
        return age;
    }

    public void setAge(int age) {               //设置年龄
        this.age = age;
    }

    public void tell(){
        System.out.println("姓名:"+name+",年龄"+age);
    }
}
public class ClassDemo02 {
    public static void main(String[] args) {
        Person per=new Person();                       //创建并实例化对象
        per.setName("张三");                            //调用setter设置姓名
        per.setAge(-30);                               //调用setter设置年龄
        per.tell();                                    //输出信息
    }
}

如果想对设置进去的值进行检查,只需在setter()方法处加入检查代码即可

package basic;

class Person{
    private String name;
    private int age;

    public String getName() {                   //取得姓名
        return name;
    }

    public void setName(String name) {          //设置姓名
        this.name = name;
    }

    public int getAge() {                       //取得年龄
        return age;
    }

    public void setAge(int age) {               //设置年龄
        if (age >= 0 && age < 150) {
            this.age = age;
        }
    }
    public void tell(){
        System.out.println("姓名:"+name+",年龄"+age);
    }
}
public class ClassDemo02 {
    public static void main(String[] args) {
        Person per=new Person();                       //创建并实例化对象
        per.setName("张三");                            //调用setter设置姓名
        per.setAge(-30);                               //调用setter设置年龄
        per.tell();                                    //输出信息
    }
}
姓名:张三,年龄0

Process finished with exit code 0

关于private的补充说明:

1.类中全部属性都必须封装,封装之后的属性必须通过setter和getter进行访问

2.面向对象的封装性并不是单单指private关键字。private声明的属性或方法只能在其类的内部被调用,而不能在类的外部被调用

3.正常情况下,类中的方法直接写上方法名就可以完成本类中的方法调用,如果非要强调是本类的方法,可以以this.方法名()的形式调用。建议使用这种形式,标准且查错方便

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值