Java 类与对象

目录

1 类是什么

1.1 面向对象

1.2 面向对象与面向过程

2 类定义和使用

2.1 类的定义格式

 2.2 练习定义一个狗类

3 类的实例化

4 this引用

5 对象的构造与初始化

5.1 构造方法与初始化

 5.2 默认初始化

5.3 就地初始化


1 类是什么

关于类是什么,我们需要对java的面向对象的思想有一定的认识


1.1 面向对象

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


1.2 面向对象与面向过程

手洗衣服就是面向洗衣服整个过程,一步一步设计,最后洗完衣服,非常繁琐,少一步可能都会导致这个过程执行不下去,按照该种方式来写代码,将来扩展或者维护起来会比较麻烦。

机洗衣服就是面向四个对象:人、衣服、洗衣粉和海尔洗衣机,用户不需要关注衣服是怎么洗的怎么甩干的,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。

面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:海尔洗衣机(美的也可以)。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言

Java语言中的类就是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了。

洗衣机类

属性:品牌、型号、重量、颜色等等

功能:洗衣、脱水等

在Java语言中,如何对上述的洗衣机类来进行定义呢?


2 类定义和使用

2.1 类的定义格式

class WashMachine{  //洗衣机类//成员属性/成员变量public String brand;    //品牌public String type; //类型public int weight;  //重量public String color;    //颜色//成员方法public void wash(){ //洗衣服功能System.out.println("洗衣服");}public void dry(){  //脱水功能System.out.println("脱水");}
}

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

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

【注意】

  1. 类名注意采用大驼峰定义
  2. 成员前写法统一为public,后面会详细解释
  3. 此处写的方法不带 static 关键字. 后面会详细解释

 2.2 练习定义一个狗类

public class PetDog{    //多了一个publicpublic String type; //类型public String name; //名字public int age; //年龄public void bark(){System.out.println(name + "汪汪!!");}public void wag(){System.out.println(name + "摇尾巴~~");}
}

【注意】

  1. 一般一个文件当中只定义一个类
  2. main方法所在的类一般要使用public修饰
  3. public修饰的类必须要和文件名相同

3 类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似

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

比如宠物狗是一个类,有金毛、哈士奇和拉布拉多等等,年龄不一样,名字不一样,就都是不一样的对象,类只是一个模型一样的东西,用来对一个实体(对象)进行描述,限定了类有哪些成员。一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

以 宠物狗类 为例,再定义一个文件TestDog

public class TestDog{public static void main(String[] args) {PetDog mydog = new PetDog();    //类的实例化mydog.name = "小狗";mydog.type = "哈士奇";mydog.age = 4;mydog.bark();mydog.wag();}
}//输出结果
//小狗汪汪!!
//小狗摇尾巴~~

【注意】

  1. new 关键字用于创建一个对象的实例。
  2. 使用 . 来访问对象中的成员变量和方法。
  3. 同一个类可以创建多个实例化对象。 

4 this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

【特性】 

this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

this只能在"成员方法"中使用

在"成员方法"中,this只能引用当前对象,不能再引用其他对象

结合后面的构造方法一起讲 


5 对象的构造与初始化

5.1 构造方法与初始化

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

//PetDog.java
public class PetDog{public String type;public String name; public int age; //构造方法public PetDog(String type,String name,int age){this.type = type;   //当形参和实参名字相同时,this.name = name;   //this来告诉编译器这个type、name和agethis.age = age;     //是属于哪个对象的}public void bark(){System.out.println(name + "汪汪!!");}public void wag(){System.out.println(name + "摇尾巴~~");}
}//TestDog.java
public class TestDog{public static void main(String[] args) {PetDog mydog = new PetDog("哈士奇","小狗",4);    //简化啦mydog.bark();mydog.wag();}
}
//输出结果一样

【特性】

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
  5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。注意:一旦用户定义了构造方法,编译器则不再生成无参的默认构造方法。
  6. 构造方法中,可以通过this调用其他构造方法来简化代码,this(...)必须是构造方法中第一条语句
public class PetDog{public String type; public String name; public int age;//构造方法(与下面那个是方法的重载(参数列表不一样))public PetDog(){//this调用下面那个构造方法来完成初始化this("金毛","大狗",5);}public PetDog(String type,String name,int age){this.type = type;   this.name = name;  this.age = age;     }public void bark(){System.out.println(name + "汪汪!!");}public void wag(){System.out.println(name + "摇尾巴~~");}
}public class TestDog{public static void main(String[] args) {PetDog mydog = new PetDog("哈士奇","小狗",4);PetDog mydog1 = new PetDog();   //调用无参的那个构造方法mydog.bark();mydog.wag();mydog1.bark();mydog1.wag();}
}//输出结果
//小狗汪汪!!
//小狗摇尾巴~~
//大狗汪汪!!
//大狗摇尾巴~~

 5.2 默认初始化

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

(1)检测对象对应的类是否加载了,如果没有加载则加载

(2)为对象分配内存空间

(3)处理并发安全问题

        比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

(4)初始化所分配的空间

        即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

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

(5)设置对象头信息(后续介绍)

(6)调用构造方法,给对象中各个成员赋值

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


5.3 就地初始化

在声明成员变量时,就直接给出了初始值。

public class PetDog{public String type = "金毛"; //就地初始化public String name = "大狗";public int age;
}

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


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

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

相关文章

开源版本管理系统的搭建一:SVN服务端安装

作者:私语茶馆 1.Windows搭建SVN版本管理系统 点评:SVN本身非常简洁易用,VisualSVN文档支撑非常好,客户端TortoiseSVN非常专业。5星好评。 1.1.SVN概要和组成 背景介绍 Svn是一个开源版本管理系统,由CollabNet公司…

一、Mysql索引的底层数据结构与算法

Mysql索引的底层数据结构与算法 前言一、索引数据结构为什么 MySQL 的索引要使用 B 树而不是其他树形结构?比如 B 树?为什么InnoDB存储引擎选择使用Btree索引结构? 二、索引分类思考:以下SQL语句,那个执行效率高?为什么&#xf…

SQL如何利用Bitmap思想优化array_contains()函数

目录 0 问题描述 1 位图思想 2 案例实战 3 小结 0 问题描述 在工作中,我们往往使用array_contains()函数来进行存在性问题分析,如判断某个数是否在某个数组中,但是当表数据量过多,存在大量array_contains()函数时,…

【软件测试】测试用例设计方法

1. 等价类划分法1.1. 等价类划分法的定义1.2. 有效等价类和无效等价类1.3. 等价类划分法实例分析 2. 边界值分析法2.1. 边界值分析法的定义2.2. 边界点2.3. 边界值法实例分析 3. 判定表法3.1. 如何用判定表法设计测试用例3.2. 判定表法实例分析 4. 正交表法4.1. 什么是正交表4.…

批量美化图片,轻松实现多张图片描边,让图片瞬间焕发新生!

图片已成为我们日常生活中不可或缺的一部分。无论是社交媒体上的个人分享,还是商业宣传中的产品展示,高质量、精美的图片都扮演着至关重要的角色。然而,对于许多人来说,图片处理仍然是一个令人头疼的问题。现在,我们为…

商超物联网方案-Hotspot Service和客流分析方案概述

商超物联网方案-Hotspot Service和客流分析方案概述 场景概述 大型商场、大型综合体在相互竞争及线上消费的影响下,利润增长缓慢,迫切需要通过提供个性化服务提升顾客购物体验,促进利润增长。 向不同顾客推送其感兴趣的广告,不仅…

c++游戏小技巧16:实例1(地牢生成算法)

1.前言 (头图) (其实最开始是想写恶魔轮盘的,但没想到它竟然更新了) (等我有时间在更,最近很忙,玩第五玩的) 想法来源:房间和迷宫:一个地牢生成算法https://indienova…

机器学习(五)之损失函数

上面几节讲了监督学习和非监督学习的一些算法(目前还不完整,会慢慢补充哒) 如果文章内容有错误,欢迎小伙伴在评论区指出! 前言: 损失函数在机器学习中非常重要,直接关乎模型的好坏(so?学好它)…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程,这里略过。 3. 安装 ninja …

matlab期末知识

1.期末考什么? 1.1 matlab操作界面 (1)matlab主界面 (2)命令行窗口 (3)当前文件夹窗口 (4)工作区窗口 (5)命令历史记录窗口 1.2 matlab搜索…

Elasticsearch:对 Java 对象的 ES|QL 查询

作者:Laura Trotta ES|QL 是 Elasticsearch 引入的一种新的查询语言,它将简化的语法与管道操作符结合起来,使用户能够直观地推断和操作数据。官方 Java 客户端的新版本 8.13.0 引入了对 ES|QL 查询的支持,提供了一个新的 API&…

Redis 实战2

系列文章目录 本文将从字典的实现、哈希算法、解决键冲突、rehash、渐进式rehash几方面来阐述 Redis 实战Ⅱ 系列文章目录字典的实现哈希算法解决键冲突rehash渐进式 rehash渐进式 rehash 执行期间的哈希表操作 字典 API总结 字典的实现 Redis 的字典使用哈希表作为底层实现&…

【大数据】学习笔记

文章目录 [toc]NAT配置IP配置SecureCRT配置PropertiesTerminal Java安装环境变量配置 Hadoop安装修改配置文件hadoop-env.shyarn-env.shslavescore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml 环境变量配置 IP与主机名映射关系配置hostname配置映射关系配置 关闭防火墙…

分层图像金字塔变压器

文章来源:hierarchical-image-pyramid-transformers 2024 年 2 月 5 日 本文介绍了分层图像金字塔变换器 (HIPT),这是一种新颖的视觉变换器 (ViT) 架构,设计用于分析计算病理学中的十亿像素全幻灯片图像 (WSI)。 HIPT 利用 WSI 固有的层次结…

【matlab基础知识】(三)二维曲线绘制plot

x[-pi:0.0001:pi]; 选择较小步距 ysin(tan(x))-tan(sin(x));plot(x,y) 条件和函数值做一个点乘 x[-2:0.02:2];y1.1*sign(x).*(abs(x)>1.1)x.*(abs(x)<1.1);plot(x,y) 颜色&#xff0c;线形&#xff0c;曲线上的标志 由于0.01cosx波动太小&#xff0c;所以plotyy绘制多…

正在载入qrc文件 指定的qrc文件无法找到。您想更新这个文件的位置么?

打开Qt的ui文件&#xff0c;弹出提示框 如果需要用到qrc文件&#xff0c;选择Yes&#xff0c;再选择qrc文件所在的位置&#xff1b;如果不需要qrc文件&#xff0c;可以选择No&#xff0c;然后用普通文本编辑器打开&#xff0c;将“ <resources> <include location&q…

ARP欺骗使局域网内设备断网

一、实验准备 kali系统&#xff1a;可使用虚拟机软件模拟 kali虚拟机镜像链接&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 注意虚拟机网络适配器采用桥接模式 局域网内存在指定断网的设备 二、实验步骤 打开kali系统命令行&#xff1a;ctrlaltt可快…

Zookeeper服务

一、什么是Zookeeper Zookeeper 是一个分布式应用程序的协调服务&#xff0c;它提供了一个高性能的分布式配置管理、分布式锁服务和分布式协调服务。它是 Apache 软件基金会的一个项目&#xff0c;被设计用来处理大规模的分布式系统中的一些关键问题。 Zookeeper的组成员关系&…

【C语言】——结构体

【C语言】——结构体 一、结构体类型的声明1.1、结构体的声明1.2、结构体变量的创建和初始化1.3、结构体的特殊声明1.4、结构体的自引用1.5、结构体的重命名 二、 结构体的内存对齐2.1、对齐规则2.2、结构体对齐实践2.3、为什么存在内存对齐2.4、修改默认对齐数 三、结构体传参…

VS Code 保存+格式化代码

在 VSCode 中&#xff0c;使用 Ctrl S 快捷键直接保存并格式化代码&#xff1a; 打开 VSCode 的设置界面&#xff1a;File -> Preferences -> Settings在设置界面搜索框中输入“format on save”&#xff0c;勾选“Editor: Format On Save”选项&#xff0c;表示在保存…