JAVASE之类和对象(1)

路虽远,行则将至;事虽难,做则必成。

主页:趋早——Step
专栏:JAVASE
gitte:https://gitee.com/good-thg

在这里插入图片描述
引言:
这篇文章我们只介绍前半部分,下一篇文章会介绍剩下的部分。

一、面向对象

1、什么是面向对象

面向对象是一种编程范式,它将程序组织成对象的集合,每个对象都有自己的状态和行为。在面向对象的编程中,程序通过定义对象的属性和方法来描述问题的解决方案。对象可以通过与其他对象进行交互来实现特定的功能。面向对象的编程主要包括封装、继承和多态三个特性,通过这些特性可以使程序更加模块化、可维护和可复用。
我们学习的Java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来设计程序,更符合人们对事物的认知,对于大型程序的设计、扩展及维护都非常友好。

2、面向对象与面向过程

我们都知道曹操称象的故事吧!我们分别用面向对象和面向过程来讲述一下这个过程:
(1)面向过程:我们要准备一艘可以装的下大象的船,接着我们将大象赶到船上,然后乘坐另一艘小船,在水位处划一条线,再把大象从船上赶下来,我们继续在同一条船上搬石头,一块,两块…,直到船的水位下降到到我们之前划的线上,然后我们准备一个称,将船上的石头卸下来分批放到称上,并且记录每一批石头的重量,最后将所有数据全部相加,这时候就可以计算出大象的重量了。
(2)面向对象:把大象赶到船上(…),在船上放上石头(…),在称上放石头(…),得到大象重量。
通过这个故事,我们知道了面向过程是把事情分成一步一步的,然后按照步骤一步一步的做出来,而面向对象是给对象相应的方法,最后得出结果。以面向对象的方式来处理,就不用关心过程了,是通过对象之间的交互来完成的。

二、类定义和使用

1、认识类

类是用来对一个实体进行描述的,主要关注该实体具有哪些属性,哪些功能,描述完成以后计算机就可以识别出结果了。

2、类的定义格式

在这里插入图片描述

注意事项:
1、类名采用大驼峰定义;
2、成员前写法统一为public。

3、定义一个学生类

public class Student {
     // 成员变量
    public String name;
    public int age;
    // 成员方法
    public void Exam(){
        
    }
}

三、类的实例化

1、什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是Java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上面定义的Student类。有了这些自定义类型之后,就可以使用这些类来定义实例。
用类类型创建对象的过程,称为类的实例化,在Java中采用new关键字,配合类名来实例化对象。

class Student {
    public String name;
    public int age;

    public void Exam(){
        System.out.println("考试......");
    }
}
public class Test {
    public static void main(String[] args) {
        // 通过 new 实例化对象
        Student student = new Student();
        student.name = "Tom";
        student.age = 12;
    }
}

注意事项:

(1)new 关键字用于创建一个对象的实例;
(2)使用 . 来访问对象中的属性和方法;
(3)同一个类可以创建多个实例。

2、类和对象的说明

(1)类只是一个模型一样的东西,用来对一个实体进行描述,限定了有哪些成员;
(2)类是一种自定义的类型,可以用来定义变量;
(3)一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。

四、this引用

1、为什么要有this引用

在这里,我们定义一个Date类来进行演示:

public 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 + "日");
    }
    
}

这个时候,我们该如何打印他们呢?看下面代码:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
但是,如果我们不想这样一个一个进行赋值,而是一次性的赋值,该怎么办呢?
我们在上面的代码中,已经定义了setDate,所以,我们可以调用setDate来进行赋值。代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
通过以上的两种方法,就可以进行赋值和打印了,然而,这跟this引用有什么关系呢?我们继续往下学习。
我们想想,现在我们的setDate是这样的:
在这里插入图片描述
假如说,我们把setDate改成下面这样:
在这里插入图片描述
在这个时候,到底是谁给谁赋值,到底设置的是哪个对象呢?
我们运行代码试试:
在这里插入图片描述
这是什么原因呢?
这是因为局部变量优先,是形参自己改自己赋值了,没有赋值到成员变量当中。
在这个时候,我们的this就派上用处了,他可以让他赋值到成员变量当中。我们看下一部分:

2、什么是this引用

我们将this加入到我们的setDate中:
在这里插入图片描述
我们将main方法中写成这样:
在这里插入图片描述
代码运行结果如下:
在这里插入图片描述
这个时候,我们有问题了:成员函数执行的时候,他是怎么知到打印的是哪个对象,设置的是哪个对象?
这就是this的作用,我们认为:

this引用指向当前对象

通俗来讲,谁调用setDate,谁就是当前对象。
这时候,我们就可以知道什么是this引用了

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

3、this引用的特性

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

(2)this只能在“成员方法”中使用;

(3)在“成员方法”中,this只能引用当前对象,不能引用其他对象;

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

接下来,我们把完整代码展示出来:

public 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() {
        System.out.println(this.year + "年" + this.month + "月" + this.day + "日");
    }

    public static void main(String[] args) {
        Date date = new Date();
        // 赋值
        date.setDate(2024, 5, 24);
        // 打印
        date.printDate();

        Date date1 = new Date();
        date1.setDate(2023, 5, 24);
        date1.printDate();
    }

}

五、对象的构造和初始化

1、如何初始化对象

我们来看下面这个代码:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
这是因为没有初始化报错,但是我们来看下面的代码:
在这里插入图片描述
运行一下:
在这里插入图片描述我们发现,每次对象创建好之后,要调用setStudent才能设置具体姓名和年龄,这是很麻烦的,但是我们到底该如何初始化呢?我们继续学习:

2、默认初始化

我们同样来看下面的代码:
在这里插入图片描述
在这个代码中,我们初始化了吗?没有,但是他会报错吗?我们看运行结果:
在这里插入图片描述
没有,这是为什么呢?
哇,好多为什么,那就让我们继续回答这一个一个的问题吧!
在这里,就是因为发生了默认初始化,所以才不会报错。我们看到的只是程序层面简单的一条语句,但是,在JVM层面就需要做好多事情,下面简单介绍:
(1)检测对象对应的类是否加载了,如果没有加载则加载;
(2)为对象分配内存空间;
(3)处理并发问题;
(4)初始化所分配的空间
就是对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

在这里插入图片描述

在这里,我们暂时知道这是默认初始化就好,至于为什么,我们可以后期学习。

3、就地初始化

就地初始化就是在声明成员变量时,就直接给出了初始值。
我们看代码:
在这里插入图片描述
这样运行会是什么结果呢?我们运行试试:
在这里插入图片描述
这就是我们的就地初始化,需要注意的是:代码编译完成后,编译器会将所有给初始化的这些语句添加到各个构造函数中。

4、构造方法

在我们学习了以上两种初始化方法,我们再来学习另一种初始化方法,叫做构造方法。

(1)概念

构造方法(也称构造器)是一个特殊的成员方法,这个方法没有返回值,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的声明周期内只调用一次。
在这里插入图片描述

现在问题来了,我们该怎么调用该构造方法呢?我们看下面的代码并且运行:
在这里插入图片描述

运行结果如下:
在这里插入图片描述
这是什么原因呢?我们将main方法改成如下这样:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
我们再来调用带两个参数的构造方法:
将main方法写为这样:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
所以我们认为:当构造方法调用完成之后,对象实际上才产生了。
其实我们还需要知道,当没有提供任何构造方法的时候,编译器会默认提供一个不带参数的构造方法,但是当我们有构造方法提供的时候,编译器就不会提供了。

(2)特性

<1> 名字必须与类名相同
<2> 没有返回值类型,设置为void也不行
<3> 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
<4> 构造方法可以重载
<5> 如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
<6> 在构造方法中,可以通过this调用其他构造方法来简化代码。

在这里插入图片描述
运行结构如下:
在这里插入图片描述
我们还要注意一点,this不能形成环。看下面代码:
在这里插入图片描述

<7> 绝大多数情况下使用public来修饰,特殊场景下会被private修饰。

好的,JAVASE第一部分到此就结束了,让我们期待下一篇吧!

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

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

相关文章

电路仿真软件:点亮教学新篇章,十大便利助力高效学习

在信息化时代的浪潮中&#xff0c;电路仿真软件以其独特的优势&#xff0c;逐渐在教学领域崭露头角。它不仅能够帮助学生更好地理解电路知识&#xff0c;还能提升教师的教学效果。接下来&#xff0c;让我们一起探讨电路仿真软件对教学带来的十大便利。 一、直观展示电路原理 电…

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m&#xff0c;别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…

MSI U盘重装系统

MSI U盘重装系统 1. 准备一块U盘 首先需要将U盘格式化&#xff0c;这个格式化并不是在文件管理中将U盘里面的所有东西都删干净就可以了&#xff0c;需要在磁盘管理中&#xff0c;将这块U盘格式化&#xff0c;如果这块U盘有分区的话&#xff0c;那将所有的分区都格式化并且删除…

非阻塞sokcet和epoll

在Muduo网络库中同时使用了非阻塞socket与epoll&#xff0c;在此简单梳理下。 非阻塞sokcet和epoll共同工作的过程主要涉及网络编程中的非阻塞I/O和事件驱动机制。下面将详细解释这两者如何协同工作&#xff1a; 非阻塞socket简介 在传统的阻塞socket编程中&#xff0c;当调用…

springboot-阿里羚羊 服务端埋点

官方文档 集成Java SDK 手动引入jar包「quickaplus-log-collector-java-sdk-1.0.1-SNAPSHOT.jar」 <dependency><groupId>com.alibaba.lingyang</groupId><artifactId>quickaplus-log-collector-java-sdk</artifactId><version>1.0.1&l…

老Java学 Go 笔录(二) 从 go 的编译开始学起

目录 一.版本选择二.环境准备三.工具的选择四.第一个 hello go4.1 开发4.2 编译4.3 编译运行4.4 直接安装 五.用 go 快速搭建 webserver六.调用外部三方方法七.go vs java 的执行 前言 专栏旨在利用现有的 java 体系内容去完成 go 语言的学习. 本次行文是在 https://go.dev/doc…

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式&#xff1a;大端序和小端序&#xff0c;大端序的高位字节在低地址&#xff0c;小端序的高位字节在高地址。例如&#xff1a;对数字 65538&#xff0c;其4字节表示的大端序内容为00 01 00 02&#xff0c;小端序内容为02 00 01…

JavaScript面试 题

1.延时加载JS有哪些方式 延时加载 :async defer 例如:<script defer type"type/javascript" srcscript.js></ script> defer:等html全部解析完成,才会执行js代码,顺次执行的 async: js和html解析是同步的,不是顺次执行js脚本(谁先加载完先执行谁)2.JS数…

AI视频教程下载:零代码创建10个GPTs 和Ai Agents

你将学到什么&#xff1a; 理解GPTs的基础知识&#xff1a;掌握GPTs Agent的基础知识及其在现代AI应用中的作用。 创建自定义ChatGPT Agent&#xff1a;学习构建针对内容创作、沟通和社交媒体管理等多种任务量身定制的ChatGPT Agent。 在商业和个人项目中的实用应用&#xf…

“闻起来有股答辩的味道”,答辩到底是什么味?

“闻起来有股答辩的味道”&#xff0c;答辩到底是什么味&#xff1f; 一位名叫“小鸡全家桶”的作者虚构了这样一个学校故事&#xff0c;故事说&#xff0c;由于学生的考试试卷印刷得特别模糊&#xff0c;导致里面的插图根本看不清&#xff0c;学生感到懵逼&#xff0c;监考老…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架&#xff0c;它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口&#xff0c;而无需制定创建对象的具体类&#xff0c;工厂类…

防抖和节流的区别和举例(简要说明、形象比喻、容易理解)

1、含义&#xff1a; 在前端开发技术中&#xff0c;防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用的性能优化技术&#xff0c;主要用于处理高频事件触发&#xff0c;如用户的点击、滚动、输入等操作。 防抖&#xff08;Debounce&am…

【Linux系统】文件与基础IO

本篇博客整理了文件与文件系统、文件与IO的相关知识&#xff0c;借由库函数、系统调用、硬件之间的交互、操作系统管理文件的手段等&#xff0c;旨在让读者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本认识 文件 内容 属性。文件在创建时就有基本属性&#xff0…

Ribbon负载均衡(自己总结的)

文章目录 Ribbon负载均衡负载均衡解决的问题不要把Ribbon负载均衡和Eureka-Server服务器集群搞混了Ribbon负载均衡代码怎么写ribbon负载均衡依赖是怎么引入的&#xff1f; Ribbon负载均衡 负载均衡解决的问题 首先Ribbon负载均衡配合Eureka注册中心一块使用。 在SpringCloud…

Packet Tracer-HSRP+DHCPv4+VLAN间路由+以太通道综合实验

实验拓扑&#xff1a; 实验内容&#xff1a; VLAN及VLAN间路由的配置&#xff0c;以太通道的配置&#xff0c;STP的根调整&#xff0c;DHCPv4的配置&#xff0c;首跳冗余HSRP的配置。 实验最终结果&#xff1a; PC可以自动获取到DHCP-Server分配的IP地址&#xff0c;实现首跳…

【MySQL精通之路】InnoDB(5)-内存结构

总目录&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(4)-架构图-CSDN博客 目录 ​编辑 1 缓存池&#xff08;Buffer Pool&#xff09; 1.1 缓存池LRU算法 1.2 缓存区配置 1.3 使用InnoDB标准监视器监视缓存池 …

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了

【Pixso如何对设计好的UI进行切片导出图片文件】

当软件UI设计好之后&#xff0c;并不是直接把设计图给开发就可以了&#xff0c;开发还会向你要各种图标的图片文件&#xff0c;这个时候就要用到”切片”功能了。 1、目的&#xff1a;把所有UI界面的图标都切下来&#xff0c;做成UI图标文件夹 2、在UI界面点击【】-【切片】-‘…