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.如果没有自定义构造方法,那么编译器默认会构造方法。

结尾

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

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

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

相关文章

Docker之grep: (standard input): binary file matches

使用 docker compose logs -f | grep 命令时遇到了 grep: (standard input): binary file matches 错误。 这个错误通常发生在 grep 尝试搜索包含二进制内容的文件时。docker compose logs 命令会输出容器的日志,而这些日志可能包含二进制数据,导致 gre…

MySQL查询篇-集合运算

文章目录 union (并集)union distinctunion all intersect(交集)intersect allintersect distinct except 差集except distinctexcept distinctexcept all union (并集) union distinct 使用前提:a和c数据类型一致&a…

互联网摸鱼日报(2024-05-13)

互联网摸鱼日报(2024-05-13) 36氪新闻 当绿色飞行成为潮流,这家航空公司定下了新目标 | 最前线 回收雨水浇花,厨余垃圾变肥料,我们打卡了阿里北京新园区 | 最前线 本周双碳大事:中美就气候问题进行会谈;锂电池行业迎…

GIAT: 蛋白质结构预测的新利器

瑞典Karolinska研究院在瑞典政府赞助下由Ben Murrell等研究团队在AlphaFold 3最新报告后提出这篇论文提出了一种非常有趣和创新的方法来生成蛋白质骨架结构,称为生成式不变角度转换器(GIAT)。与现有的主要基于扩散模型和流匹配的方法不同,GIAT采用了类似于大型语言模型(如GPT)中…

【C语言|数据结构】双向链表

文章目录 前言1、初步认识双向链表1.1 定义:1.2 结构1.3 节点的存储 2、双向链表的接口函数2.1 链表的节点的动态申请2.2 链表的初始化2.3 尾插2.4 头插2.5 头删2.5 尾删2.6 在pos节点后面添加数据2.6 删除pos节点 3、双向链表的实现: 前言 各位小伙伴大…

C控制语句:分支和跳转

1.1if语句 //colddays.c --找出0摄氏度以下的天数占总天数的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

电子学会C/C++编程等级考试2024年03月(八级)真题解析

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数&#xff1a;道路的长度和需要为该路付的通行费&#xff08;以金币的数目来表示&#xff09; Bob and Alice 过去住在城市 1.在…

蓝海创业商机小吃配方项目,日入200+ ,小白可上手,图文创作转现快

小吃技术销售&#xff0c;一单价格从几元到几百元不等&#xff0c;行业竞争相对较小&#xff0c;是一个相对冷门的领域。只需一部手机&#xff0c;就可以发布图文并茂的内容&#xff0c;配上背景音乐&#xff08;BGM&#xff09;&#xff0c;即使是对视频剪辑不熟悉的新手&…

面试中算法(金矿)

有一位国王拥有5座金矿&#xff0c;每座金矿的黄金储量不同&#xff0c;需要参与挖掘的工人人数也不同。 例如&#xff0c;有的金矿储量是5ookg黄金&#xff0c;需要5个工人来挖掘;有的金矿储量是2ookg黄金&#xff0c;需要3个工人来挖掘...... 如果参与挖矿的工人的总数是10。…

【Oracle impdp导入dmp文件(windows)】

Oracle impdp导入dmp文件&#xff08;windows&#xff09; 1、连接数据库2、创建与导出的模式相同名称的用户WIRELESS2&#xff0c;并赋予权限3、创建directory 的物理目录f:\radio\dmp&#xff0c;并把.dmp文件放进去4、连接新用户WIRELESS25、创建表空间的物理目录F:\radio\t…

试衣不再有界:Tunnel Try-on开启视频试衣应用新纪元

论文&#xff1a;https://arxiv.org/pdf/2404.17571 主页&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要总结 随着虚拟试衣技术的发展&#xff0c;消费者和时尚行业对于能够在视频中实现高质量虚拟试衣的需求日益增长。这项技术允许用户在不实际穿…

目标检测——印度车辆数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

弱监督语义分割学习笔记

目录 partial cross entropy loss GitHub - LiheYoung/UniMatch: [CVPR 2023] Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation partial cross entropy loss import torch import torch.nn.functional as Fdef partial_cross_entropy_loss…

区块链中的APP与传统APP的区别

一、技术 区块链中的APP是基于区块链技术开发的&#xff0c;而传统APP则基于传统的应用程序商店或网页。区块链中的APP利用区块链技术的去中心化、数据不可篡改等特点&#xff0c;使得应用程序的开发和分发更加安全、透明和可信。与传统APP相比&#xff0c;区块链中的APP无需中…

如何实现嵌套路由

实现步骤 1. 新建子页面 2. 在router/index.js中的父路由节点添加children数组 3. 在children中添加子路由 {path: /,name: home,component: HomeView,children: [ {path: /pageA,name: pageA,component: pageA},{path: /pageB,name: pageB,component: pageB}] }, 5.在父路…

Web安全:SQL注入之布尔盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

前端VUE基础之创建脚手架

创建脚手架 第一步&#xff08;仅第一次执行&#xff09;&#xff1a;全局安装vue/cli。 npm install -g vue/cli 到你要创建项目的目录&#xff0c;然后使用命令创建项目 vue create xxxx 第三步&#xff1a;启动项目 npm run serv 备注&#xff1a; 1. 如出现下载缓慢请…

PHP流程控制

PHP 流程控制主要是 if 和 switch 流程控制。 当您编写代码时&#xff0c;您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中&#xff0c;提供了下列条件语句&#xff1a; if 语句 - 在条件成立时执行代码if...else 语句 - 在条件…

访客管理系统对于校园安全的重要性

校园访客办理计划是针对校园安全需求规划的安全办理体系&#xff0c;主要用于对校园外来人员的科学办理。要做好校园安全作业&#xff0c;把风险分子拒之门外尤为要害。校园访客办理计划实现访客实名制&#xff0c;并结合公安网、黑名单功用&#xff0c;对风险人员进行提前预警…

没有公网ip,如何实现外网访问内网?

目前拨号上网是最广泛的上网方式&#xff0c;这种方式优点是价格便宜&#xff0c;缺点是没有固定公网ip&#xff0c;每次重新您拨号ip地址都会变。如果有一台服务器&#xff0c;需要实现外网访问&#xff0c;在没有固定公网ip的环境下&#xff0c;该如何实现呢&#xff1f;使用…