零基础 “入坑” Java--- 八、类和对象(一)

文章目录

  • 一、初识面向对象
  • 二、类的定义和使用
    • 1.认识类
    • 2.类的定义格式
  • 三、类的实例化
  • 四、this引用
  • 五、对象的构造及初始化
    • 1.有关初始化
    • 2.构造方法
    • 3.就地初始化

一、初识面向对象

Java是一门纯面向对象的语言(OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象与对象之间的交互来完成事情。 使用面向对象的思想,对于大型程序的设计、扩展和维护都十分友好。

注意:面向对象并不是一门语言,而是一种解决问题的方法。

在学习类和对象之前,我们需要先记住:对象的产生依赖于类;而类是需要我们自己定义的。

二、类的定义和使用

1.认识类

类是用来对一个实体(对象)进行描述的,对实体进行抽象,主要描述其具备哪些属性(如:颜色、大小等)以及哪些功能。

2.类的定义格式

在Java中需要用到class关键字来定义类,语法格式为:

class ClassName{
// 属性或成员变量
// 行为或成员方法
}

class为定义类的关键字,ClassName为类名,{}中的为类的主体。类的主体中包含的内容称为类的成员。属性是用来描述类的,称为成员属性或成员变量;行为是用来描述类的功能,称为成员方法

举个例子,我们定义一个洗衣机类:

class WashMachine {//成员变量public String brand; //品牌public double weight; //重量public double length; //长public double width; //宽public double height; //高public String color; //颜色//成员方法public void wash() {System.out.println("洗衣");}public void dry() {System.out.println("烘干");}public void time() {System.out.println("定时");}
}

成员属性/成员变量定义在类的里面,方法的外面

注意:在此处我们先将成员前的访问修饰限定符统一写为public,且不带static关键字。

我们再来尝试定义一个狗类:

class Dog {//成员属性public String brand; //品种public String color; //颜色public String name; //姓名public String sex; //性别public int age; //年龄//成员方法public void call() {System.out.println("汪汪");}public void eat() {System.out.println("吃狗粮");}
}

在定义类时,我们需要注意:

1.建议一个文件中只定义一个类。
2.由public修饰的类必须要和文件名相同。
3.如果想要修改由public修饰的类的名称,需要通过IDEA去修改(如下图)。
在这里插入图片描述

三、类的实例化

定义了一个类,就相当于定义了一种新的类型,与int,double等类似,只不过int,double是Java语言自带的数据类型。当我们定义了一个类之后,就可以使用类来定义对象。

用类 类型创建对象的过程,称为类的实例化。 在Java中通过new关键字和类名来实例化对象。

通过对象的引用(.)访问对象的属性/变量 和方法。

对象的成员属性在没有赋值时,其值为 其数据类型的默认值。

class Dog {//成员属性public String brand; //品种public String color; //颜色public String name; //姓名public String sex; //性别public int age; //年龄//成员方法public void call() {System.out.println(name + "汪汪");}public void eat() {System.out.println(name + "吃狗粮");}
}
public class Test {public static void main(String[] args) {//通过new关键字实例化了一个Dog对象Dog a = new Dog(); //a就是一个引用,指向了Dog对象//通过对象的引用访问对象的属性/变量 和方法。a.name = "小狗1";a.age = 6;a.call();a.eat();//通过new关键字可以实例化多个对象Dog b = new Dog();b.name = "小狗2";b.age = 6;b.call();b.eat();}
}

通过new关键字可以实例化多个对象,并且会为每一个实例化出的对象都开辟一块内存空间,存储成员变量。

成员属性存储在对象中,而方法存储在方法区。
在这里插入图片描述
可以将类想象为一个模型,用来描述实体。有了类才有对象,类是根据现实中存在的实体抽象出来的,而类想要在代码中表示具体的事物,就需要通过new关键字 实例化对象。

四、this引用

我们先来定义一个日期类:

public class Date {public int year;public int month;public int day;//赋值操作public void set(int y, int m, int d) {year = y;month = m;day = d;}//打印日期public void print() {System.out.println("年:" + year + " 月:" + month + " 日:" + day);}public static void main(String[] args) {Date a = new Date();a.set(2025, 7, 5);a.print();Date b = new Date();a.set(2025, 6, 5);a.print();}
}

我们对赋值操作方法的代码进行修改:

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

修改完后,输出的结果并不是我们预期的值。这是因为局部变量优先原则,会导致局部变量自己给自己赋值,结果为局部变量数据类型的默认值。

此时,我们就可以使用this来解决这个问题:

    public void set(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}

代码的运行结果与我们预期的相符。

1.this引用指向当前对象(当前对象指:成员方法运行时调用该成员方法的对象)。
2.this的类型取决于哪个对象调用,哪个对象调用就是哪个对象的引用类型。
3.this只能在成员方法中使用。
4.this本身 代表的是当前对象的引用。

在这里插入图片描述
还可以使用this调用当前对象的方法

    public void set(int year, int month, int day) {this.year = year;this.month = month;this.day = day;//this调用当前对象的方法this.print();}

使用this调用print方法,程序也可以正常运行,且运行结果与我们预期的相符。

五、对象的构造及初始化

1.有关初始化

在学习有关变量的知识时,我们知道:在定义变量时,一定要给变量一个初始值,否则会导致程序报错。但是当我们定义日期类时,并没有给成员变量赋值,程序却能正常运行。这是因为:当成员变量没有被初始化时,编译器会根据变量的数据类型存储其默认值。
在这里插入图片描述

2.构造方法

构造方法是一种特殊的方法:其方法名必须和类名相同且没有返回值。

我们定义一个学生类 并以此举例:

class Student {public String name; //姓名public int age; //年龄public String sex; //性别public void stu() {System.out.println("学习");}//构造方法public Student() {System.out.println("不带参数的构造方法");}
}
public class Test_gz {public static void main(String[] args) {Student a = new Student();}
}

我们实例化一个学生类对象,运行程序,控制台上打印出了"不带参数的构造方法"这句话。
在这里插入图片描述
我们也可以编写带有参数的构造方法:

class Student {public String name; //姓名public int age; //年龄public String sex; //性别public void stu() {System.out.println("学习");}//构造方法public Student() {System.out.println("不带参数的构造方法");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("带有2个参数的构造方法");}
}
public class Test_gz {public static void main(String[] args) {Student a = new Student();Student b = new Student("小王", 20);}
}

此时,"带有2个参数的构造方法"这句话,因为实例化了一个学生类:b,所以也被打印出来。

在创建对象时,构造方法由编译器自动调用,且在整个对象(如:a、b)的生命周期内只调用一次!只有当调用完成构造方法之后,对象才产生了。

在日期类中,我们并没有编写构造方法,但程序仍能运行,这是因为:当一个类中,没有任何一个构造方法时,编译器会自动提供一个不带参数的构造方法。

但是当一个类中,存在一个带有参数的构造方法时,编译器就不会提供不带参数的构造方法。 在上面这段代码中,如果我们删掉不带参数的构造方法,再次运行程序,程序就会报错!!

我们仔细观察上面这段代码中的两个构造方法,其实可以发现 他们之间构成了方法的重载。即构造方法之间是可以构成方法的重载的!!!

完成一个对象的构造需要先分配内存,再调用合适的构造方法,因此:构造方法的作用就是对 对象中的成员变量进行初始化,但并不负责为对象开辟内存空间。


还可以使用 this() 调用当前类中的其他构造方法,具体调用哪个构造方法由 this() 的参数决定:

    public Student() {//this()this("小王", 20);System.out.println("不带参数的构造方法");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("带有2个参数的构造方法");}

注意:this() 只能在构造方法内部使用!!!且只能在构造方法的第一行使用!!!

构造方法绝大多数情况下都是被public修饰的,在某些特殊场景下也会被private修饰。

3.就地初始化

在定义成员变量时,对其直接进行赋值:

    public String name = "小王"; //姓名public int age = 20; //年龄public String sex = "男"; //性别

但并不推荐这种初始化方式。


未完待续…

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

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

相关文章

数字孪生技术引领UI前端设计新篇章:智能物联网的深度集成

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言:数字孪生与物联网的共生革命在智能设备爆发式增长的今天,传统…

代码审计-shiro漏洞分析

一、关于shiro介绍 简单讲,shiro是apache旗下的一个Java安全框架,轻量级简单易上手,框架提供很多功能接口,常见的身份认证 、权限认证、会话管理、Remember 记住功能、加密等等。 二、漏洞分析 1.CVE-2019-12422-shiro550 漏洞原理…

EF提高性能(查询禁用追踪)(关闭延迟加载)

EF默认是支持延迟加载的,在加载一个表的数据时,会把关联表的数据一并加载,这样会影响性能。 一般建议关闭延迟加载可以提高EF加载的性能。还有其他方法提高性能(查询禁用追踪) 如果要实现延迟加载,必须满足…

Leetcode+JAVA+贪心III

134.加油站在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 …

Qt信号与槽机制及动态调用

Qt信号与槽机制及动态调用一、信号与槽1、Qt信号与槽机制概述2、信号与槽的基本使用3、信号与槽的特性4、使用Lambda表达式作为槽5、信号与槽的参数传递6、注意事项二、动态调用机制1、基本用法2、示例代码3、带参数的调用4、返回值处理5、信号与槽的动态连接6、动态方法调用7、…

K8s系列之:Kubernetes 的 OLM

K8s系列之:Kubernetes 的 OLM 什么是 Kubernetes 的 OLM什么是Kubernetes中的OperatorOLM 的功能OLM 的核心组件OLM优势OLM 的工作原理OLM 与 OperatorHub 的关系OLM示例场景什么是CRDoperator 和 CRD的关系为什么需要 CRD 和 OperatorCRD定义资源类型DebeziumServer如何使用d…

前端-HTML-day2

目录 1、无序列表 2、有序列表 3、定义列表 4、表格-基本使用 5、表格-结构标签 6、表格-合并单元格 7、表单-input基本使用 8、表单-input占位文本 9、表单-单选框 10、表单-上传多个文件 11、表单-多选框 12、表单-下拉菜单 13、表单-文本域 14、表单-label标签…

两种方式清除已经保存的git账号密码

方式一随便选择一个文件夹,然后鼠标右键-》TortoiseGit ->设置选择已保存的数据-》认证数据-》清除-》点击确定方式二 控制面板\用户帐户\凭据管理器-》windows凭据普通凭据-》找到git信息-》选择删除

Using Spring for Apache Pulsar:Message Production

1. Pulsar Template在Pulsar生产者端,Spring Boot自动配置提供了一个用于发布记录的PulsarTemplate。该模板实现了一个名为PulsarOperations的接口,并提供了通过其合约发布记录的方法。这些send API方法有两类:send和sendAsync。send方法通过…

CSS揭秘:10.平行四边形

前置知识:基本的css变形一、平行四边形 要实现一个平行四边形,可以使用CSS的skew变形属性来倾斜元素。 transform: skewX(-45deg);图-1显示容器和内容都出现了倾斜,该如何解决这个问题? 二、嵌套方案 我们通过将内容嵌套 div 并使…

深度学习 必然用到的 线性代数知识

把标量到张量、点积到范数全串起来,帮你从 0 → 1 搭建 AI 数学底座 🚀 1 标量:深度学习的最小单元 标量 就是一维空间里的“点”,只有大小没有方向。例如温度 52 F、学习率 0.001。 记号:普通小写 x;域&am…

OpenGL ES 纹理以及纹理的映射

文章目录开启纹理创建纹理绑定纹理生成纹理纹理坐标图像配置线性插值重复效果限制拉伸完整代码在 Android OpenGL ES 中使用纹理(Texture)可以显著提升图形渲染的质量和效率。以下是使用纹理的主要好处: 增强视觉真实感 纹理可以将复杂的图像…

从金字塔到个性化路径:AI 正在重新定义学习方式

几十年来,我们的教育系统始终遵循着一条熟悉的路线: 从小学、初中、高中,再到大学和研究生。这条标准化的路径(K-12 到研究所)结构清晰,却也缓慢。但在当今这个信息爆炸、知识快速更新、个性化需求高涨的时…

产品经理岗位职责拆解

以下是产品经理岗位职责的详细分解表,涵盖工作内容、核心动作及输出成果:岗位职责具体工作内容输出成果1. 日常版本迭代管理需求分析及PRD产出协调资源推动产品上线- 收集业务/用户需求,分析可行性及优先级- 撰写PRD文档,明确功能…

后端微服务基础架构Spring Cloud

版本关系 版本发布说明-阿里云Spring Cloud Alibaba官网 选择 创建项目 创建父项目 什么都不动&#xff0c;创建即可 1) 删掉没用的文件 保留 2) pom中加入 打包方式 <packaging>pom</packaging> 3) 删掉src 4) pom.xml中删除没用的 5)更改pom.xml中 spring…

数据分析框架和方法

一、核心分析框架 (The Big Picture Frameworks)​​描述性分析 (What Happened?)​​​​目的&#xff1a;​​ 了解过去发生了什么&#xff0c;描述现状&#xff0c;监控业务健康。​​核心工作&#xff1a;​​ 汇总、聚合、计算基础指标 (KPI)&#xff0c;生成报表和仪表盘…

电路研究9.3.10——合宙Air780EP中的AT开发指南:阿里云应用指南

这个好像也用不到&#xff0c;不过可以先贴出来。简单看了一下也没深入分析&#xff0c;直接扒过来了&#xff0c;感觉涉及到了上位机的学习了。我这下位机的可能用不到&#xff0c;就是贴过来好了。 应用概述 使用 AT 方式连接阿里云分为一机一密和一型一密&#xff0c;其中一…

[Backlog] 核心协调器 | 终端用户界面(TUI)实现 | 多分支任务冲突解决 | 测试验证体系

第8章 核心协调器 欢迎回到Backlog.md&#xff01; 在上一章文件系统操作中&#xff0c;我们深入了解了数据物理存储层面的读写机制。本章将聚焦系统的神经中枢——核心协调器。 核心协调器的本质&#xff08;中央决策引擎&#xff09; 如果将Backlog.md视为项目管理团队&a…

车载以太网-TC8测试-UT(Upper Tester)

目录 一、技术原理:指令体系与协议适配1. **指令格式与传输机制**2. **协议栈交互逻辑**3. **规范遵循与版本演进**二、测试应用:TC8测试场景与案例1. **TCP协议栈深度验证**2. **ARP协议健壮性测试**3. **SOME/IP服务动态管理**三、实现挑战与解决方案1. **实时性要求**2. *…

扣子Coze纯前端部署多Agents

纯前端网页搭建&#xff0c;无需任何后端代码&#xff0c;方便快捷&#xff01; 就像公司前台的多功能控制台&#xff0c;员工可以通过按钮快速呼叫不同的AI助手。具备多设备适配、智能对话等基础能力。 支持添加多个智能体 配置方式 添加智能体信息&#xff0c;data-bot为智…