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

Java--初识类和对象

前言

本篇讲解Java类和对象的入门版本。
学习目的:
1.理解什么是类和对象。
2.引入面向对象程序设计的概念
3.学会如何定义类和创建对象。
4.理解this引用。
5.了解构造方法的概念并学会使用

考虑到篇幅过长问题,作者决定分多次发布。

面向对象的引入

Java是一门面向对象的程序设计语言。那么面向对象具体是啥意思呢?
面向对象(Object-oriented)更多是一种思维模式,它替换了原有的面向过程的思考方式,转为了面向对象。这种编程思想强调了将问题分解为对象的集合,对象有各自的属性和方法,对象与对象之间又有信息传递和行为协助。

  • 总结:解决问题的重心由拆分步骤,改变成拆分成对象,对象和对象的协作上。编程思维模式的转变

面向过程编程

如果你先前学过任何一门面向过程的编程语言,比如C语言。回忆一下,先前解决问题是不是研究解决一个问题的过程是怎样的?
它的重点在于如何完成任务,要实现哪些功能的函数,函数接收参数返回值,执行一系列的逻辑结构过程,然后才是研究数据应该采用什么数据结构存储,最后输出正确的结果。
面向过程首先考虑的是如何处理数据即算法,其次是数据如何存储(数据结构)。

面向对象编程

面向对象编程(Object-Oriented Programming)简称OOP.它是一种以对象为中心的编程范式,对象有自己的状态行为,通过封装,继承,多态实现代码的模块化。实现对象与对象之间的协作和交互。
与面向过程对比,面向对象先考虑的是数据如何存储,将相关联的数据和方法包装成一个对象。其次考虑处理对象与对象之间。可以说先数据结构后算法,与面向过程反着来了。

生活化的示例

传统洗衣服(面向过程)

1.拿脏的衣物。
2.水槽装足够的水
3.加入洗衣粉
4.将脏衣服放入水槽
5.疯狂手搓
6.冲洗衣服
7.换水
8.继续冲洗衣服
9.拧干洗好的衣服
10.晾衣服。

现代洗衣服(面向对象)

确定对象 脏衣物,洗衣粉,洗衣机
我们人为交互
1.将脏衣物放入洗衣机
2.倒入洗衣粉。
3.设定洗衣机的程序。
洗完后,取出晾干就可以了。
整个都是三个对象的交互。洗衣机怎么洗的,内部怎么运作的?I don’t care.
总之我知道按照上面三步衣服就洗好了。

类和对象的概念

举个栗子,人就是一个类。人有姓名,年龄,身高,体重,家庭住址。但人的概念太抽象了,太广泛了。那么张三,小红,李华,你和我,就是具体的人了,我们也有上面的姓名身高年龄。
所以呢,*类是类型,蓝图,模板。*即上面例子中的人。那么后面的张三就是具体的人,就称为一个对象。人有的属性,张三也有。
所以,类可以描述对象,对象是类的实例化

接下来正式介绍类
类(class)是构造( construct ) 对象的模板和蓝图, 由类构造对象的过程称为创建类的实例 ( instance ) 。
现在笼统的阐述类的特点,后面补充实例

类的特点:
1.属性(fileds):类可以定义成员变量。成员变量体现的是对象的属性(状态特征)。每个对象通过各自类的属性有自己的特点状态。
2.方法(methods):类内部可以定义成员方法,简称方法或者函数。方法定义了对象的行为,方法可以让对象执行某种特定的功能,更能完成对象与对象的协作。
3.类的实例化(instance):类本身只是一个模板,类似C中的结构体。只有实例化(构造对象),它内部的属性和方法才有意义。如何创建下面会给出例子。
4.构造方法(construct):这里先不提,往后看下去,后面会讲。
5.封装类,抽象类,继承,接口…………这里不提。其实作者也没懂完

现在可以定义一个类了
类的基本语法(目前掌握以下这些就够了)

class 类名{
//属性:成员变量

//成员方法
}

1.class 类的关键字,定义一个类必须有。
2.类名:遵循标识符的命名规则,采用大驼峰命名法。
3.花括号别忘了,别漏了。
4.属性(成员变量):这里可以定义各种类型变量表示类的状态了。
5.成员方法:定义类的行为与操作。

下面定义一个Dog类

public class Dog {
//成员变量public String name;public int age;//成员方法public void bark(){System.out.println("Ruff! Ruff!");}
}

上面我们定义这样一个类,该类有两个成员变量,分别是字符串name和int年龄。还有bark这样一个成员方法表示dog在叫的行为。
这里的public是访问修饰符,表示类,成员变量,成员方法的访问权限。

类的实例化
由类生成对象的过程叫做类的实例化

类在Java中为引用类型。
int double float为内置类型(基本数据类型),Java中与其相对的类型称为引用类型,数组字符串也是引用类型。引用类型也是自定义类型,类是用户自定义出来的类型。
Java中由类创建一个对象,要用到关键字new.

Dog dog=new Dog();

语法:
类名 变量名 = new 类名()
这里Dog就是先前定义的类了。
dog是这个类类型的变量名。
new “给我一个对象” 后面跟上Dog()就创建了一个属于Dog的对象了。
new后面其实跟着的是构造方法,这个稍后再说。

既然创建了对象,我们定然想到如何处理对象呢。

        dog.age=1;dog.name="Bin";dog.bark();

通过圆点运算符(.)我们就可以访问对象的成员了和方法了。
这里对象继承了类的属性,这个实例化的dog也有了name和age,也能调用bark()方法了。

假设我们不对对象初始化操作,会出现问题吗?
不会,因为局部变量未初始化会被编译器报错警告。而对象的成员变量不在栈上而在堆上,未初始化会有对应的默认值。

        Dog dog=new Dog();System.out.println(dog.name);System.out.println(dog.age);

未初始化默认打印结果
对于引用类型,其默认值为null;内置类型就为相应的0值,int对于0,float对应0.0F,double对应0.0,另外boolean对应false。


我这里的dog在main方法内部创建,就是局部变量在栈上开辟一块空间,同时在堆上为这个对象开辟合适的空间保存对象的属性。这里的dog实际存储了对象在堆上的地址,dog就称为一个引用。通过引用,我们访问对象的成员。

对象

其实类那一部分已经说明完大部分对象的内容,这里稍作补充和总结。

对象有状态。这里的状态从代码来看就是成员变量的值不同,反过来就算同一个类的对象成员变量的值不同说明他们之间状态不同。
对象有行为。根据对象的状态,调用成员方法行为上不同,反之根据自身的行为(方法调用)也会影响自身状态。
对象有名字。每个对象应该有独立的标识符来区分不同
对象与对象之间独立。每个对象有自己的状态和行为。

认识this引用

关键字this

先定义如下一个类
里面的setData成员方法中的形参与成员变量名同名还能进行赋值吗?

public class Date {public int year;public int month;public int day;public void setDate(int year,int month,int day){year=year;month=month;day=day;}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}
}
public class Date {public int year;public int month;public int day;public void setDate(int year,int month,int day){year=year;month=month;day=day;}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public static void main(String[] args) {Date date=new Date();date.setDate(2024,5,13);date.printByString();}
}

运行结果是怎样的呢?修改data对象的值了吗?
答案必然是没有!否则这里要说明的this干嘛呢。
很明显,这里setDate里形参和成员变量名重复了,左值的year究竟代表了成员变量还是形参呢?是形参。
所以,这里上述的赋值就是自我娱乐,对成员变量没有影响。因为调用方法时会在栈上开辟空间称作函数栈帧,此时局部变量(函数形参)优先使用。
这个时候就要用上this对setDate函数做出如下修改。

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

这里的this相当于原来的date对象,很显然this.成员变量和方法参数区分开了。说明了这里左值同名的year,month,day是引用(data对象)的成员变量。避免出现同名时混淆的情况。

那么this是怎样知道它代表哪个引用呢?
实际上那个对象的引用在某个方法时会将这个引用当作函数参数传递过去。
实际的setDate写成下面这样。只不过我们写的时候省略了第一个参数罢了。
由此我们可以知道那个对象的引用在调用某方法时,这个this就代表谁了。

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

这里的this由于就是date,它也可以调用自身的成员方法。


public class Date {public int year;public int month;public int day;public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;this.printByString();}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public static void main(String[] args) {Date date=new Date();date.setDate(2024,5,13);}
}

this还有一个用处调用其它构造方法

构造方法

前面提过成员方法,那么构造方法和成员方法有什么区别呢?类比学习一下吧。

一般的成员方法格式:
返回值 方法名(参数列表){
//方法体
}

构造方法可以看作特殊的成员方法
第一,它没有返回值类型。
第二,它的方法名和它的类名一样。

构造方法格式:
返回值 方法名 类名(参数列表){
//方法体
}

public Date(){}

这就是一个简单的构造方法。
想到前面这个Date date=new Date(); new后面的 Date()不就是一个构造方法吗?哎奇怪,当时我们并没有创建这样的构造方法呀。
事实上,如果定义的类没有构造方法,编译器会默认给你上述的构造方法,这种构造方法是最简单的。没有带任何参数。
需要注意的是,如果你自己创造了一个构造方法,请严格按照你的构造方法创建对象,此时编译器不会在为你默认这么一个构造方法了。

下面给出一个带参数形式的构造方法。

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

这样就可以在创建对象时同时初始化成员变量了。
构造方法同样支持重载。即上面两个构造方法可以同时存在一个Date类中。

public class Date {public int year;public int month;public int day;public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;this.printByString();}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public Date(){}public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public static void main(String[] args) {Date date=new Date(2004,12,8);date.printByString();}
}

最后总结一下构造方法:
1.构造方法名与类名相同。
2.无返回值类型,不要理解成返回值类型为void
3.创建对象时调用,且只能调用一次。
4.构造方法可以重载。(比如上面的构造方法在创建对象时可以选择不带参数,还可以选三个参数初始化的)
5.如果没有自定义构造方法,那么编译器默认会构造方法。

结尾

想不出来说什么了,太困了。嗯~
一无所有,或者赢下所有

相关文章:

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的: 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题,作者决定分多次发布。 面向对象的引入 J…...

SpringBoot如何实现动态数据源?

在Spring Boot中实现动态数据源主要涉及到创建和管理不同的数据源,并在运行时根据需要切换。这可以通过编程方式配置Spring的AbstractRoutingDataSource来完成。下面我会逐步介绍如何实现动态数据源,并给出代码示例。 第1步:添加依赖 首先&…...

win10安装mysql8.0+汉化

一、官网安装 MySQL 1. 在mysql官网进行下载页面 2. 下滑页面,选择 MySQL community download 3.下载windows版本 4.选择第二个download 5.不用登陆,no thanks,just start my download. 6.下载 二、安装 1. 双击安装 2. 选 Full->next 3…...

全网最全的Postman接口自动化测试!

该篇文章针对已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境: Window 7 - 64 Postman 版本(免费版):Chrome App v5.5.3 不同版本页面 UI 和部分…...

Spring:了解@Import注解的三种用法

一、前言 在 Spring 框架中,Import 注解用于导入配置类,使得你可以在一个配置类中引入另一个或多个配置类,从而实现配置的模块化。这对于组织大型应用程序的配置非常有用,因为它允许你将配置分散到多个类中,然后再将它…...

简要介绍三大脚本语言 Shell、Python 和 Lua

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序,以提高任务执行的速度和效率。在众多脚本语言中,Shell、Python 和 Lua 是…...

第 397 场 LeetCode 周赛题解

A 两个字符串的排列差 模拟&#xff1a;遍历 s s s 记录各字符出现的位置&#xff0c;然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…...

文件存储解决方案-阿里云OSS

文章目录 1.菜单分级显示问题1.问题引出1.苹果灯&#xff0c;放到节能灯下面也就是id大于1272.查看菜单&#xff0c;并没有出现苹果灯3.放到灯具下面id42&#xff0c;就可以显示 2.问题分析和解决1.判断可能出现问题的位置2.找到递归返回树形菜单数据的位置3.这里出现问题的原因…...

基于Java的飞机大战游戏的设计与实现(论文 + 源码)

关于基于Java的飞机大战游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313362 基于Java的飞机大战游戏的设计与实现 摘 要 现如今&#xff0c;随着智能手机的兴起与普及&#xff0c;加上4G&#xff08;the 4th Generation mobile communication &#x…...

Vue路由开启步骤

1.在控制台输入命令 //控制台下载安装npm add vue-router3.6.5 2.在main.js下导入并注册组件 import Vue from vue import App from ./App.vue//控制台下载安装npm add vue-router3.6.5 //导入 import VueRouter from "vue-router";//注册 Vue.use(VueRouter) con…...

【碎片知识】2024_05_15

char int long float double运算的时候是从低转到高的&#xff0c;表达式的类型会自动提升或者转 换为参与表达式求值的最上级类型. 关于代码的说法正确的是&#xff08; &#xff09; #include <stdio.h> int main() {int x -1;unsigned int y 2;if (x > y){printf…...

彩虹聚合DNS管理系统

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0c;支持获取域名…...

服务网格 SolarMesh v1.13 重磅发布

SolarMesh是行云创新推出的流量治理平台&#xff0c;它基于Istio&#xff0c;为部署在K8s集群上的应用提供全面的流量治理能力。 在之前的版本中&#xff0c;SolarMesh提供的能力有&#xff1a;流量视图&#xff0c;流量控制策略批量配置&#xff0c;API级别的流量数据采集和展…...

三大平台直播视频下载保存方法

终于解决了视频号下载的问题&#xff0c;2024年5月15日亲测可用。 而且免费。 教程第二部分&#xff0c;有本地电脑无法下载的解决方案。 第一部分&#xff1a;使用教程&#xff08;正常&#xff09; 第1步&#xff1a;下载安装包 下载迅雷网盘搜索&#xff1a;大海福利合集…...

OpenAI GPT-4o - 介绍

本文翻译整理自&#xff1a; Hello GPT-4o https://openai.com/index/hello-gpt-4o/ 文章目录 一、关于 GPT-4o二、模型能力三、能力探索四、模型评估1、文本评价2、音频 ASR 性能3、音频翻译性能4、M3Exam 零样本结果5、视觉理解评估6、语言 tokenization 六、模型安全性和局限…...

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…...

C++ 日志库 log4cpp 编译、压测及其范例代码 [全流程手工实践]

文章目录 一、 log4cpp官网二、下载三、编译1.目录结构如下2.configure 编译3.cmake 编译 四、测试五、压测源码及结果1.运行环境信息2.压测源码3.压测结果 文章内容&#xff1a;包含了对其linux上的完整使用流程&#xff0c;下载、编译、安装、测试用例尝试、以及一份自己写好…...

python数据处理与分析入门-pandas使用(4)

往期文章&#xff1a; pandas使用1pandas使用2pandas使用3 pandas使用技巧 创建一个DF对象 # 首先创建一个时间序列 dates pd.date_range(20180101, periods6) print(dates)# 创建DataFrame对象&#xff0c;指定index和columns标签 df pd.DataFrame(np.random.randn(6,4), …...

操作系统-单片机进程状态问题(三态模型问题)

例题&#xff1a;在单处理机计算机系统中有1台打印机、1台扫描仪&#xff0c;系统采用先来先服务调度算法。假设系统中有进程P1、P2、P3、P4&#xff0c;其中P1为运行状态&#xff0c;P2为就绪状态&#xff0c;P3等待打印机&#xff0c;P4等待扫描仪。此时&#xff0c;若P1释放…...

Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)

Linux文件&#xff1a;重定向底层实现原理&#xff08;输入重定向、输出重定向、追加重定向&#xff09; 前言一、文件描述符fd的分配规则二、输出重定向&#xff08;>&#xff09;三、输出重定向底层实现原理四、追加重定向&#xff08;>>&#xff09;五、输入重定向…...

波搜索算法(WSA)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、全…...

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…...

哈希表的理解和实现

目录 1. 哈希的概念 (是什么) 2. 实现哈希的两种方式 (哈希函数) 2.1. 直接定址法 2.2. 除留余数法 2.2.1. 哈希冲突 3. 补充知识 3.1. 负载因子 3.2. 线性探测和二次探测 4. 闭散列实现哈希表 (开放定址法) 4.1. 开放定址法的实现框架 4.2. Xq::hash_table::insert…...

分治算法(Divide-and-Conquer Algorithm)

分治算法&#xff08;Divide-and-Conquer Algorithm&#xff09;是一种重要的计算机科学和数学领域的通用问题解决策略。其基本思想是将一个复杂的大规模问题分割成若干个规模较小、结构与原问题相似但相对简单的子问题来处理。这些子问题相互独立&#xff0c;分别求解后再通过…...

Java项目:基于ssm框架实现的实验室耗材管理系统(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的实验室耗材管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.8 …...

如何通过专业的二手机店erp优化手机商家运营!

在数字化浪潮席卷全球的大背景下&#xff0c;手机行业作为科技发展的前沿阵地&#xff0c;正经历着前所未有的变革。对于众多手机商家而言&#xff0c;如何在这场变革中抢占先机&#xff0c;实现数字化转型&#xff0c;成为了摆在他们面前的一大难题。幸运的是&#xff0c;途渡…...

CentOS常见的命令及其高质量应用

CentOS是一个流行的、基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的开源服务器操作系统。由于其稳定性和强大的性能&#xff0c;CentOS被广泛应用于各种服务器环境中。为了有效地管理和维护CentOS系统&#xff0c;熟悉并掌握其常见命令是非常重要的。本文将介绍…...

nodeJs用ffmpeg直播推流到rtmp服务器上

总结 最近在写直播项目 目前比较重要的点就是推拉流 自己也去了解了一下 ffmpeg FFmpeg 是一个开源项目&#xff0c;它提供了一个跨平台的命令行工具&#xff0c;以及一系列用于处理音频和视频数据的库。FFmpeg 能够执行多种任务&#xff0c;包括解封装、转封装、视频和音频…...

Django信号与扩展:深入理解与实践

title: Django信号与扩展&#xff1a;深入理解与实践 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 后端开发 tags: Django信号松耦合观察者扩展安全性能 第一部分&#xff1a;Django信号基础 Django信号概述 一. Django信号的定义与作用 Django信…...

使用Docker创建verdaccio私服

verdaccio官网 1.Docker安装 这边以Ubuntu安装为例Ubuntu 安装Docker​&#xff0c;具体安装方式请根据自己电脑自行搜索。 2.下载verdaccio docker pull verdaccio/verdaccio3.运行verdaccio 运行容器&#xff1a; docker run -it -d --name verdaccio -p 4873:4873 ver…...