类和对象解析

导言:

Java是一门纯面向对象的语言,在面对对象的世界里,一切皆为对象。而对象的创建又和类的定义息息相关。本文主要阐述了类和对象的使用与理解。解释类的定义方式以及对象的实例化,类中的成员变量和成员方法的使用,以及对象的整个初始化过程。

目录

导言:

正文:

一.类的定义和使用

二.类的构造方法

三.this引用

四.类的实例化

五.类的初始化

总结:


正文:

一.类的定义和使用

类是一种抽象的数据类型,是用于描述具有相同属性和行为的对象的集合。

具体来说,类是用来对一个实体(对象)来进行描述的,主要用来描述该实体(对象)具有哪些属性,哪些功能。

类的定义:使用关键字class来定义一个类,通常包含类的访问修饰符、类名、类体等部分。

  1. 类的访问修饰符:类可以有四种访问修饰符,分别是public、protected、private和默认(即不加修饰符)。这些修饰符控制着类的可见性,即哪些代码可以访问该类。

  2. 类名:类名是一个标识符,用于唯一标识一个类。类名的命名规范是以大写字母开头,采用驼峰命名法。

  3. 类体:类体是类的主体部分,包含了类的属性和方法的定义。类体由一对花括号{}括起来。

这里对修饰符先进行一个解释,,类、方法和属性都可以使用权限修饰符来控制它们的访问权限,这些权限修饰符包括public、protected、private和默认(即不加修饰符)。

  • public:public是最宽松的权限修饰符,它可以被任何类、方法和属性访问。如果一个类、方法或属性被声明为public,那么它可以被同一个包中的其他类、不同包中的其他类以及任何地方的子类和非子类访问。

  • protected:protected修饰符可以被同一个包中的其他类访问,也可以被不同包中的子类访问。如果一个类、方法或属性被声明为protected,那么它可以被同一个包中的其他类、不同包中的子类访问,但是不可以被不同包中的非子类访问。

  • private:private是最严格的权限修饰符,它只能被同一个类中的其他方法和属性访问。如果一个方法或属性被声明为private,那么它只能被同一个类中的其他方法和属性访问,不可以被同一个包中的其他类或不同包中的任何类访问。

  • 默认权限修饰符:如果一个类、方法或属性没有使用任何权限修饰符,那么它的访问权限就是默认的。默认权限修饰符只能被同一个包中的其他类访问,不可以被不同包中的任何类访问。

类的定义具体语法如下

// 创建类
修饰符 class 类名{
修饰符 field; // 字段(属性) 或者 成员变量
修饰符 method(); // 行为 或者 成员方法
}

例如:

public class Student11_4 {public String name;//成员变量public int age;//成员变量//成员方法public void show(){System.out.println("hello world");}
}

二.类的构造方法

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

构造方法有以下几个特点:

  1. 构造方法与类同名:构造方法的名称必须与类的名称完全相同。

  2. 没有返回类型:与普通方法不同,构造方法没有返回类型,包括void。构造方法的主要目的是初始化对象,而不是返回某个值。

  3. 可以有多个构造方法:一个类可以有多个构造方法,它们之间的区别可以通过参数的类型、个数和顺序来区分。这种情况下被称为构造方法的重载,即构造方法也支持重载。

  4. 默认构造方法:如果一个类没有定义任何构造方法,编译器会自动为该类生成一个默认的无参构造方法。默认构造方法不做任何初始化操作。

  5. 显式定义构造方法:如果在类中显式定义了一个或多个构造方法,编译器就不会生成默认构造方法。在这种情况下,如果想使用无参构造方法,需要显式地定义一个无参构造方法。

  6. 构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。内存分配的工作是由JVM在实例化对象时自动完成的。构造方法只负责对对象的属性进行初始化。构造方法执行完毕后,对象才被完全创建并可以使用。

例如,假设有一个名为Person的类,它有属性name和age,并且定义了两个构造方法:

//定义一个人类
public class Person {//成员变量private String name;private int age;// 无参构造方法public Person() {name = "Unknown";age = 0;}// 带参构造方法public Person(String name, int age) {//this在这里先进行使用,后面会进行解释this.name = name;this.age = age;}
}

在这个例子中,Person类定义了一个无参构造方法和一个带参构造方法。无参构造方法用于初始化name和age属性的默认值,带参构造方法用于接收外部传入的name和age值,并将其赋给对象的属性。

三.this引用

在Java中,this是一个特殊的关键字,它表示当前对象的引用。this关键字可以在类的方法和构造方法中使用,用于引用当前对象的成员变量、成员方法和构造方法。

this关键字的主要作用有以下几个方面:

1. 引用当前对象的成员变量:在类的方法中,如果方法中的局部变量与成员变量同名,可以使用this关键字来引用当前对象的成员变量。

例如:

public class Person {private String name;public void setName(String name) {this.name = name; // 使用this关键字引用当前对象的成员变量}
}

在这个例子中,setName方法中的参数name与成员变量name同名,为了区分它们,使用this.name表示当前对象的成员变量。

2. 调用当前对象的成员方法:在类的方法中,可以使用this关键字来调用当前对象的其他成员方法。例如:

public class Person {private String name;public void setName(String name) {this.name = name; // 使用this关键字引用当前对象的成员变量}
}

在这个例子中,method2方法中使用this.method1()调用了当前对象的method1方法。

3. 在构造方法中调用其他构造方法:在一个类中,可以定义多个构造方法,通过使用this关键字在一个构造方法中调用另一个构造方法。这种方式称为构造方法的重载。例如:

public class Person {private String name;private int age;public Person() {this("Unknown", 0); // 调用带参构造方法}public Person(String name, int age) {this.name = name;this.age = age;}
}

在这个例子中,无参构造方法中使用this("Unknown", 0)调用了带参构造方法,实现了对name和age属性的初始化。

需要注意的是,this关键字只能在非静态方法和构造方法中使用,因为静态方法没有this引用,它是属于类而不是对象的。

4.事实上,成员方法中都有this。this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收在代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的

 

四.类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义的一个新的类型,它们本质都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

对象的构造和初始化是指在创建对象时,为对象分配内存空间并对对象的属性进行初始化的过程。

  1. 对象的构造:在Java中,使用关键字"new"来创建一个对象。当使用"new"关键字实例化一个类的对象时,JVM会为该对象分配内存空间,并调用该类的构造方法来初始化对象的属性。

  2. 对象的初始化:对象的初始化是指在构造方法中对对象的属性进行赋值操作,使对象的属性具有初始值。初始化可以在构造方法中直接赋值,也可以通过调用其他方法或外部传入的参数来进行赋值。对象的初始化是在对象创建之后立即执行的,确保对象的属性在创建之后具有正确的初始值。

具体的语法是:类名 对象名 = new 类名();

//定义一个人类
public class Person {
//成员变量private String name;private int age;
//构造方法public Person(String name, int age) {this.name = name;this.age = age;}
//成员方法public void sayHello() {System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");}
}

可以通过以下方式实例化Person类:

//调用Person类的有参构造
//创建了一个Person类的对象
Person person = new Person("John", 25);
//调用成员方法
person.sayHello();

 在这个例子中,通过new关键字创建了一个Person类的对象,并将其赋值给变量person。同时,调用了Person类的构造方法来初始化对象的属性。然后,可以通过person来访问和调用对象的属性和方法,例如person.name、person.age和person.sayHello()。

五.类的初始化

先来看一段代码,

public class Date {
public int year;
public int month;
public int day;
public Date(int year, int month, int day) {
// 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
System.out.println(this.year);
System.out.println(this.month);
System.out.println(this.day);
}
public static void main(String[] args) {
// int a;
// System.out.println(a);
// 此处a没有初始化,编译时会报错:
// Error:(24, 28) java: 可能尚未初始化变量a//编译通过
Date d = new Date(2021,6,9);
}
}

 可以看到局部变量在使用时必须要初始化,但成员变量即使没有初始化也可以正常使用。

事实上,并非成员变量没有初始化,只是编译器帮我们做了这件事,对成员变量设置了初始值。

Date d = new Date(2021,6,9);

在程序层面只是简单的一条语句,但在JVM层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

数据类型默认值
byte

0

char'\u0000'
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull

5. 设置对象头信息
6. 调用构造方法,给对象中各个成员赋值

我们也可以在声明成员变量时,就直接给出了初始值。

public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}
public Date(int year, int month, int day) {
}
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}

代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

总结:

类和对象之间的关系可以理解为类是对象的模板,而对象是类的实例。通过类可以创建多个对象,每个对象都有自己的属性和行为,但是它们共享同一个类的定义。对象是类的实例化结果,它是类的具体实体。对象具有类定义的属性和行为,并且可以通过访问对象的成员变量和调用对象的方法来操作对象。每个对象都有自己的状态(成员变量的值)和行为(方法的执行)。希望本文对你有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础入门例程45-NP45 禁止重复注册(条件语句)

最近的博文: Python基础入门例程44-NP44 判断列表是否为空(条件语句)-CSDN博客 Python基础入门例程43-NP43 判断布尔值(条件语句)-CSDN博客 Python基础入门例程42-NP42 公式计算器(运算符)-C…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题? 在分类问题中,我们试图预测的变量𝑦是离散的值,通常表示某种类别或标签。这些类别可以是二元的,也可以是多元的。分类问题的示例包括: 判断一封电子邮件是否是垃圾邮件(二…

基于鹰栖息算法的无人机航迹规划-附代码

基于鹰栖息算法的无人机航迹规划 文章目录 基于鹰栖息算法的无人机航迹规划1.鹰栖息搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用鹰栖息算法来优化无人机航迹规划。 1.鹰栖息…

汽车标定技术(二)--基于XCP的标定测量实战

目录 1.工程创建 1.1 新建工程 1.2 设备配置 1.3 标定观测 1.4 刷写 2.原始hex文件与标定文件的合并 2.1 修改memory segment file 2.2 标定量地址偏移 ​编辑 2.3 标定后与原始hex文件合并 2.4 标定后直接merge 2.5 不用对ram地址进行偏移实现hex文件合并 本文使用…

linux 安装 elasticsearch 全教程

一、去 elasticsearch官网找到Linux版本的下载链接 地址https://www.elastic.co/cn/downloads/elasticsearch 二、在linux 中用wget下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz三、下载成功后解压文件 tar -x…

Quartz之JDBC-JobStoreTX配置

一、前言 上篇 《Quartz介绍》中使用的是RAMJobStored存储调度信息,当进程终止调度信息会丢失,本篇我们介绍使用JDBCJobStore来存储调度信息(jobs、Triggers和日历)。 二、Quartz 表结构 可以从官网(http://www.qua…

java入门-JDK下载与安装

1、下载jdk Java 的产品叫JDK(Java Development Kit: Java开发者工具包),必须安装JDK才能使用java 1、官网地址 https://www.oracle.com/java/ https://www.oracle.com/java/technologies/downloads/ 目前比较稳定的版本为 JDK17. 我们就安…

node教程(五)接口+会话

文章目录 一.接口1.1接口是什么?1.2接口的作用1.3接口的开发与调用1.4接口的组成 一.接口 1.1接口是什么? 接口是前后端通信的桥梁 1.2接口的作用 实现前后端通信 1.3接口的开发与调用 大多数接口都是由后端工程师开发的,开发语言不限 一般情况下接口都是由…

Mac 下安装golang环境

一、下载安装包 安装包下载地址 下载完成,直接继续----->下一步到结束即可安装成功; 安装成功之后,验证一下; go version二、配置环境变量 终端输入vim ~/.zshrc进入配置文件,输入i进行编辑 打开的不管是空文本…

【数据开发】大数据平台架构,Hive / THive介绍

1、大数据引擎 大数据引擎是用于处理大规模数据的软件系统, 常用的大数据引擎包括Hadoop、Spark、Hive、Pig、Flink、Storm等。 其中,Hive是一种基于Hadoop的数据仓库工具,可以将结构化的数据映射到Hadoop的分布式文件系统上,并提…

Linux上编译sqlite3库出现undefined reference to `sqlite3_column_table_name‘

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 在Ubuntu 18上编译sqlite3库后在运行程序时出现undefined reference to sqlite3_column_table_name’的错误。网上的说法是说缺少SQLITE_ENABLE_COLUMN_M…

基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(六)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 这节主要讲条件节点与并发节点的有效性检查,主要是增加这两个节点的子节点检查,因为…

idea2023 PoJie以后无法修改内存无效

1. 打开电脑环境变量 2. 找到对应pojie文件 vmoptions目录 3. 修改这个文件 添加或者修改配置 -Xms128m -Xmx8192m4. 重启idea 修改成功

使用 ChatGPT 提升 LeetCode 刷题效率

文章目录 1 背景2 操作步骤 1 背景 在做 LeetCode 的 SQL 题库时, 想在本地调试, 需要在本地的数据库上创建表以及准备测试数据, 大家都是有经验的开发人员, 简单粗暴的办法就不讲了 可以借助 ChatGPT 的能力, 生产数据库的表以及测试数据的 sql, 提升刷题效率 2 操作步骤 将…

阿里云多款ECS产品全面升级 性能最多提升40%

“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新,为客户创造业务价值。”10月31日,杭州云栖大会上,阿里云弹性计算计算产品线负责人张献涛表示,通过持续的产品和技术创新,阿里云发布了HPC优化实例等多…

微信小程序 uCharts的使用方法

一、背景 微信小程序项目需要渲染一个柱状图,使用uCharts组件完成 uCharts官网指引👉:uCharts官网 - 秋云uCharts跨平台图表库 二、实现效果 三、具体使用 进入官网查看指南,有两种方式进行使用:分别是原生方式与组…

pix2tex - LaTeX OCR 安装使用记录

系列文章目录 文章目录 系列文章目录前言一、安装二、使用三、如果觉得内容不错,请点赞、收藏、关注 前言 项目地址:这儿 一、安装 版本要求 Python: 3.7 PyTorch: >1.7.1 安装:pip install "pix2tex[gui]" 注意&#xff1a…

Java设计模式——策略模式

1.策略模式简介 策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得…

C++ 代码实例:并查集简单创建工具

文章目录 前言代码仓库代码说明main.cppMakefile 结果总结参考资料作者的话 前言 C 代码实例:并查集简单创建工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) 代码 说明 简单地创建并查集注…

YOLO目标检测数据集大全【含voc(xml)、coco(json)和yolo(txt)三种格式标签+划分脚本+训练教程】(持续更新建议收藏)

一、作者介绍:资深图像算法工程师,YOLO算法专业玩家;擅长目标检测、语义分割、OCR等。 二、数据集介绍: 真实场景的高质量图片数据,数据场景丰富,分享的绝大部分数据集已应用于各种实际落地项目。所有数据…