初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客

目录

面向对象的初步认知

面向对象与面向过程的区别

类的定义和使用 

类的定义格式

类的实例化

this引用

什么是this引用?

this引用的特性

对象的构造及初始化

如何初始化对象(的成员变量)

构造方法 


本期我们就来学习面向对象。

面向对象的初步认知

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

面向对象与面向过程的区别

面向过程:注重的是过程;面向对象:注重的是对象。

例如:我们要吃饭了。首先,得找一个饭馆子,再点菜,最后再吃饭。

如果是面向过程的话,就需要关注这些过程:找饭馆子的过程,点菜,吃饭。

如果是面向对象的话,就需要关注这些对象:我们自己,饭馆子,菜。不需要关注过程了。

从这里就可以简单看出对象比过程要简单。

注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

类的定义和使用 

类是用来描述对象的。

例如:一个学生就是一个对象(Java中一切皆对象),我们现在如果想要来描述这个学生的话,就得用类来描述。

类的定义格式

//class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
//类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。
//方法主要说明类具有哪些功能,称为类的成员方法。

// 创建类
class ClassName{
    field; // 字段(属性) 或者 成员变量 :定义再类当中,方法外部的变量
    method; // 行为 或者 成员方法
}

 成员变量分为两种:一种是普通成员变量,一种是静态成员变量。

普通成员变量:public int age;      静态成员变量:public static int age;  

成员方法也分为两种:一种是普通成员方法,一种是静态成员方法。

普通成员方法:public void func()     静态成员方法:public static void func()

我们现在就来描述一个学生对象。

class Student {
    public String name;//名字
    public int age;//年龄

    public void func(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}

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

练习:定义一个类:狗

class Dog{
    public String name;//名字
    public int age;//年龄
    public void func(){
        System.out.println(name+" :汪汪汪~~~");
    }
}

注意事项: 1. 一般一个文件当中只定义一个类(推荐),虽然可以定义多个类,但是只能有一个类被public 修饰。 2. main方法所在的类一般(不是绝对(如下图1所示)要使用public修饰。(注意:Eclipse默认会在public修饰的类中找main方法) 3. public修饰的类必须要和文件名相同 4. 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(如下图2所示)。 5. 每一个类都会生成一个对应的字节码文件(如下图3)。

 图1:

图2:

 当只有一个类时,就可以修改成功。

当有多个类时,就会修改失败。

修改同上步骤,但修改的结果不同。

图3:

在……out / production ……目录下。 

下面是怎么查看的视频

JavaSE篇(类和对象(上))怎么查看字节码文件-CSDN直播

类的实例化

我们在定义了一个类的同时就相当于创建了一种新的类型。和int,char一样,只不过int,char这些是Java的内置类型,而类是用户自定义的类型。既然创建了类型,我们就肯定会用这个类型来定义变量。举个简单的例子:我们拿到int类型,就可以使用int类型来创建一个变量 int a = 0;  同样这个类也是可以这样的,我们把用类定义一个变量的过程称为类的实例化(我们更喜欢说是用类创建对象的过程)

public class Test {
    public static void main(String[] args) {
        //java中使用new关键字,来配合类名实例化对象
        Student student = new Student();//通过new来实例化对象
        //通过 . 来访问类的属性和方法(功能)
        student.name = "张三";
        student.age = 18;
        student.func();
    }
}

//创建一个类
class Student{
    //属性
    String name;
    int age;
    //功能(方法)
    public void func(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}

注意:一个类可以实例化多个对象。

可能会有小伙伴发现:类有点像我们C语言学过的结构体。没错这个类和结构体是非常类似的。

this引用

public class Test{
    public static void main(String[] args) {
        //实例化三个对象
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date();

        //设置时间
        date1.SetDate(2024,3,25);
        date2.SetDate(2024,3,26);
        date3.SetDate(2024,3,27);

        //打印结果,看看是否设置成功
        date1.PrintDate();
        date2.PrintDate();
        date3.PrintDate();
    }
}

class Date{
    //属性
    public int year;
    public int month;
    public int day;

    //方法
    public void SetDate(int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }
    public void PrintDate(){
        System.out.println(year+"/"+month+"/"+day);
    }

}

上面是最终的打印结果,由此可知我们设置的时间是对的。

但是又有一些新的问题:

1. 如果我们在设置时间的方法的参数也是year month day ,那就会发生一些错误(打印的结果是全部是0,如下图所示) 

这是什么原因造成的呢?其实我们在C语言阶段已经学习过了(当全局变量与局部变量的变量名一样时,全局变量会被屏蔽,遵循局部变量优先原则) ,同样Java中也是如此,这里的year,month,day都是局部变量,那么也就是局部变量给局部变量赋值,因此得不到我们想要的结果(为什么是0呢?后面会有解释)。

2. PrintDate方法怎么知道自己要打印谁的值呢?其实这个是比较好解释的,因为前面有 对象. 来说明是在哪个对象下调用这个方法。

上述的所有问题都可以用 this 来解决。我们首先来说第二点,其实上面那个解释是没问题的,但如果我们用更底层的知识来解释的话,就是用this引用来解释。

什么是this引用?

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

那上面的代码我们就可以改成下面:

public class Test{
    public static void main(String[] args) {
        //实例化三个对象
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date();

        //设置时间
        date1.SetDate(2024,3,25);
        date2.SetDate(2024,3,26);
        date3.SetDate(2024,3,27);

        //打印结果,看看是否设置成功
        date1.PrintDate();
        date2.PrintDate();
        date3.PrintDate();
    }
}

class Date{
    //属性
    public int year;
    public int month;
    public int day;

    //方法
    public void SetDate(int year, int month, int day){
        //这个也就声明了是当前对象
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void PrintDate(){
        //即使能够识别,我们也要加上this
        System.out.println(this.year+"/"+this.month+"/"+this.day);
    }

}

注意:this引用指向的是调用成员方法的对象 。

this引用的特性

1. this的类型:对应类的类型引用,即哪个对象调用就是哪个对象的引用类型(谁调用this所在的方法,this就指向谁)。

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

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

4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的对象的引用传递给该成员方法,this负责来接收。

因此我们以后调用成员方法或者成员变量时,都应该加上this。

对象的构造及初始化

如何初始化对象(的成员变量)

通过前面知识点的学习,我们知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败,但是我们用类创建的对象不初始化竟然不会报错(如下图:)。

这就是默认初始化。 

Date d = new Date(2021,6,9);

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

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

2. 为对象分配内存空间。

3. 处理并发安全问题 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突。

4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。根据不同的类型会默认初始化不同的值(如下表)。

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

如果我们想重新初始化时,初始化的方式就是 . 成员变量 ,再赋值就可以了。还有一种初始化就是在创建成员变量时,就直接给予初始值,这种初始化叫就地初始化。下面就是就地初始化:

构造方法 

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,没有返回值类型,即使是void也不行。在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。同样构造方法也可以对我们创建的对象进行初始化。那怎么调用这个方法呢?(如下图所示:)

由此可见:当我们实例化一个对象的时候,就自动地调用了这个构造方法。 那又有一个新的问题来了:当我们没有写构造方法的时候,但是我们依旧实例化了一个对象啊,那也会调用构造方法吗?没错,当我们没有提供任何构造方法时,编译器会自动给我们提供一个不带参数的构造方法;一旦我们自己写了构造方法之后,编译器就不再提供了

注意:1. 构造方法是可以被重载的。

2. 只有当调用完构造方法之后,对象才算被被创建成功了。 

3.在构造方法中可以通过this()来调用其它构造方法。

这个this()来调用其它构造方法的时候,有一些限制条件:(1)this()这条语句必须是在调用这条语句的构造方法的有效代码的第一行。

(2) 不能形成循环。

4. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后面会学习到) 

使用IDEA快速生成构造方法的步骤:

 下面是详细视频:

https://live.csdn.net/v/374793?spm=1001.2014.3001.5501

好啦!本期JavaSE类和对象(上)的学习就到此结束啦!我们下一期再一起学习吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫-懂车帝城市销量榜单

前言 本文是该专栏的第23篇,后面会持续分享python爬虫干货知识,记得关注。 最近粉丝留言咨询某汽车平台的汽车销量榜单数据,本文笔者以懂车帝平台为例,采集对应的城市汽车销量榜单数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码…

Gradle 使用详解

目录 一. 前言 二. 下载与安装 2.1. 下载 2.2. 配置环境变量 2.3. 配置镜像 2.3.1. 全局设置 2.3.2. 项目级设置 三. Gradle 配置文件 3.1. build.gradle 3.2. settings.gradle 3.3. gradle.properties 3.4. init.d 目录 3.5. buildSrc 目录 四. Java Library 插…

计算机网络——28自治系统内部的路由选择

自治系统内部的路由选择 RIP 在1982年发布的BSD-UNIX中实现Distance vector算法 距离矢量:每条链路cost 1,# of hops(max 15 hops)跳数DV每隔30秒和邻居交换DV,通告每个通告包括:最多25个目标子网 RIP通告 DV:在…

Qt笔记-解决Qt程序连不上数据库MySQL数据库(重编libqsqlmysql.so)

使用QSqlDatabase连接MySQL数据库时。在自己程序配置没有错误的情况下报这类错误: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase::exec: database not open 造成这样的问题大多数是libqsqlmysql.so有问题。 Qt的QSqlDatabase使用的是libqsqlmysql.so&a…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《偏远地区能源自洽系统源储容量协同配置方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

HTTP 常见面试题(计算机网络)

HTTP 基本概念 一、HTTP 是什么? HTTP(HyperText Transfer Protocol) :超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本…

《FFmpeg开发实战:从零基础到短视频上线》出版后记

在软件开发行业当中,音视频是比较小众的方向,以至于很多程序员都没听说过YUV,就更别说了FFmpeg。实际上FFmpeg很早就有了,只是它采用C语言编写,所以在WEB当道的国内软件业中,FFmpeg就像独孤求败那样&#x…

PVE设置显卡直通(二:Linux显卡直通,以及Linux系统下安装cuda库)

PVE设置显卡直通(一:硬件设置) 本文仅记录PVE关于Linux下的显卡直通步骤 例程不过多阐述 ps: 无直通经验的同学,先参阅 PVE设置显卡直通(一:硬件设置),再参阅本博文 参阅完成 PVE设置显卡直通(一:硬件设置)后,直接在PVE面板中添加显卡硬件到自己的主机即可,此文中…

JavaScript(二)---【js数组、js对象、this指针】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 一.js数组 在js中也有数组的概念,数组使用“[]”定义,其中数组中还可以嵌套数组从而达到多层数组的作用。 访问数组中的某个元素,我们可以直…

什么是HTTP? HTTP 和 HTTPS 的区别?

文章目录 一、HTTP二、HTTPS三、区别参考文献 一、HTTP HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范 在计算机和网络世界有,存在不同的协议,如广播协议、寻址协议、路由协议等等… 而HTTP是…

【Vue】搭建第一个vue3+vite前段项目

不要奇怪我为啥突然开始写前端的文章,唉,一切都是公司的任务罢了。 其实这周学习了前端和coverity,但是后者就算学了我也不能写在我博客里,所以还是写一写前端吧。 node.js 和 npm npm是一个类似于 maven 的包管理器。 去以下…

55 npm run serve 和 npm run build 的分包策略

前言 这里我们来看一下 vue 这边 打包的时候的一些 拆分包的一些策略 我们经常会使用到 npm run build 进行服务的打包 然后 打包出来的情况, 可能如下, 可以看到 chunk-vendors 是进行了包的拆分, 我们这里就是 来看一下 这里 npm run build 的时候的, 一个分包的策略 测试…

【Leetcode每日一题】模拟 - 提莫攻击(难度⭐)(45)

1. 题目解析 题目链接:495. 提莫攻击 2.算法原理 一、分情况讨论 要计算中毒的总时长,我们需要考虑时间点之间的差值,并根据这些差值来确定中毒的实际持续时间。 情况一:差值大于等于中毒时间 假设你的角色在时间点A中毒&#…

C语言 | Leetcode C语言题解之两数相加

题目: 题解: struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head NULL, *tail NULL;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val : 0;int n2 l2 ? l2->val : 0;int sum n1 n2 …

C#(winform) 调用MATLAB函数

测试环境 VisualStudio2022 / .NET Framework 4.7.2 Matlab2021b 参考:C# Matlab 相互调用 Matlab 1、编写Matlab函数 可以没有任何参数单纯定义matlab处理的函数,输出的数据都存在TXT中用以后期读取数据 function [result,m,n] TEST(list) % 计算…

上海亚商投顾:沪指低开高走 5.5G概念股午后走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指3月 29日震荡反弹,尾盘涨幅扩大至1%,深成指、创业板指跟随上扬。周期股再度走强&a…

基于SpringBoot+Vue企业级工位管理系统(源码+部署说明+演示视频+源码介绍+lw)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

Modbus取数测试程序

modbus协议,modbus-tcp协议取数测试程序 Java实现modbus-tcp协议取数操作,数据类型转换操作

list(链表)容器(一)

一、list基本概念 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成 结点的组成:一个是存储数据元素的数据域&#xff0…

Mac OS上使用matplotlib库显示中文字体

文章目录 问题描述解决步骤参考文章 问题描述 如果我们想要使用matplotlib画图的话,可能会出现下面的这种warning: UserWarning: Glyph 24212 (\N{CJK UNIFIED IDEOGRAPH-5E94}) missing from current font.解决步骤 解决这个问题,可以按照下面的做法…
最新文章