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,一经查实,立即删除!

相关文章

微信小程序px、rpx、vh、百分比单位介绍

目录 px rpx vh 百分比% px px:css长度单位,一般为1/96英寸。 rpx rpx: 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。 设备rpx换算px (屏幕宽…

新版MQL语言程序设计:原型模式的原理、应用及代码实现

文章目录 一、什么是原型模式二、为什么需要原型模式三、原型模式实现方法四、原型模式的应用范围及例子五、原型模式的代码实现 一、什么是原型模式 原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过实例化类来创建 二、为…

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

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

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

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

Hotspot源码解析-第28章-终结篇章

第28章-终结篇章 经过前面27章的介绍,终于把Java虚拟机(hotspot)的运行流程和实现细节都走完了,相信能让读者对Java的运行机制和设计原理有一个全新的认识,众观全网及书籍,似乎没有一人这么系统的逐行对ho…

第2章 战略设计

第2章 战略设计 2-1 智慧零售案例项目介绍2-2 建模和设计的整体流程2-3 如何描述模型?从用户故事到通用语言2-4 SmartRM系统整体战略设计2-5 SmartRM通用语言文档2-6 分解问题:领域划分和子域2-7 确定系统最核心的部分:核心域和精炼2-8 分解模…

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

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

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

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

c语言实战之贪吃蛇

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

Codeforces Round 811 (Div. 3)(VP-15,寒假加训)

A. 模拟 // Problem: A. Everyone Loves to Sleep // Contest: Codeforces - Codeforces Round 811 (Div. 3) // URL: https://codeforces.com/group/RAx5fiilkP/contest/1714/problem/A // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Editor (https…

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…

Pandas展开数据

def testExplode():df = pd.DataFrame({key: [A, B],data: [[1

【论文复现】

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…

线性回归需要满足的几个假设

线性回归模型是基于一些假设构建的,这些假设有助于确保模型的有效性和可解释性。以下是线性回归需要满足的几个主要假设: 线性关系假设(Linearity): 线性回归假设因变量(目标变量)与自变量(特征…

如何通俗解释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…