Java中的封装

这篇具有很好参考价值的文章主要介绍了Java中的封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、封装

封装是把过程和数据包装起来,对数据的访问只能通过已定义的接口

  1. 对数据(属性)的封装使用private
  2. 对过程(行为)的封装使用,给出访问权限为public的setter(给数据赋值,不需要返回值)方法和getter(获得赋值后的数据,需要返回值)方法

1.1方法封装

举个例子:对于一个Man这个类来说,name、age、wife都是私有属性,对于属性的封装使用“private”

public class Man {


    private String name;
    private int age;
    private String wife;

}
  • 那么对于这些属性来说,使用private封装属性的目的就是保护数据,不让人随意破坏,强制只能在本类中使用
  • 如果在其他类中想要通过其他类的对象来调用Man这个类的私有属性,就很不方便,因为设置成了private私有属性
  • 所以会在定义好private之后,在下面再进行public访问的权限的赋值setter和获取getter两种方法的封装

1.2行为(方法)封装

Man这个类对外界的类提供方法的封装,通过这些封装方法的调用,可以对Man这个类中的属性进行赋值set和获取get,设定姓名、年龄等,也可以获得姓名、年龄。

public class Man {


    //属性封装
    private String name;
    private int age;
    private String wife;


    //行为封装

    //其他类对私有属性name进行赋值,调用这个方法
   public void setName(String name){
       //this.name的name指得是类成员变量private String name;中的name
       // = name,即等号右边的name指的是(String name)中的形参name
       this.name = name;
   }

   //其他类获取私有属性name的值时,调用这个方法
   public String getName(){
       //这里的name指的就是上面private name
       return name;

   }

   //其他类对私有属性age进行赋值,调用这个方法
   public void setAge(int age){

       //this.age中的age指的是类成员变量private age,中的age\
       // = age,即等号右边的age指的是(int age)中的形参age
       this.age = age;
   }


}

1.3行为封装的快捷键

  • 先进行数据(属性)的封装。
public class Man {


    private String name;
    private int age;
    private String wife;

}
  • 点击右键,选择Generate

Java中的封装

  •  选择Getter and Setter

Java中的封装

  •  选择要进行封装的属性(按住Shift可多选),点击ok

Java中的封装

  •  生成的效果和之前是一样的
public class Man {


    //属性封装
    private String name;
    private int age;
    private String wife;

    
    //快捷键生成的方法封装
    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;
    }
}
  • 这里没有进行private String wife;方法的封装,说明Man这个类不想让外界访问wife这个属性

1.3测试类访问封装数据

  • 对数据赋值时就调用Set方法,Set属性名(“实参“);
  • 想要获取到所赋值的实参时就用Get方法,Get属性名();
public class DemoApplication {

    public static void main(String[] args) {



      //利用new关键字创建一个对象man
        Man man = new Man();
        
        //调用封装的setName,属于有参无返的方法,故在括号中传入实参
        man.setName("张");
       
        //调用封装的getName,打印输出就调用这个方法
        System.out.println(man.getName());
        
        //调用封装的方法setAge,属于有参无返的情况,故在括号中传入实参
        man.setAge(1);

        //调用封装的方法getAge,打印输出就调用这个方法
        System.out.println(man.getAge());
        
    }
}

二、this关键字详解

2.1  this.属性名

作用:用来访问类成员变量,用于区分类成员变量和局部变量(方法体中的变量)

Java中的封装

例:现在有一个教师类,有三个public的类成员属性(实例变量)

public class Teacher {

    public String name;  //姓名
    public int age;  //年龄
    public double salary;  //工资
}

外界类想要方法这个类中的三个属性,直接访问且对这三个属性进行赋值肯定是做不到的,先需要构造器,

解决办法:为Teacher类添加一个构造方法,在方法中进行参数传递进行修改

  • 构造方法中 this.name = name;表示一个赋值语句
  • 等号左边this.name中this指的是指向本类的类成员变量
  • 等号左边this.name中的name指的是类成员变量public String name;中的name
  • 赋值语句 等号右边” = name “ 中的name指的是构造器括号中 "String name"传过来的参数 name
public class Teacher {

    public String name;  //姓名
    public int age;  //年龄
    public double salary;  //工资


    //出现有参构造时一定要定义无参构造
    public Teacher() {
    }

    //创建有参构造器,为上面三个属性赋值做准备
    public Teacher(String name, int age, double salary) {
        this.name = name;  //this.name  中的this指的是指向本类的成员变量, this.name中的name指的是本类中的public String name;中的name
        this.age = age;
        this.salary = salary;
    }
}

在测试类中,先new一个对象,因为new的过程中调用了构造器,所以在new的同时在括号中传入实参,代码示例如下:

public class DemoApplication {

    public static void main(String[] args) {

        //利用new关键字创建一个对象,同时传入实参
        Teacher teacher = new Teacher("甲",2,33.33);

        //打印输出结果为甲
        System.out.println(teacher.name);

        //打印结果输出为2
        System.out.println(teacher.age);

    }
}

打印输出的内容均是new过程中传入的实参。

总结:当一个类的类成员变量名和与访问该属性的方法参数名一致时,则需要用this关键字来访问类中的类成员变量,以区分类成员变量和方法中的参数。

Java中的封装

2.2  this.方法名

 作用:类中存在多个方法时,在某一个方法中通过 "this.方法" 调用另外一个方法,即让类中的一个方法,访问类中的另外一个方法或者访问类中的实例变量;

Java中的封装

例如:在Dog这个类中,

  • 定义一个jump()方法,方法中输出内容为“正在执行jump()方法” 
  • 定义一个run()方法,方法中调用 jump()方法,利用“this.方法名”的方式调用,且调用完成之后输出内容“正在执行run()方法”

代码示例如下:

public class Dog {

    //定义一个jump()方法
   public void jump() {

       System.out.println("正在执行jump方法");
   }

   //定义一个run()方法
   public void run() {
       //通过this调用jump()方法
       this.jump();
       System.out.println("正在执行run方法");

   }
}

在测试类中:

  • 通过new关键字创建一个对象(new的时候调用了默认的无参构造器)
  • 通过"对象.方法"的方式调用Dog类中的方法dog.run
  • 最终在控制台会按顺序打印输出:"正在执行jump方法","正在执行run方法",

代码示例如下:

public class DemoApplication {

    public static void main(String[] args) {

        //利用new关键字new一个Dog类的对象
        Dog dog = new Dog();

        //通过dog对象调用了Dog类中的run()方法;这个方法
        //run()方法中又通过this调用了本类方法jump()
        dog.run();

    }
}

注意:对于static修饰的方法而言,可以直接使用类来调用该方法,如果在ststic修饰的方法中使用this关键字,则这个关键字就会无法指向合适的对象,所以,static修饰的方法中不能用this引用,并且Java语法规定,静态成员不能直接访问非静态成员;

2.3  this()  访问构造器方法

作用:this() 用于访问本类的构造方法(构造器是类的一种特殊方法,方法名称和类名相同,没有返回值,括号中可以有参数,如果有参数就是有参构造方法)

  • 通过一个构造器方法1去调用另一个构造器方法2,实现代码复用
  • 构造器方法1和构造器方法2都在同一个类中
  • 语法:this(实参列表)
  • this(实参列表)的使用只能出现在第一个构造方法的第一行

Java中的封装

例:创建一个Student学生类,利用this(“实参列表”)给实例变量name赋值

  • 通过this("实参列表")调用类中的有参构造器对name进行赋值
  • this("实参列表“)必须放在第一个构造器的第一行

Student代码示例如下:

public class Student {

  public String name;

  //无参构造器
  public Student() {

      //通过this(“实参列表")调用类中的有参构造器对name进行赋值
      //this("有参构造")必须放在第一个构造器的第一行
      this("甲");
  }

  //有参构造器
  public Student(String name) {
      this.name = name;
  }

}

在测试类中。利用new关键字new一个对象出来后,打印输出name的值为甲

代码示例如下:

public class DemoApplication {

    public static void main(String[] args) {

        //利用new关键字new一个Student类的对象
        Student student = new Student();
        //控制台打印输出结果为甲
        System.out.println(student.name);


    }
}

三、在类的封装中加入抛出异常判断

定义一个Car类,封装其属性namecolor,

对于color属性来说,不能为red,否则爆红

对于name属性来说,不能传入null,否则报错

public class Car {


    private String name;
    private String color;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        /**
         * 判断 如果在启动项中赋值name为空 抛出异常
         */
        if ( name == null) {
            throw new IllegalArgumentException("invalid name");
        }
       
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        /**
         * 判断 如果在启动项中赋值color为red 抛出异常
         */
         if ( name == null || name.isEmpty() ) {
            throw new IllegalArgumentException("invalid name");
        }
        this.color = color;
    }
}

在启动项中:

public class DemoApplication {

    public static void main(String[] args) {

        Car car = new Car();
        car.setColor("red");
        System.out.println("车子的颜色为--------------------"+car.getColor());
        car.setName(" ");
        System.out.println("车子的名字为---------------------"+car.getName());


    }
}

控制台报错如下:

Java中的封装

 文章来源地址https://www.toymoban.com/news/detail-457491.html

到了这里,关于Java中的封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(Java实现)-包装类和泛型

    包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中 拆箱操作,将 Integer 对象中

    2024年02月11日
    浏览(40)
  • TCP/IP为例数据封装与解封装过程

    一TCP/IP数据封装过程 TCP/IP数据封装分为5个步骤,在本文中我将按流程顺序介绍TCP/IP的数据封装过程 应用层:应用层将需要传输的数据(如,文字,视频,图片,音频等)转换成能够被电脑识别的二进制数字也就是将数据翻译成设备能识别的语言 传输层:数据段被分为数据段

    2024年02月07日
    浏览(46)
  • 网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

    「作者简介」: 2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层,每层的作用,知道数据在七层模型中是怎样传输的,封包和解封过程,数据包在每一层是怎么封装和解封的。 OSI(Open System Interc

    2024年04月26日
    浏览(40)
  • 如何将常用的jdbc方法封装起来???

    你是否还在为每次新建项目连接数据库而烦恼???(教你一次代码,简单完成每次连接) 还没下载安装或者不会建立maven项目的可以看这里哦:maven的下载安装与配置环境变量!!!(全网最详细)_明天更新的博客-CSDN博客 不会打包的可以作为参考:maven如何打包你会吗?

    2024年02月12日
    浏览(29)
  • Java中的封装

    封装是把过程和数据包装起来,对数据的访问只能通过已定义的接口 对数据(属性)的封装使用private 对过程(行为)的封装使用,给出访问权限为public的setter(给数据赋值,不需要返回值)方法和getter(获得赋值后的数据,需要返回值)方法 1.1方法封装 举个例子:对于一个

    2024年02月06日
    浏览(28)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(76)
  • 交换机与路由器技术-06-路由器转发数据包封装过程

    第一步: 主机A向主机B发送数据,源IP是1.2、源MAC是11-11,目的MAC是22-22( 因为路由器会阻挡广播 ,主机A无法获取到主机B的MAC地址,只能将数据交给自己的网关,所以在这里,主机A在做数据帧封装时,封装的目的MAC是主机A网关的MAC地址22-22) 第二步: 主机将数据交给自己的

    2024年02月12日
    浏览(36)
  • 【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍Ogg文件格式🍭 😎金句分享😎:🍭子曰:见贤思齐焉,见不贤而内自省也。——《论语·里仁篇》。意思是,看见德才兼备的人就

    2024年02月06日
    浏览(49)
  • 卷起来!Dr. LLaMA:通过生成数据增强改进特定领域 QA 中的小型语言模型,重点关注医学问答任务...

    大家好,最近突然发现了一篇在专门应用于医学领域的LLaMA,名为Dr.LLaMA(太卷了太卷了),就此来分享下该语言模型的构建方法和最终的性能情况。 论文 :Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation 地址 :https://arxiv.org/pdf/2305.07804.pdf 代码 :

    2024年02月11日
    浏览(48)
  • 将Java与数据库连接起来(配置idea),实现一个简单的图书管理系统

    目录 1.通过connector连接Java和Mysql数据库 (1)首先配置idea (2)如何把java和mysql连接起来 1.简单连接 2.认识PrepareStatement 2.实现简单的图书管理系统 (1)创建数据库jdbc,并且创建出book表  (2)在idea中书写代码将mysql与java连接,实现基本的增删改查 1.JdbcUtiles类,一个使用jdbc的工具

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包