java 变量&封装

195 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

成员变量和局部变量区别

变量根据定义位置的不同,我们给变量起了不同的名字。如下图所示:

5.jpg

  • 在类中的位置不同 重点

    成员变量:类中,方法外 局部变量:方法中或者方法声明上(形式参数)

  • 作用范围不一样 重点

    成员变量:类中 局部变量:方法中

  • 初始化值的不同 重点

    成员变量:有默认值 局部变量:没有默认值。必须先定义,赋值,最后使用

  • 在内存中的位置不同 了解

    成员变量:堆内存 局部变量:栈内存

  • 生命周期不同 了解

    成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

封装

封装概述

面向对象有很多设计上的语法是需要大家掌握的,接下来我们需要学习面向对象的三大特征中的封装

面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

例如:之前我们定义的方法,实际上也是一种封装,我们是把功能代码封装在了方法中,然后必须通过调用该方法来执行功能。

为什么要封装

假如我们现在定义一个People类。代码如下:

public class People {
    // 实例成员变量,属于对象的
    // 合理隐藏
    public String name ;
    public int age  ;
}

之前我们已经知道对象可以直接访问这些实例成员变量。那么就会出现以下情况:

public class TestPeople {
    public static void main(String[] args){
        // 创建一个人对象 
        People p = new People();
        p.name = "古力娜扎";
        p.age = -100; // 很显然这个数据注入是存在问题的,年龄不可能是负数
    }
}

上面年龄age直接注入数据是不合理的,说明age不应该直接就被访问,应该把age封装起来,以便不能被直接访问。那么如何进行封装呢?

封装原则

封装是为了让代码的功能更加的安全,让细节被进一步的隐藏起来。原则上应该合理隐藏,合理暴露

按照规范:我们需要将成员变量(属性)隐藏起来,若需要访问某个成员变量,暴露公共方法对其访问。

封装的步骤

1.使用 private 关键字来修饰成员变量。表示成员变量不能被直接访问。

2.使用public修饰方法,提供对应的一对用public修饰的 getXxx方法 、setXxx 方法来暴露成员变量的访问。

注意:public关键字是公开访问权限,private关键字是隐藏访问权限。

封装的操作

private修饰成员变量

private的含义

  1. private是一个权限修饰符,代表最小权限,是私有的含义。
  2. 可以修饰成员变量和成员方法。
  3. 被private修饰后的成员变量和成员方法,只在本类中才能访问。

private的使用格式

private 数据类型 变量名;

使用 private 修饰成员变量,代码如下:

public class People {
    private String name;
    private int age;
}

public修饰getter和setter方法

public的含义

  1. public是一个权限修饰符,代表最大权限,是公开权限的含义。
  2. 可以修饰成员变量和成员方法。
  3. 被public修饰后的成员变量和成员方法,可以在任何类中访问。

private的使用格式

private 数据类型 变量名;

使用public修饰成员方法,代码如下:

1.提供 getXxx方法 / setXxx 方法(我们也称呼getXxx方法 / setXxx 方法是getter和setter方法),可以通过getter和setter方法来暴露成员变量的访问,然后可以在setAge方法中过滤掉非法的年龄,代码如下:

public class People {
    private String name;
    private int age;
    private String addr;
​
    public void setName(String n) {
        name = n;
    }
​
    public String getName() {
        return name;
    }
    
    public String getAddr() {
        return addr;
    }
​
    public void setAddr(String ar) {
        addr = ar;
    }
​
    public void setAge(int a) {
        if(a > 0 && a <200){
            age = a;
        }else{
            System.out.println("年龄非法!");
        }
        
    }
​
    public int getAge() {
        return age;
    }
}

接下来我们通过代码进行测试

public class TestPeople {
    public static void main(String[] args){
        // 创建一个人对象 
        People p = new People();
        // p.age = -100;//这里代码会出现编译错误,因为age被private修饰了,只能通过setAge访问修改
        // p.setAge(-10); // 提示年龄非法
        p.setAge(19); 
        p.setName("张曼玉");
        p.setAddr("香港")
        System.out.pritnln(p.getAge());// 输出年龄:19
        System.out.pritnln(p.getName());// 输出:张曼玉
        System.out.pritnln(p.getAddr());// 输出:香港
    }
}

从上面代码可以看出:

成员变量age一旦私有以后,其他类就不能直接访问成员变量了,必须通过setAge来修改,通过getAge来访问。这样就实现了安全性,值得注意的是开发的时候,我们并不一定会在setAge中做参数的校验,因为可以在界面上提前校验用户输入的数据是否合法,但是即便如此,成员变量私有和提供配套的getter和setter方法已经成为Java设计的一种规范,建议大家都这样设计自己的代码。

封装小结

1.从上述代码中可以看出,成员变量使用private修饰以后,就不可以在其他类中访问了。

2.提供成套的被public修饰的setter和方getter法可以暴露对私有成员变量的修改以及获取值。

3.封装就是合理的进行隐藏,合理的进行暴露,按照规范我们会对成员变量进行私有,而对方法进行暴露。

this关键字

this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)

  • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
  • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
public class Student {
    private String name;
    private int age;
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getAge() {
        return age;
    }
​
    public void show() {
        System.out.println(name + "," + age);
    }
}

this内存原理

  • this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象
  • 示例代码:
public class StudentDemo {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("林青霞");
        Student s2 = new Student();
        s2.setName("张曼玉");
    }
}

图解:

5.png

封装思想

  1. 封装概述 是面向对象三大特征之一(封装,继承,多态) 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
  2. 封装原则 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法
  3. 封装好处 通过方法来控制成员变量的操作,提高了代码的安全性