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

news2024/11/29 3:01:43

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-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.coloradmin.cn/o/1560191.html

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

相关文章

六、Django开发

六、Django开发 1.新建项目2.创建app2.1 第一种方法:2.2 利用pycharm中tools工具直接创建app 3.设计表结构(django)4.在MySQL中生成表5.静态文件管理6.部门管理6.1 部门列表 7.模板的继承8.用户管理8.1初识Form1.views.py2.user_add.html 8.2…

数字乡村发展蓝图:科技赋能农村实现全面振兴

目录 一、数字乡村发展蓝图的内涵与目标 二、科技赋能农村:数字乡村发展的动力与路径 (一)加强农业科技创新,提升农业生产效率 (二)推进农村电商发展,拓宽农民增收渠道 (三&…

数据挖掘入门项目二手交易车价格预测之特征工程

文章目录 目标常见的特征工程具体步骤1. 导入数据2. 删除异常值3. 特征构造3.1 为树模型构造特征3.2 为LR NN 之类的模型构造特征 4. 特征筛选过滤式包裹式嵌入式 5. 总结 本文数据集来自阿里天池:https://tianchi.aliyun.com/competition/entrance/231784/informat…

华为OD机试 - 绘图机器 - 双指针(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

Spring Boot 一.基础和项目搭建(上)

之前也自学过SSM框架,Spring Boot框架,也动手写过几个项目,但是这是第一次完整的记录。从0开始,把一些细节整理了一下。 大概会分为十几小节,这是一个学习的过程,更是一个思考的过程,废话不多说…

MySQL8 搭建集群方案文档

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档 InnoDB集群 本文档分享新版本MySQL 8.0.21 Innodb Cluster集群搭建过程 ~ MySQL InnoDB Cluster为MySQL提供了完整的高可用性解决方案。通过使用MySQL Shell附带的AdminAPI, 您可以轻松地配置和管理一组至少…

【数字IC/FPGA】手撕代码:模3检测器(判断输入序列能否被3整除)

今天我们来手撕一个常见的笔试题,使用的方法是三段式Moore状态机。 题目描述: 输入端口是串行的1bit数据,每个时钟周期进来一位新数据后,实时检查当前序列是否能整除3,若能则输出1,否则输出0。 例如&#…

BIT-4-自定义类型:结构体,枚举,联合(C语言进阶)

本章重点 结构体 结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐结构体传参结构体实现位段(位段的填充&可移植性)枚举 枚举类型的定义枚举的优点枚举的使用联合 联合类型的定义联合的特点联合大小的计算 结构体 1.结构体的声…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化,源代码中也没有 2. 3.客户端中的网络连接初始化如下: 4.不是因为超时,设置10s为超时期限后,客户端和服务器有时依然会报错! 5.我感觉就是update中发包给弄坏的! 6.不在“帧”…

【面试专题】Mybatis高频面试题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况:ORM 2。原理: MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

Android ImageView以及实现截图

实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…

【运维】Elsatic Search学习笔记

基本使用 Elasticsearch(简称ES): 是一个开源的高扩展的分布式全文搜索引擎 Docker安装Elasticsearch1 version: "3.1" services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueenvironment:- "cluster.nameelast…

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

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

【4】单链表(有虚拟头节点)

【4】单链表(有虚拟头节点) 1、虚拟头节点2、构造方法3、node(int index) 返回索引位置的节点4、添加5、删除6、ArrayList 复杂度分析(1) 复杂度分析(2) 数组的随机访问(3) 动态数组 add(E element) 复杂度分析(4) 动态数组的缩容(5) 复杂度震荡 7、单链…

uniapp 小程序发布体验版 http://198.18.0.1:7001 不在以下 request 合法域名列表中(踩坑记录二)

问题一: 小程序发布体验版时出现报错信息: http://198.18.0.1:7001 不在以下 request 合法域名列表中无法连接uniCloud本地调试服务,请检查当前客户端是否与主机在同一局域网下 解决方案: 请务必在HBuilderX内使用【发行】菜单打…

Vastbase编程利器:PL/pgSQL原理简介

PL/pgSQL是Vastbase提供的一种过程语言,在普通SQL语句的使用上增加了编程语言的特点,可以用于创建函数、存储过程、触发器过程以及创建匿名块等。 本文介绍Vastbase中PL/pgSQL的执行流程,包括PL/pgSQL的编译与运行。 1、编译 PL/pgSQL的编译…

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

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

CleanMyMac X2024专业的Mac清理工,具一次激活,永久使用

CleanMyMac,作为一款专为Mac系统设计的垃圾清理工具,以其强大的清理能力、简便的操作方式以及卓越的系统兼容性,受到了众多Mac用户的青睐。以下是对这款软件功能的详细介绍: CleanMyMac X2024全新版下载如下: https://wm.makedin…

机器人---人形机器人之技术方向

1 背景介绍 在前面的文章《行业杂谈---人形机器人的未来》中,笔者初步介绍了人形机器人的未来发展趋势。同智能汽车一样,它也会是未来机器人领域的一个重要分支。目前地球上最高智慧的结晶体就是人类,那么人形机器人的未来会有非常大的发展空…

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

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