【Java】Java进阶学习笔记(一)—— 面向对象(封装)

news2025/1/15 17:48:41

【Java】Java进阶学习笔记(一)—— 面向对象(封装)

  • 一、类中成分
    • 1、类中成分
    • 2、this关键字
        • this() 访问构造器方法
    • 3、static关键字
        • 1. 成员变量的区分
        • 2. 成员方法的区分
        • 3. 成员变量访问语法的区分
  • 二、封装
    • 1、封装的定义
      • 封装的好处
    • 2、实现Java封装的步骤
    • 3、封装实例
    • 4、IDEA 行为封装的快捷键
    • 5、在类的封装中加入抛出异常判断

一、类中成分

1、类中成分

  1. 成员变量(Field:描述类和对象的属性信息的)

  2. 成员方法(Methpd:描述类或者对象的行为信息的):包括实例方法,静态方法,抽象方法,getter setter 方法

  3. 构造器(Constructor:初始化一个类的对象并返回引用)
    * 默认无参构造器:一个类默认会自带一个无参构造器,即使不写构造器,也有构造器存在,但是如果一个类它写了一个构造器,那么默认的无参构造器就被覆盖了!
    * 有参构造器

  4. 代码块

  5. 内部类

/*
   javaBean类: 封装数据
*/
public class Student {
    // 两个成员变量 私有
    private String name;
    private int age;
    
    
    // 无参构造器
    public Student(){
        
    }
    
    // 有参数构造器
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    // 成员方法: setXX \ gerXX
    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.print;n(name + "..." + age);
    }
    
}

2、this关键字

  • this关键字可以用在实例方法和构造器

(1)this 关键字用在方法中,谁调用这个方法,this 就代表谁;
(2)this 关键字用在构造器上,代表了构造器正在初始化那个对象的引用。

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

/*
   javaBean类: 封装数据
*/
public class Student {
    // 两个成员变量 私有
    private String name;
    private int age;
    
    // 无参构造器
    public Student(){
        
    }
    
    // 有参数构造器中可以用 this 关键字
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    // 实例方法中可以用 this 关键字
    // 成员方法: setXX \ gerXX
    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.print;n(name + "..." + age);
    }   
}

this() 访问构造器方法

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

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

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

通过this("实参列表")调用类中的有参构造器对name进行赋值
this("实参列表“)必须放在第一个构造器的第一行
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);

    }
}

3、static关键字

– 按照有无static修饰,成员变量和方法可以分为

1. 成员变量的区分

(1)静态成员变量(类变量)

有 static 修饰的成员变量称为静态成员变量,也叫类变量,属于类本身,直接用类名访问即可

(2)实例成员变量

无 static 修饰的成员变量称为实例成员变量,属于类的每个对象的,必须用类的对象来访问

2. 成员方法的区分

(1)静态方法

有static修饰的成员方法称为静态方法,也叫类方法,属于类本身的,直接用类名访问即可。

(2)实例方法

无static修饰的成员方法称为实例方法,属于类的每个对象的,必须用类的对象来访问。

3. 成员变量访问语法的区分

(1)静态成员变量访问:
类名.静态成员变量
对象.静态成员变量(也可以访问,但是不推荐)

(2)实例成员变量的访问:
对象.实例成员变量

public class Student {
    // 1.静态成员变量: 有static修饰,属于类本身,直接用类名访问即可!
    public static String schoolName = "中国";
    // 2.实例成员变量: 无static修饰,属于类的对象,必须用对象访问
    private String name;
    private int age;

    public static void main(String[] args){
        // 1.类名.静态成员变量
        System.out.println(Student.schoolName);
        // 注意:同一个类中访问静态成员变量可以省略类名不写
        System.out.println(schoolName);

        // 2.对象.实例成员变量
        Student s1 = new Student();
        s1.name = "孙悟空";
        System.out.println(s1.name);
        // 3.对象.静态成员变量(不推荐)
        System.out.println(s1.schoolName);
		// 静态成员变量属于类,直接用类名访问即可
    }
}

二、封装

1、封装的定义

封装就是隐藏对象的属性和实现细节,仅提供公共访问方式来让外界访问。当内部的逻辑发生变化时,外部调用不用因此而修改,它们只调用开放的接口,而不用去关心内部的实现。

封装的好处

1. 良好的封装能够减少耦合。

2. 类内部的结构可以自由修改。

3. 可以对成员变量进行更精确的控制。

4. 隐藏信息,实现细节。

2、实现Java封装的步骤

  1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:

public class Person {
    private String name;
    private int age;
}
  1. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

public class Person{
    private String name;
    private int age;public int getAge(){
      return age;
    }public String getName(){
      return name;
    }public void setAge(int age){
      this.age = age;
    }public void setName(String name){
      this.name = name;
    }
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

3、封装实例


/* 文件名: EncapTest.java */
public class EncapTest{
 
   private String name;
   private String idNum;
   private int age;
 
   public int getAge(){
      return age;
   }
 
   public String getName(){
      return name;
   }
 
   public String getIdNum(){
      return idNum;
   }
 
   public void setAge( int newAge){
      age = newAge;
   }
 
   public void setName(String newName){
      name = newName;
   }
 
   public void setIdNum( String newId){
      idNum = newId;
   }
}

以上实例中public方法是外部类访问该类成员变量的入口。通常情况下,这些方法被称为getter和setter方法。
因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。


/* F文件名 : RunEncap.java */
public class RunEncap{
   public static void main(String args[]){
      EncapTest encap = new EncapTest();
      encap.setName("James");
      encap.setAge(20);
      encap.setIdNum("12343ms");
 
      System.out.print("Name : " + encap.getName()+ 
                             " Age : "+ encap.getAge());
    }
}

以上代码编译运行结果如下:

Name : James Age : 20

4、IDEA 行为封装的快捷键

  1. 点击右键,选择Generate

在这里插入图片描述

  1. 选择Getter and Setter

在这里插入图片描述

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

在这里插入图片描述

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

定义一个 Car类,封装其属性 name 和 color,
对于 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());
 
 
    }
}

控制台报错如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excel之古诗词打乱排序

最终效果 制作过程: 一、选择一首古诗,将正文内容连接起来,放在一个单元格中 二,由于这首诗是20字的,加工20个不重复的随机数,具体公式如下图 (写好第一行数据,拖动下拉即可) 其中…

虚拟机上安装openKylin详细步骤总结

一、创建虚拟机 首先获取操作系统安装镜像文件: 链接:https://pan.baidu.com/s/1tSuXmDk2ZILR4ieee6iImw?pwdcy47 提取码:cy47 (1-1)进入新虚拟机创建向导,选择“自定义”: (1-…

创业做校园外卖平台,该如何把自己的平台宣传出去?

如何宣传校园外卖平台?主要看平台宣传,配套宣传工具不一样! 我认为有以下几点: 1.建立以宿舍楼为基础的推广团队,依托平台分佣,并能做到每个宿舍楼的送餐和广告分发; 2.根据学生的消费习惯&a…

【带组态源码】Java物联网平台源码 Modus RTU协议 文档齐全 带移动手机端

▶ 组态功能强大、组件丰富 ▶ 组态设计功能强大:包括基础组件、消息组件、图表组件三大类 ▶ 基础组件包括:位按钮、窗口按钮、多态、图片按钮、流动、静态文本、动态变量、输入框、滑块、选择框、网格、矩形、椭圆、直线、自定义形状。 ▶ 图表组件包…

如何用Postman测试整套接口?测试流程是什么?

目录 基于postman测试接口(整套接口测试) 可以解决的问题 开启控制台 单个测试尝试 使用请求结果当参数 打印结果(JSON) 自定义可视化结果 随机参数 测试用例连接 一键测试接口集合 从swagger导入接口 自定义全局变量 总结感谢每一个认真阅读我文章的人&#xff01…

异步简单实现一人一单

本项目码云地址:https://gitee.com/flowers-bloom-is-the-sea/distributeNodeSolvePessimisticLockByRedis/tree/version3/ 项目前身:https://gitee.com/flowers-bloom-is-the-sea/distributeNodeSolvePessimisticLockByRedis/tree/version2.0/ 异步实…

java易错题锦集系列五

接口中不能有构造方法,抽象类中可以有。抽象类中构造方法作用:初始化抽象类的成员;为继承它的子类使用 定义在同一个包(package)内的类是可以不经过import而直接相互使用 final修饰的方法可以被重载 但不能被重写 从…

论文阅读:Self-Supervised Monocular Depth Estimation with Internal Feature Fusion(DIFFNet)

中文标题:基于内部特征融合的自监督单目深度估计 创新点 参照HR-Net在网络上下采样的过程中充分利用语义信息。设计了一个注意力模块处理跳接。提出了一个扩展的评估策略,其中方法可以使用基准数据中的困难的情况进行进一步测试,以一种自我…

计算机科学导论笔记(一)

一、绪论 1.1 图灵模型 Alan Turing在1937年首次提出了一种通用计算设备的设想,他设想所有的计算都能在一种特殊的机器上执行,这就是现在所说的图灵机。但图灵机只是一种数学上的描述,并不是一种真正的机器。 1.1.1 数据处理器 在讨论图灵…

X和Ku波段小尺寸无线电设计

卫星通信、雷达和信号情报(SIGINT)领域的许多航空航天和防务电子系统早就要求使用一部分或全部X和Ku频段。随着这些应用转向更加便携的平台,如无人机(UAV)和手持式无线电等,开发在X和Ku波段工作,同时仍然保持极高性能水平的新型小尺寸、低功耗…

自动化测试——读写64位操作系统的注册表

非Web程序(桌面程序)的设置一般都存在注册表中。 给这些程序做自动化测试时, 需要经常要跟注册表打交道。 通过修改注册表来修改程序的设置。 本章介绍如何利用C#程序如何操作注册表, 特别是如何操作64位操作系统的注册表。 自动…

一文介绍Doris

文章目录一、架构介绍1.名词解释2.FE(Frontend)3.BE(Backend)4.元数据结构二、存储介绍1.DataPage2.Footer信息3.index pages三、索引介绍1.Ordinal Index(一级索引)2.Short Key Index 索引3.ZoneMap Index 索引4.BloomFilter索引5.Bitmap Index 索引6.索…

tensor常用代码

1.创建一个自定义形状的tensor,元素类型为int,并为随机数 a torch.randint(1, 10, size[4,2]) # 元素为1-10之间的随机数 2.将tensor中,元素类型改为float b a.float() b a.double() 3.在tensor的最外层增加一个维度 (tensor[None]) …

FATE数据上传、读取、训练、保存

fate如何安装?本文续这篇文章。 背景 fate是一个服务,还原联邦学习,所以分client和host两种身份,一般来说用户都是client,用户想要上传自己的数据,合并他人数据最终获得一个更好的模型,所以要…

织梦文章无图自动出图配图插件支持采集

织梦文章无图自动出图配图插件的优点 1、提高文章的可读性和吸引力:插入图片可以丰富文章的内容和形式,增强读者的阅读体验和吸引力,提高文章的点击率和转化率。 2、节省时间和精力:手动添加图片需要花费大量时间和精力去寻找和…

浅谈cocos2dx渲染方式

场景的渲染 Node:visit 其作用是遍历整个场景渲染树。 部分代码如下 if(!_children.empty()) {sortAllChildren();// draw children zOrder < 0for(auto size _children.size(); i < size; i){auto node _children.at(i);if (node && node->_localZOrder…

HU4056H耐压高达28V,具有电源OVP功能的1A单节锂离子电池线性充电IC

产品概述 HU4056H是一款完整的采用恒定电流/恒定电压的高压、大电流、单节锂离子电池线性充电 IC。最高耐压可达 28V&#xff0c; 6.5V 自动过压保护&#xff0c;充电电流可达 1A。 由于采用了内部 PMOSFET 架构&#xff0c;加上防倒充电路&#xff0c;所以不需要外部隔离二…

【博学谷学习记录】超强总结,用心分享丨人工智能 机器学习 集成学习错题总结

目录题目1&#xff1a;下面关于提升树的说法哪个是正确的&#xff1f;题目2&#xff1a;下面关于随机森林和梯度提升集成方法的说法哪个是正确的&#xff1f;集成学习主要有哪几种框架&#xff1f;工作过程是&#xff1f;题目1&#xff1a;下面关于提升树的说法哪个是正确的&am…

亿发软件:钉钉移动ERP业务在线,审批、管理更方便!

钉钉系统是企业级智能移动办公平台&#xff0c;平台覆盖大中小微各量级企业&#xff0c;帮助中国企业移动办公管理。企业无需复杂的部署操作&#xff0c;在对应的功能制定流程和相关负责人即可。 亿发企业ERP管理系统于2022年与钉钉系统做了对接&#xff0c;提供一站式的企业管…

VIF-Benchmark: All infrare and visible image fusion method in one framework

VIF_Benchmark Github 地址: https://github.com/Linfeng-Tang/VIF-Benchmark 完整Project下载地址&#xff1a;https://download.csdn.net/download/fovever_/87514164 我们把所有主流的基于深度学习的红外和可见光图像融合方法都集成在了这个框架中。 这些方法包括&#xff1…