JavaSE---类和对象(上)

news2025/4/25 12:24:45

1. 面向对象的初步认知

1.1 什么是面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。

面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2 面向对象与面向过程

1. 传统洗衣服过程

 

传统的方式:注重的是洗衣服的过程,少了一个环节可能都不行。

而且不同衣服洗的方式,时间长度,拧干方式都不同,处理起来就比较麻烦。如果将来要洗鞋子,那就是另一种方式。 按照该种方式来写代码,将来扩展或者维护起来会比较麻烦。

2. 现代洗衣服过程 

以面向对象方式来进行处理,就不关注洗衣服的过程.

具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可。通过对象之间的交互来完成的。

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

2. 类定义和使用 

2.1 简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性,哪些功能(用来干啥),描述完成后计算机就可以识别了。

比如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。 属性:产品品牌,型号,产品重量,外观尺寸,颜色... 功能:洗衣,烘干、定时....。

2.2 类的定义格式

在java中定义类时需要用到class关键字


// 创建类
class ClassName{  
    field;       // 字段(属性) 或者 成员变量
    method;      // 行为 或者 成员方法
}

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。

类中包含的内容称为类的成员。

属性主要是用来描述类的,称之为类的成员属性或者类成员变量。

方法主要说明类具有哪些功能,称为类的成员方法。

class WashMachine{
    public String brand;   // 品牌
    public String type;    // 型号
    public double weight;  // 重量
    public double length;  // 长
    public double width;  // 宽
    public double height;  // 高
    public String color;   // 颜色
    
    public void washClothes(){   // 洗衣服
        System.out.println("洗衣功能");
   }
    
    public void dryClothes(){    // 脱水
        System.out.println("脱水功能");
   }
    
    public void setTime(){       // 定时
        System.out.println("定时功能");
   }
}
class PetDog {
    public String name;//名字
    public String color;//颜色
 
    // 狗的属性
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
   }
    
    // 狗的行为
    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
   }
}

采用Java语言将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。 

 注意事项

类名注意采用大驼峰定义

成员前写法统一为public。文章后面会详细解释

此处写的方法不带 static关键字。 文章后面会详细解释

一般一个文件当中只定义一个类 ,原因:

                                                         如下图所示

每添加一个类,.java源文件内就会多一个类文件。所以我们一般都是规定一个.java源文件内只定义一个类。 

不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改。原因:

但有一种情况除外: 

3. 类的实例化

3.1 什么是实例化

 定义了一个类,就相当于在计算机中定义了一种新的类型。与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型。

比如上述的:PetDog类和Washmachine类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。

用类类型创建对象的过程,称为类的实例化。

在java中采用new关键字,配合类名来实例化对象。

类本质上有点类似于c语言的结构体,但是c语言结构体是无法内置函数的,而在java中类里面可以内置方法。

class PetDog {
    public String name;//名字
    public String color;//颜色
 
    // 狗的属性
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
   }
    
    // 狗的行为
    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
   }
}
public class Main{
 public static void main(String[] args) {
        PetDog dogh = new PetDog();     //通过new实例化对象
        dogh.name = "阿黄";
        dogh.color = "黑黄";
        dogh.barks();
        dogh.wag();
        
        PetDog dogs = new PetDog();
        dogs.name = "阿黄";
        dogs.color = "黑黄";
        dogs.barks();
        dogs.wag();
 }
}
/*
输出结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~
*/

注意事项

new 关键字用于创建一个对象的实例.

使用 . 来访问对象中的属性和方法.

同一个类可以创建对个实例.  

 3.2 类和对象的说明

1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.

2. 类是一种自定义的类型,可以用来定义变量.

3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

4. 做个比方。

类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东 西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

4 . this引用

4.1 为什么要有this引用  

先看一个日期类的例子:

public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 d3
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
// 对d1,d2,d3的日期设置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);
d3.setDay(2020,9,17);
// 打印日期中的内容
d1.printDate();
d2.printDate();
d3.printDate();
}
}

以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。

但是细思之下有以下两个疑问:

1. 形参名不小心与成员变量名相同:

public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}

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

解决方法要靠this引用: 

2. 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是那个对象的数据呢?

一切都是this引用的功劳

 4.2 什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。  

public class Date {
    public int year;
    public int month;
    public int day;
 
    public void setDay(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 d = new Date();
    d.setDay(2020,9,15);
    d.printDate();
}
}

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

4.3 this引用的特性

1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。

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

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

4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收在代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的

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

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

相关文章

linux的UDP广播测试:C语言代码

测试代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h>#…

信息系统架构风格-系统架构师(十)

1、信息系统架构风格是描述特定应用领域中系统组织方式的惯用模式。架构风格定义了一个系统家族&#xff0c;即一个架构定义&#xff08;&#xff09;。 A一组设计原则 B一组模式 C一个词汇表和一组约束 D一组最佳实践 解析&#xff1a; 信息系统架构风格是描述某一特定 应…

014基于SSM+Jsp的网络视频播放器

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

【教学类-36-08】20240612动物面具(通义万相)-A4大小2图扇子

背景需求&#xff1a; 【教学类-36-07】20240608动物面具&#xff08;通义万相&#xff09;-A4大小7图&15手工纸1图-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞45次&#xff0c;收藏27次。【教学类-36-07】20240608动物面具&#xff08;通义万相&#xff09;-A4大小7图&…

【TB作品】MSP430 G2553 单片机 口袋板 日历 时钟 闹钟 万年历 电子时钟 秒表显示

文章目录 功能介绍操作方法部分流程图代码录制了一个演示视频可以下载观看 功能介绍 时间与日期显示&#xff1a; 实时显示当前时间&#xff08;小时、分钟、秒&#xff09;和日期&#xff08;年、月、日&#xff09;。 闹钟功能&#xff1a; 设置闹钟时间&#xff08;小时、分…

全面解说Facebook代投菲律宾真金游戏pwa广告全流程

全面解说Facebook代投菲律宾真金游戏pwa广告全流程 随着数字营销的不断发展&#xff0c;社交媒体平台如Facebook已成为广告主们争相投放的热门渠道。对于希望拓展菲律宾市场的真金游戏企业来说&#xff0c;了解并掌握在Facebook上投放广告的具体流程显得尤为重要。本文将详细介…

每天五分钟深度学习:逻辑回归算法完成m个样本的梯度下降

本文重点 上节课程我们学习了单样本逻辑回归算法的梯度下降,实际使用中我们肯定是m个样本的梯度下降,那么m个样本的如何完成梯度下降呢? m个样本的损失函数定义为: 我们定义第i个样本的dw、db为: dw和db为损失J对w和b的偏导数,因为m个样本的代价函数J是1到m个样本总损失…

Office 2021 mac/win版:智慧升级,办公新风尚

Office 2021是微软公司推出的一款高效、智能且功能丰富的办公软件套件。它集成了Word、Excel、PowerPoint等多个经典应用程序&#xff0c;旨在为用户提供更出色的办公体验。 Office 2021 mac/win版获取 Office 2021在继承了前代版本优点的基础上&#xff0c;进行了大量的优化…

VirtualBox、Centos7下安装docker后pull镜像问题

Docker安装篇(CentOS7安装)_docker 安装 centos7-CSDN博客 首先&#xff0c;安装docker可以根据这篇文章进行安装&#xff0c;安装完之后&#xff0c;我们就需要去通过docker拉取相关的服务镜像&#xff0c;然后安装相应的服务容器&#xff0c;比如我们通过docker来安装mysql,…

MySQL中的正排/倒排索引和DoubleWriteBuffer

正排/倒排索引 正排索引 文档1&#xff1a;词条A&#xff0c;词条B&#xff0c;词条C 文档2&#xff1a;词条A&#xff0c;词条D 文档3&#xff1a;词条B&#xff0c;词条C&#xff0c;词条E正排表是以文档的ID为关键字&#xff0c;表中记录文档中的每个字的位置信息&#xff…

RC滤波器及截止频率推导

1、RC滤波器 低通滤波电路 高通滤波电路 电容容抗公式 宏观分析&#xff1a;不管是高通还是低通滤波电路&#xff0c;说白了就是一个电容和一个电阻构成了一个分压电路&#xff0c;区别在于电容位置不同。低通滤波电阻在前电容在后&#xff0c;信号频率越高&#xff0c;容抗越…

观测云产品更新 | BPF 网络日志、智能监控、告警策略等

观测云更新 网络 BPF 网络日志&#xff1a;优化 BPF 网络功能&#xff0c;增强 L4/L7 网络联动。 APM/RUM APM/RUM&#xff1a;新增 【Issue 自动发现】功能。启用该配置后&#xff0c;观测云会将符合配置项规则的错误数据记录自动创建 Issue。 监控 1、智能监控&#xff1…

【数据结构初阶】--- 双链表

双链表你要了解的 双链表&#xff1a; 带头双链表循环双链表带头循环双链表 今天我们学习的&#xff0c;就是最强双链表 — 带头循环双链表 下图就是带头循环双链表&#xff0c;所谓带头&#xff0c;就是有哨兵位&#xff0c;那么最左边的节点就是哨兵位&#xff0c;是不计入…

银河麒麟系统项目部署

使用服务器信息 软件&#xff1a;VMware Workstation Pro 虚拟机&#xff1a;ubtun 内存&#xff1a;20G 虚拟机连接工具&#xff1a; MobaXterm Redis连接工具&#xff1a; RedisDesktopManager 镜像&#xff1a;F:\Kylin-Server-10-8.2-Release-Build09-20211104-X86_64…

企业都在用的镭速是如何做到高效的大文件传输的

在当前这个数字化快速发展的时代&#xff0c;文件传输速度和安全性已经成为企业运营的关键。镭速&#xff0c;作为众多企业都在用的专业大文件传输工具&#xff0c;是如何实现高效、安全的文件传输呢&#xff1f;接下来&#xff0c;我们就来深入探讨一下镭速的传输策略及其在不…

超级签名源码/超级签/ios分发/签名端本地linux服务器完成签名

该系统完全在linux下运行&#xff0c;不存在使用第三方收费工具&#xff0c;市面上很多系统都是使用的是第三方收费系统&#xff0c;例如&#xff1a;某心签名工具&#xff0c;某测侠等&#xff0c;不开源而且需要每年交费&#xff0c;这种系统只是在这些工具的基础上套了一层壳…

Superset二次开发之基于GitLab OpenAPI 查询项目的提交记录中修改的文件

背景: Superset二次开发,在处理版本升级的过程中,需要手动迁移代码, 如何在Superset项目众多的文件中,记录修改过的文件,迁移代码时只需重点关注这些文件修改的内容即可, 但是针对项目中多次的commit 信息,每个commit 又涉及不同的文件, 如何快速梳理出这些二开工作中…

C++青少年简明教程:C++的指针入门

C青少年简明教程&#xff1a;C的指针入门 说到指针&#xff0c;就不可能脱离开内存。了解C的指针对于初学者来说可能有些复杂&#xff0c;我们可以试着以一种简单、形象且易于理解的方式来解释&#xff1a; 首先&#xff0c;我们可以将计算机内存想象成一个巨大的有许多格子的…

算法金 | 再见!!!K-means

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 今天我们来聊聊达叔 6 大核心算法之 —— k-means 算法。最早由斯坦福大学的 J. B. MacQueen 于 1967 年提出&#xff0c;后来经过许多…

ASP.NET MVC企业级程序设计(查,删,展示详情,日期转换,¥字符串拼接)

题目&#xff1a; 实现过程 控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MvcApplication1.Controllers {public class HomeController : Controller{//// GET: /Home/public Action…