Java基础 第二节 第二课

举报
我是小白呀iamarookie 发表于 2021/09/10 00:15:34 2021/09/10
【摘要】 封装 封装概述概述原则封装的步骤 封装的操作 -- privateprivate 的含义private 的使用格式 封装优化1 -- thisthis 的含义this 使用 封装优化2...

封装概述

概述

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

原则

将属性隐藏起来, 若需要访问某个属性, 提供公共方法对其进行访问.

封装的步骤

  1. 使用 private 关键字来修饰成员变量
  2. 对需要访问的成员变量, 提供对应的一对 getxxx 方法, setxxx 方法

封装的操作 – private

private 的含义

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

private 的使用格式

private 数据类型 变量名 ;

  
 
  • 1

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

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

  
 
  • 1
  • 2
  • 3
  • 4

提供 getxxx 方法 / setxxx 方法, 可以访问成员变量, 代码如下:

public class Student3 {
    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;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

封装优化1 – this

我们发现 setxxx 方法中的形参名字并不符合见名知意的规定, 那么如果修改与成员变量名一致, 是否就见名知意了呢?代码如下:

public class Student4 {
    private String name;
    private int age;
    public void setName(String name) {
        name = name;
    }
    public void setAge(int age) {
        age = age;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

this 的含义

this 代表所在类的当前对象的引用 ( 地址值 ), 即对象字节的引用.
注: 方法被哪个对象调用, 方法中的 this 就代表那个对象. 即谁在调用, this 就代表谁.

this 使用

this.成员变量名;

  
 
  • 1

使用 this 修饰方法中的变量, 解决成员变量被隐藏的问题. 代码如下:

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

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

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        // age = age;
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

注: 方法中只有一个变量名时, 默认也就是使用 this 修饰, 可以省略不写.

封装优化2 – 构造方法

当一个对象被创建的时候, 构造方法用来初始化该对象, 给对象的成员变量赋初始值.

无论你与否自定义构造方法, 所有的类都有构造方法. 因为 Java 提供了一个无参构造方法. 一旦我们自己定义了构造方法, Java 自动提供的默认无参数构造方法就会失效.

构造方法的定义格式

修饰符 构造方法名(参数列表){
     // 方法体
}

  
 
  • 1
  • 2
  • 3

构造方法的写法上, 方法名与它所在的类名相同. 它没有返回值, 所以不需要返回类型, 甚至不需要 void. 使用构造方法后, 代码如下:

public class Student6 {
    private String name;
    private int age;
    
    // 无参数构造方法
    public Student6() {
        
    }
    
    // 有参数构造方法
    public Student6(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意事项

  1. 如果你不提供构造方法, 系统就会给出无参数构造方法
  2. 如果你提供了构造方法, 系统将不再提供无参数据构造方法
  3. 构造方法是可以重载的, 既可以定义参数, 也可以不定义参数

标准代码 – JavaBean

JavaBean 是 Java 语言编写类的一种标准规范. 符合 JavaBean 的类, 要求类必须是具体和公共的, 并且具有无参数构造方法, 提供用来操作成员变量的 set 和 get 方法.

public class ClassName {
    // 成员变量
    // 构造方法
    // 无参构造方法 (必须)
    // 有参构造方法 (建议)
    // 成员方法
    // getxxx()
    // setxxx()
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

编写符合 JavaBean 规范的类. 以学生类为例, 标准代码如下:

public class Student7 {
    // 成员变量
    private String name;
    private int age;
    // 构造方法
    public Student7() {
        
    }
    public Student7(String name,int age) {
        this.name = name;
        this.age = 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;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

测试类, 代码如下:

public class TestStudent {
    public static void main(String[] args) {
        // 无参构造使用
        Student7 s= new Student7();
        s.setName("柳岩");
        s.setAge(18);
        System.out.println(s.getName()+"‐‐‐"+s.getAge());
        
        // 带参构造使用
        Student7 s2= new Student7("赵丽颖",18);
        System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/109996041

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。