Java-面向对象-封装

90 阅读2分钟

面向对象变成思想,有三个基本特征:

  1. 封装 2.继承 3.多态

image.png

如何实现封装?

必须依赖于权限修饰符(访问控制修饰符)

image.png

权限修饰符使用的注意事项:

  1. 如果权限修饰符是在class前面(这里暂不讨论内部类),只能是public或缺省
  2. 如果权限修饰符是在类的成员前面(成员变量,成员方法等)四种都可以

image.png

1 、如何使用私有化的属性( private
如果这个属性确实要被外部使用,需要提供
get set 方法。
get
方法:供调用者获取属性值的方法
set 方法:供调用者修改属性值的方法

2 get/set 方法要注意的地方
1 )如果方法中有局部变量(通常是形参)与对象的实例变量 重名
那么需要在实例变量的前面加
"this.“
如果没有重名问题,在实例变量前面可以加
"this.” ,也可以不加 "this.“

2 get/set 的方法名,通常都是
get +
属性名,并且属性名的首字母大写
set  + 属性名,并且属性名的首字母大写

3 )如果属性(实例变量)是 boolean 类型,
那么它对应的
get 方法,就会把 get 单词换成 is

如果不使用私有化加条件判断,此段代码的年龄居然都可以设置负值

public static void main(String[] args) {
    Student s1 = new Student();
    /*s1.name = "张三";
    s1.score = 89;
    s1.age = 23;
    //以上代码正常使用没问题,但是如果出现以下代码
    s1.score = -89;
    s1.age = -23;*/
    //这样写,逻辑上有问题,语法上没法控制

    //这里是调用者的角色,调用s1学生对象的姓名name的get和set
    System.out.println("修改之前,姓名:" + s1.getName()); //null
    s1.setName("张三");
    System.out.println("修改之后,姓名:" + s1.getName()); //张三

    System.out.println("修改之前,年龄:" + s1.getAge()) ;  //0
    s1.setAge(-23);
    System.out.println("修改之后,年龄:" + s1.getAge()) ; //非法
}



public class Student {
    private String name;
    private int score;
    private int age;
    private boolean marry;

    //快捷键,自动生成get/set
    //按快捷键 Alt + Insert,部分同学需要同时按
    
    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        //加条件判断,加逻辑的控制
        if(age<=20 || age>=35){
            return;
        }
        this.age = age;
    }

    public boolean isMarry() {
        return marry;
    }
    public void setMarry(boolean marry) {
        this.marry = marry;
    }
}

快捷键快速生成get和set:Alt + Insert