当前位置: 首页 > news >正文

类 和 对象(二)

构造方法

接上篇,若每次都想下面的setDate方法给对象初始化,未免比较麻烦,那有什么方法可以让初始化更加简便呢?

public void setDate(int year, int month, int day){this.year = year;this.month = month;this.day = day;}

答:使用构造方法

概念

构造方法是一个特殊的成员方法,名字必须与类名相同(没有返回值,设置为void也不行),在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

方法名 (形参列表){//方法名须与类名相同方法体
}

小拓展:一个对象生成至少有两步:

  1. 为对象分配内存
  2. 调用合适的构造方法

构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间,实例化时可以用构造方法对对象进行初始化

public Date(int year, int month, int day){this.year = year;this.month = month;this.day = day;}

对日期类可以做以上构造方法,这样在实例化时就可以直接为对象进行初始化,初始化代码如下
Date date = new Date(2004,12,20);

在写构造方法时可以发生重载:下面代码中即使两个构造方法的类名一样,但是参数不同,不会报错,发生了方法的重载,想要调用哪个就可以调用哪个。
但是当没有写任何构造方法时,Java会提供一个默认不带参数的构造方法(一旦写了构造方法,Java就不会在提供不带参数的构造方法),这也是我们不写构造方法对象也能生成的原因。

public Date(){System.out.println("这个是不带参数的构造方法");}public Date(int year, int month, int day){System.out.println("这个是带有三个参数的构造方法");this.year = year;this.month = month;this.day = day;}

构造方法中可以使用this来调用其他构造方法:
注意事项:

  1. this( ) 必须是该构造方法中的第一条语句
  2. 格式是 this( 参数 )
  3. 不能形成环(像循环一样调来调去的没有意义)
    以下是在没有参数的Date构造方法中调用有参数的Date构造方法代码
    public Date(int year, int month, int day){System.out.println("这个是带有三个参数的构造方法");this.year = year;this.month = month;this.day = day;}public Date(){this(2024,5,5);System.out.println("这个是不带参数的构造方法");}

总结:

  1. 构造方法名必须与类名相同
  2. 构造方法没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(实例化对象时一定会调用构造方法
  4. 构造方法可以重载(可以根据需求写出不同的构造方法)
  5. 如果用户没有显式定义(自己写),编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的(注意:一旦用户定义,编译器则不再生成
  6. 当然,当我们自己写的构造方法参数列表与实际实例化时参数列表个长度不同,由于编译器不会再生成不带参数的构造方法,所以编译器报错
  7. 绝大多数用public修饰,特殊情况下用private修饰
  8. 小技巧:idea中自动生成构造方法
    在这里插入图片描述
    在这里插入图片描述
    选择要生成的构造方法

封装

面向对象程序三大特性:封装、继承、多态。(可能的误区:这三个不是哪个语言的特征,而是面向对象的特征)

什么是封装?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
(套壳屏蔽细节,用东西包装起来对外隐藏内部实际细节)
总的来说就是对成员变量和成员方法用private进行修饰。
达到的效果:就是该成员变量或成员方法只能在当前类内部使用,当前类外不能使用(可以写一个方法只能供这个类内的方法使用,这样类外就不知道这个只能供这个类内的方法是怎么写的, 实现了隐藏)

访问限定符(管当前修饰的字段或方法的访问权限)

当一个字段或方法前没有任何访问限定符,则为默认权限 default
在这里插入图片描述

包的概念

在我们的电脑中,我们为了分类,会把同一类的东西放到一个文件夹中,但是我们会发现一个文件夹中不能出现相同名字的文件或文件夹。
类似的,在Java中为了更好地管理类,把类聚集到一个包中,称为软件包。包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,像文件夹一样,一个包中不能有名字相同的两个类(但是在一个工程中可以有两个名字相同的类,只要不在同一个包中)

导入包

Java 中已经提供了很多现成的类供我们使用,我们可以使用 import语句导入包比如说导入 java.util 这个包中的 Date 类
import java.util.Date;
如果想导入 java.util 这个包中的所有类可以 import java.util.*
但是同一个包中可能会有名字相同的类,所以建议显式的指定要导入的类名,否则还是容易出现冲突的情况

import导入的是包下的所有类,用到这个包底下哪个类就回调用哪个(而不是导入的这个包)

/*java.lang:系统常用基础类(String,Object),此包从JDK1.1后自动导入
java.lang.reflect:反射编程包
java.net:进行网络编程开发包
java.sql:进行数据库开发的支持包
java.util:Java提供的工具程序包(集合类等)非常重要
java.io:I/O编程开发包*/

可以使用import static导入包中静态的方法和字段
import static java.lang.Math.*
用静态导入包的好处是可以直接使用静态成员而不用通过类名来访问,使代码更简洁

注意事项: import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要。import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using

static

static修饰成员变量

static修饰的成员变量,称为静态成员变量,也叫类变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量只有一份且存储在方法区当中
  4. 生命周期伴随类的一生(即:随类的加载(.class文件通过java文件转化成class对象)而创建,随类的卸载而销毁)
  5. Java当中不允许定义局部的静态变量(可以通过类名或通过对象的引用访问,建议用类名访问)(static修饰的变量是类变量而不是局部变量)

static修饰成员方法

被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的

【静态方法特性】

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过==类名.静态方法名(…)==方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
  4. == 静态方法中不能直接调用任何非静态方法,非静态方法中可以调用静态方法==,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用(静态方法中不能使用 static 关键字
    因为:静态方法不依赖与对象,可以直接通过类名来访问
    但是:非静态方法依赖于对象,要通过对象引用访问
    想要在静态方法中调用非静态方法需要先new对象,在通过对象引用访问
  5. 静态方法无法重写,不能用来实现多态

注意:静态的不依赖于对象,属于类,不属于对象

static成员变量初始化

一般通过四种方式:
就地初始化
静态代码块初始化(下面讲)
构造方法(少)
get set 方法初始化

代码块

概念及分类

使用 {} 定义的一段代码称为代码块。分下面四种:

  1. 普通代码块:定义在方法中的代码块(一般不写)
  2. 构造代码块:也叫实例代码块
  3. 静态代码块:一般用来初始化静态成员变量
    static { }
  4. 同步代码块:未来再议

构造代码块:

//实例代码块/构造代码块{this.name = "z";//实例化对象this.age = 18;this.num = 11;}

静态代码块:

//静态代码块static {classname = 1;//静态成员变量}

关于代码块:

  1. 静态代码块在类加载的时候被执行(静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的)
  2. 如果定义了多个静态代码块/构造代码块,则执行顺序与定义顺序有关
  3. 静态代码块不管生成了多少个对象只会执行一次->说明这个类只会被执行一次
  4. 实例代码块只有在创建对象时才会执行

关于代码块顺序问题:
由于静态代码块在加载时就执行了,而实例代码块在创建对象时才会执行,所以静态代码块的执行顺序先与实例代码块

//实例代码块/构造代码块{this.name = "z";this.age = 18;this.num = 11;System.out.println("构造");}//静态代码块static {classname = 1;System.out.println("静态");}//构造代码块{this.name = "z";this.age = 18;this.num = 11;System.out.println("构造");}

上述代码中,打印顺序为下图,由此可见静态代码块执行顺序先与构造代码块
在这里插入图片描述

对象的打印

重新实现toString来打印对象,代码如下

public class Person {public String name;public String gander;public int age;public Person(String name, String gander, int age){//构造方法this.name = name;this.gander = gander;this.age = age;}public String toString(){//重写toStringreturn "[" + this.name + "," + this.gander + "," + this.age + "]";}public static void main(String[] args) {Person person = new Person("z","女",13);System.out.println(person);//打印时参数为对象名}
}

相关文章:

类 和 对象(二)

构造方法 接上篇,若每次都想下面的setDate方法给对象初始化,未免比较麻烦,那有什么方法可以让初始化更加简便呢? public void setDate(int year, int month, int day){this.year year;this.month month;this.day day;}答&#…...

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…...

力扣爆刷第145天之图论五连刷(dfs和bfs)

力扣爆刷第145天之图论五连刷&#xff08;dfs和bfs&#xff09; 文章目录 力扣爆刷第145天之图论五连刷&#xff08;dfs和bfs&#xff09;总结一、797. 所有可能的路径二、200. 岛屿数量三、695. 岛屿的最大面积四、1020. 飞地的数量五、130. 被围绕的区域 总结 dfs是一条路走…...

Host头攻击-使用加密和身份验证机制

使用加密和身份验证机制&#xff0c;即安装合适的安全工具和软件&#xff0c;是确保Web服务器安全性的重要步骤。这种方法涉及使用各种安全工具来检测、预防、监控和响应潜在的安全威胁。以下是对第6种方法的详细讲解&#xff0c;包括一些常见的安全工具和软件的示例。 1. 防火…...

衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者

经过一个周期的发展&#xff0c;DeFi 已经成为基于区块链构建的最成功的去中心化应用&#xff0c;并彻底改变了加密市场的格局。加密货币交易开始逐步从链下转移到链上&#xff0c;并从最初简单的 Swap 到涵盖借贷、Staking、衍生品交易等广泛的生态系统。 在 DeFi 领域&#x…...

TypeScript中的`let`、`const`、`var`区别:变量声明的规范与实践

TypeScript中的let、const、var区别&#xff1a;变量声明的规范与实践 引言 在TypeScript中&#xff0c;变量声明是代码编写的基础部分。let、const、var 是三种用于变量声明的关键字&#xff0c;它们各自有不同的作用域规则和可变性特点。 基础知识 作用域&#xff1a;变量…...

【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…...

Python限制输入的数范围

在Python中&#xff0c;我们可以使用多种方法来限制用户输入的数值范围。 1.使用while循环和try-except语句的方法 以下是一个使用while循环和try-except语句的示例&#xff0c;该示例将要求用户输入一个在指定范围内的整数。 假设我们要限制用户输入的数在1到100之间&#…...

postman都有哪些功能?

接口测试 可以方便地发送 HTTP 请求&#xff0c;包括各种方法&#xff08;GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并查看响应结果。 参数设置 能够灵活设置请求的参数&#xff0c;如查询参数、请求头、请求体等。 环境管理 支持创建不同的环境&#xff0c;方便…...

华为ensp中USG6000V防火墙双机热备VRRP+HRP原理及配置

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月6日20点26分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍…...

ROS for LabVIEW:实现LabVIEW与ROS的无缝集成

ROS for LabVIEW是由Tufts大学开发的一套VI集合&#xff0c;旨在实现LabVIEW与ROS&#xff08;Robot Operating System&#xff09;的无缝集成。ROS是一个灵活的机器人软件框架&#xff0c;而LabVIEW则是一种强大的图形化编程工具。这个工具包的推出使得LabVIEW用户能够直接与R…...

yolov8+ROS+ubuntu18.04——学习记录

参考文献 1.Ubuntu配置Yolov8环境并训练自己的数据集 ROS实时运行 2.https://juejin.cn/post/7313979467965874214 前提&#xff1a; 1.CUDA和Anaconda&#xff0c;PyTorch 2.python>3.8 一、创建激活环境&#xff0c;安装依赖 1.创建虚拟环境 conda create -n yol…...

Java小抄(一)|Java中的List与Set转换

文章目录 List和Set的区别线程安全的区别相互转换List->SetSet->List List和Set的区别 在Java中&#xff0c;List和Set都是集合接口&#xff0c;它们之间有几个关键的区别&#xff1a; 重复元素&#xff1a; List允许重复元素&#xff0c;可以存储相同的元素多次。Set…...

【每日随笔】小人畏威不怀德 , 君子畏德不畏威 ( 先礼后兵 )

文章目录 一、小人畏威不怀德1、小人畏威不怀德2、小人场景一3、小人场景二 二、君子畏德不畏威三、先礼后兵 一、小人畏威不怀德 1、小人畏威不怀德 如果 友善 的对待 小人 , 这种人 认知低 且 素质差 , 小人 会将你的 " 友善 " 理解为 " 屈服 " , 他会认…...

不一样的2024

当我们继续往前走时&#xff0c;发现身边的事物不再那么的陌生&#xff0c;也不再那边多的阻碍&#xff0c;不管怎么&#xff0c;2024将会不一样。 当我们走进审批流时&#xff0c;全面石荒芜的&#xff0c;所以自己构建了一个体系。 当我们转向开源时&#xff0c;发现开源与…...

linux mv操作和cp操作

mv 和 cp 是 Linux 系统中用于移动和复制文件或文件夹的两个常用命令&#xff0c;它们之间的主要区别在于&#xff1a; mv&#xff08;move&#xff09;&#xff1a;mv 命令用于移动文件或文件夹&#xff0c;将它们从一个位置移动到另一个位置。移动后&#xff0c;原始文件或文…...

第十二届蓝桥杯物联网试题(国赛)

不得不说国赛相比较省赛而言确实&#xff0c;功能变得更加复杂&#xff0c;更加繁琐&#xff0c;特别是串口LORA通信相结合的更加频繁&#xff0c;且对收取的字符处理要求要更加复杂&#xff0c;处理判别起来会更加复杂。 对于收发数据本身来说&#xff0c;收发的数据本身是以…...

小而美的前端库推荐

小而美&#xff0c;指的是“小即是美”的事物&#xff0c;这是马云在 2009年 APEC 中小企业峰会上首次提出的观点 &#x1f44d; 前端有很多小而美的库&#xff0c;接入成本很低又能满足日常开发需求 &#x1f389;...

【LeetCode】力扣第 399 场周赛 优质数对的总数 II

文章目录 1. 优质数对的总数 II 1. 优质数对的总数 II 题目链接 &#x1f34e;该题涉及的小技巧&#xff1a;&#x1f425; &#x1f427;①一次可以统计这个数的 两个因子 但是要注意 25 5 * 5&#xff0c;这种情况 5 只能统计一次噢&#x1f192; 解题思路: &#x1f427…...

YOLOv8+PyQt5面部表情检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.资源包含可视化的面部表情检测系统&#xff0c;基于最新的YOLOv8训练的面部表情检测模型&#xff0c;和基于PyQt5制作的可视化面部表情检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的八类面部表情&#xff1a…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...