Java类和对象详解

文章目录

  • 一、面向对象初步认识
    • 1.1 什么是面向对象
  • 二、类的定义和使用
    • 2.1 简单认识类
    • 2.2 类的定义格式
  • 三、类的实例化
    • 3.1 什么是类的实例化
    • 3.2 类和对象的说明
  • 四、对象的构造及初始化
    • 4.1 如何初始化对象
    • 4.2 构造方法
      • (1) 概念
      • (2) 特性
    • 4.3 默认初始化
    • 4.4 就地初始化

本文章,将带着大家正式进入Java类和对象。类和对象是面向对象语言必须要学习的知识点。

一、面向对象初步认识

1.1 什么是面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2 面向对象与面向过程
我们原来所学的C语言就是面向过程的一门语言,注重过程,而我们现在所学的Java语言以及C++是面向对象的一门计算机语言。二者有一定的区别,面向过程语言更注重的是过程,而面向对象语言更注重结果。

(1)传统的洗衣过程
在这里插入图片描述
这种传统的方式,注重的是洗衣服的过程,少了一个环节可能就不行。但是不同的洗衣方式洗的方式,时间长度等等都是不同的,处理起来就比较麻烦,如果按照这种方式去写代码,将来扩展或者维护起来会比较麻烦。

(2)现代的洗衣过程
在这里插入图片描述
这样的洗衣方式与传统的洗衣方式比起来会方便许多,这样的洗衣过程就是人,衣服,洗衣机,洗衣粉四个对象互相协作完成的,人不需要关心洗衣机是如何洗衣服,如何甩干的。

以面向对象方式来处理问题,就不关注洗衣服的过程,只需将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。

二、类的定义和使用

2.1 简单认识类

类是用来对一个实体对象进行描述的,主要描述该实体(对象)具有哪些属性,特征,哪些功能,描述完计算机就可以识别了。

比如:人类,他是一种高级动物,在Java中可以看作是一个类别。
属性:鼻子,眼睛,嘴巴,胳膊,身体,头发等等…
功能:吃饭,睡觉,跑步,喝水,…

那么我们如何用Java语言来对上面类别进行定义呢?

2.2 类的定义格式

在Java中,定义类的时需要借助class关键字,具体用法如下:

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

class为定义类的关键字,ClassName为类的名字,{}为类的主体。

类中包含的内容为类的成员,属性主要是用来描述类的,称之为类的成员变量或类的属性。
成员变量(内部变量)是放在类内部,方法之外的变量。
方法主要说明类具有哪些功能,称为类的成员方法。

class Person{//属性public String name;public int age;//行为方法//睡觉public void sleep() {}//吃饭public void eat() {}
}

上面就是人这个类的定义格式。
注意:

  • 类名注意采用大驼峰定义。
  • 成员前写法统一为public,后面文章会解释。
  • 此处写的方法不带static关键字。

我们刚刚在一个Java文件中定义了多个类,我们要注意的是:

在这里插入图片描述
根据以上步骤修改即可,当我们以这样的方式更改public所修饰的类名时,系统会默认也把文件名也修改了。(这种方法只适用于一个Java文件中只有一个类的时候)

三、类的实例化

3.1 什么是类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:Dog类和Person类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。

用类类型创建对象的过程,称为类的实例化,在Java中采用new关键字,配合类名来实例化对象。

class Dog{public String name;  //姓名public String color;  //颜色public void barks() {System.out.println("汪汪叫~");}public void wag() {System.out.println("摇尾巴~");}
}
public class Test {public static void main(String[] args) {Dog dog1 = new Dog();  //实例化dog1.name = "阿黄";dog1.color = "黄色";System.out.println(dog1.name);System.out.println(dog1.color);dog1.barks();dog1.wag();System.out.println("========================");Dog dog2 = new Dog();dog2.name = "阿黑";dog2.color = "黑色";System.out.println(dog2.name);System.out.println(dog2.color);dog2.barks();dog2.wag();}
}

如上代码,我们定义一个狗类之后,在main主方法中通过new关键字去实例化这个狗类。然后再去给这个实例对象初始化,并调用其中的成员方法。运行结果如下。
在这里插入图片描述

注意:

  • new关键字用来创建一个对象的实例
  • 使用 . 来访问对象中的属性和方法
  • 同一个类可以创建多个对象

3.2 类和对象的说明

  • 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员。
  • 类是一种自定义的类型,可以用来定义变量。
  • 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。

如下图所示, 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
在这里插入图片描述

四、对象的构造及初始化

4.1 如何初始化对象

通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {int a;System.out.println(a);
}

在这里插入图片描述
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如下代码:

class Student {public String name;//姓名public int age;//年龄public void setStudent(String name,int age) {this.name = name;this.age = age;}public void printStudent() {System.out.println("姓名:"+name+"\n年龄:"+age);}
}
public class Test2 {public static void main(String[] args) {Student s1 = new Student();s1.setStudent("小魏",20);s1.printStudent();}
}

需要调用之前写的setStudent方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:

  • 每次对象创建好后调用setStudent方法设置具体日期,比较麻烦,那对象该如何初始化?
  • 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

4.2 构造方法

(1) 概念

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

class Student {public String name;//姓名public int age;//年龄public Student() { //构造方法this.name = "大强";this.age = 21;System.out.println("Student()");}
}
public class Test2 {public static void main(String[] args) {Student s1 = new Student();//s1.setStudent("小魏",20);s1.printStudent();}
}

如上就是一个不带参数的构造方法,大家仔细观察会发现所写的方法没有返回值,甚至连类型也没有写。那么构造方法是什么时候运行的呢,是如何被调用的呢。
在这里插入图片描述
大家看代码中被红框圈住的一行代码,我这样是为了更好的给大家讲清楚,构造方法是什么时候被调用的。
在这里插入图片描述
当我们运行代码后,我们会发现我们构造方法中所写的那行打印的函数在最前面。
在这里插入图片描述
经过我们打断点验证,我们会发现,构造方法在实例化对象的时候就会被调用。构造方法可以帮我们初始化对象成员变量。
那么问题又来了,我们原来没有写构造方法,为什么没有报错,还是可以正常编译运行。
因为对象的产生,换句话说:实例化一个对象的时候,有两步是很关键的:

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

当我们没有写任何一个构造方法的时候,那么Java编译器会默认自动提供一个不带参数的构造方法。但是这个构造方法没有做任何事情。

总结:我们写自己写构造方法时,编译器会调用我们所写的构造方法,如果我们没写构造方法时,编译器会调用自己默认给的构造方法

构造方法不止一个,我们可以根据自己的需求编写不同的构造方法。也根据自己的需求调用不同的构造方法。这些构造方法之间是重载的关系。

例如,除了上面那种不带参数的构造方法,我们还可以写含有参数的构造方法。如下图所示。
在这里插入图片描述
这样的好处就是我们不用在实例完对象之后再进行初始化,而是在实例化对象的同时传入参数,直接就调用构造方法就可以进行初始化。具体代码如下图所示。
在这里插入图片描述

注意:如果我们写自己的构造方法了,编译器则不会给我们默认提供不带参数的构造方法,(救急不救穷)也就是说,如果我们只写一个含参的构造方法,但是我们在实例化对象的时候,不想传入参数,想调用无参的构造方法,这是行不通的,编译器会报错。如下图所示。

在这里插入图片描述
总结:当一个构造方法都没有的时候,编译器会默认自动给我们提供构造方法,如果我们一旦有一个构造方法之后,编译器便不会再给我们提供构造方法。
注意:构造方法的作用就是对对象中成员进行初始化,并不负责给对象开辟空间。

(2) 特性

  • 名字必须与类名相同
  • 没有返回值类型,设置为void也不行
  • 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  • 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
  • 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
  • 构造方法中,可以通过this调用其他构造方法来简化代码。(如下图)
    在这里插入图片描述
    我们可以借助this在构造方法中调用其他的构造方法。上图代码运行结果如下。
    在这里插入图片描述
    注意:this语句只能在所在构造方法的第一行,否则会报错。
  • 构造方法绝大多数是用public来修饰的,特殊情景才会被private修饰。

4.3 默认初始化

在上面我们提到,为什么局部变量在使用前一定要进行初始化,但是成员变量不用呢?
其实是在我们new对象的时候,JVM为成员变量分配好了初始值(原因比较复杂,但我们知道结果就可以)。也就是我们所说的默认初始化。
**即:对象空间被申请好之后,对象中包含的成员已经设定好了初始值。比如:

数据类型默认值
byte0
char‘\u0000’
byte0
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull

4.4 就地初始化

就地初始化就是在声明成员变量时,直接进行赋初始值。
如下代码所示。

public class Date {public int year = 1900;public int month = 1;public int day = 1;
}

当然,不管是默认初始化,还是就地初始化,以及我们通过构造方法进行初始化,这些都需要我们根据我们不用的应用场景来编写不同的代码。

好啦,以上就是Java类和对象的详细介绍,相信这篇文章能给大家带来帮助。如果觉得博主写的不错的,可以留下你们的关注和点赞,和博主一起共同进步,一起努力。谢谢大家!也欢迎大家到评论下留言讨论。

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

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

相关文章

图片中的水印怎么去掉?教你三个去水印方法

在拍摄照片时,有时候会遇到不期而遇的路人出现在镜头中,给照片带来不必要的干扰。这时候我们就需要把路人给去掉,让照片变的更加完美。下面我将给大家分享三个把照片中的路人去掉的小妙招。 一、水印云 水印云是一款非常实用的图片处理工具…

腾讯发表多模态大模型最新综述,从26个主流大模型看多模态效果提升关键方法

在大规模语言模型(LLMs)通往通用人工智能(AGI)的道路中,从传统的单一的“语言模态”扩展到“图像”、“语音”等等的“多模态”必然是大模型进化的必经之路。 在过去的 2023 年,多模态大规模语言模型&…

【Node-RED】node-red-contrib-opcua-server模块使用(2)

这里写自定义目录标题 前言示例简单介绍变量产生opcuaServe配置 地址空间的配置创建opcua服务器获取命名空间初始化变量定义文件夹定义文件夹中的变量view文件夹增加view文件夹中查阅信息定义最终效果 加密设置opcuaServe组件配置客户端配置 参考官网博文 前言 上期博文【Node…

零基础学编程,中文编程入门视频教程

零基础学编程,中文编程入门视频教程 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 如上图为编程工具构件…

c语言实战之贪吃蛇

文章目录 前言效果展示游戏用到的图片游戏思路一览游戏前准备一、贪吃蛇、食物、障碍物节点坐标的结构体二、枚举游戏状态、和贪吃蛇的方向三、维护运行的结构体 游戏开始前的初始化一、学习图形库相关知识二、设置背景三、欢迎界面四、初始化贪吃蛇五、生成障碍物六、生成食物…

SharedPreferences卡顿分析

SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式,是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里,SP的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以…

【JAVA语言-第16话】集合框架(三)——Set、HashSet、LinkedHashSet、TreeSet集合的详细解析

目录 Set集合 1.1 概述 1.2 特点 1.3 HashSet集合 1.3.1 概述 1.3.2 哈希表 1.3.3 哈希值 1.3.4 练习 1.3.5 HashSet存储自定义类型元素 1.4 LinkedHashSet集合 1.4.1 概述 1.4.2 特点 1.4.3 练习 1.5 TreeSet集合 1.5.1 概述 1.5.2 练习 1.6 HashSet、Lin…

【论文复现】

code: paper: 论文 介绍 方法 实验 结论 复现 Image generation 问题1:No models "dcface/dcface/pretrained_models/adaface_ir101_webface4m.ckpt Traceback (most recent call last):File "/data/dcface/dcface/src/r…

如何通俗解释Docker是什么?

要想弄懂Docker,咱们得先从“容器化”讲起。 一、容器化技术及Docker的出现 容器化,它是一种轻量级、可移植的软件打包方式,你就想象成一个快递箱子,里面装着你的应用和所有需要运行的环境,这个箱子能在任何支持容器…

Redisson分布式锁介绍及实战应用(防止缓存击穿)

本地锁 浏览器把100w请求由网关随机往下传,在集群情况下,每台服务都放行10w请求过来,这时候每台服务都用的是本地锁是跨JVM的, 列如这些服务都没有49企业,此时有几个服务进行回原了打击在DB上面,那后期把这…

Blender教程(基础)-物体的移动、旋转与缩放-04

一、新建一个立方体 ShiftA新建一个立方体用来演示。 二、物体的移动 xyz轴移动 点击下图图左侧的移动选项后,选中要移动的物体,会出现三个箭头的方向,这分别代表沿着x、y、z轴移动。xyz平面移动 这个小正方体代表沿着某一个面移动&#…

AWS 专题学习 P14 (Security Encryption)

文章目录 专题总览为什么需要加密?AWS KMS(密钥管理服务)KMS 密钥类型AWS KMS(密钥管理服务)Copying Snapshots across regionsKMS Key Policies在不同账户之间复制快照KMS Multi-Region Keys (多区域密钥)DynamoDB 全…

ElasticSearch 学习笔记

基本概念 术语 文档(document):每条记录就是一个文档,会以 JSON 格式进行存储 映射(mapping):索引中文档字段的约束信息,类似 RDBMS 中的表结构约束(schema&#xff09…

在linux上进行编译调试

1.相关疑问 1. 为什么在代码里使用了一个未定义过的函数(如add()),在编译阶段不会报错,在链接阶段会报错呢? 答:先说几个代码编译的结论: 单个\.c源文件文件被编译成机器码文件时&#xff0c…

LVS 工作模式

1、LVS DR模式 DR 模式是通过改写请求报文的目标 MAC 地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR 模式可以极大的提高集群系统的伸缩性。但是要求调度器 LB 与真实服务器 RS 都有一块网卡连接到同一物理网段上…

Codeforces Round 785 C. Palindrome Basis

C. Palindrome Basis 题意 定义一个正整数 a a a 是回文的(没有前导 0 0 0)当且仅当: a a a 的十进制表示形式回文 给定一个正整数 n n n ,求出将 n n n 拆分成若干个回文数之和的方案数 思路 这是一个经典模型&#xff0…

媒体邀约:怎么吸引总体目标受众?

新闻媒体影响力日益扩大。不论是公司、机构还是其他,都希望能够通过新闻媒体的曝光来吸引更多总体目标受众。要想真正吸引住总体目标受众并非易事,需要一定的方案和方法。下面我们就深入探究媒体邀约推广的真相,共享怎么吸引总体目标受众的方…

秋招面试—计算机网络安全

2021 计算机网络安全 1.Get 和 Post 的区别 get 用于获取数据,post用于提交数据; get 的缓存保存在浏览器和web服务器日志中; get 使用明文传输,post请求保存在请求体中; get 长度限制在2048以内 2.常见的HTTP请…

Android P 屏保和休眠相关知识

Android P添加屏保功能,如果休眠时间设定大于屏保时间,则先进入屏保,达到休眠时间后再进入休眠 需求: 添加屏幕互保开关,默认关闭。只保留时钟,可设定指针和数字、夜间模式。启用时间改多长时间无操作进入…

###C语言程序设计-----C语言学习(6)#

前言:感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。 一. 主干知识的学习 1. while语句 除了for语句以外,while语句也用于实现循环,而且它…