Java类和对象详解

news2024/12/23 9:05:29

文章目录

    • 面向对象概述
    • 类和对象
    • 类定义和使用
      • 定义
      • 使用
    • 对象引用
    • 对象的初始化和构造
      • 构造方法
      • 默认初始化
      • 就地初始化

面向对象概述

面向对象是一种现在主流的程序设计方法,现如今的大部分语言都支持面向对象,Java的面向对象是由C++的面向对象衍生而来,去掉了一些复杂的机制,如多继承等,使得Java的语法更加简洁明了。

但是早期,以C语言为代表的语言基本上使用的都是面向过程,而面向过程只是针对”过程“进行的,以实现基本操作,基本上不会进行扩展,并且在“过程”上维护的成本极高

面向对象采用了模块化的思想,每个模块独立存在,可以被复用扩展,所以面向对象成为了程序设计的主流模式。

在面向对象定义之中,也规定了一些基本的特性:

  1. 封装:隐藏类内部的实现细节,对外提供接口进行交互
  2. 继承:在原有代码基础上进行扩展
  3. 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果

类和对象

类和对象是面向对象编程中的最基本单位

类:是抽象的概念集合,表示具有某种共性的事物,类之中定义的是属性(成员变量)和行为(成员方法)【人类】
对象:对象是类的具象化,一种个性,是特殊的,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。【你我他】

总结:类是对象的模板,对象是类的实例。先使用类(模板、图纸)实例化出具体的对象(实例、车),才能对使用中的属性和方法。我们通过对象使用类,而类又是依赖于对象而存在的。
类:
在这里插入图片描述

类定义和使用

定义

在Java使用关键字class 定义一个类。语法如下:

class 类名 {
    属性 (成员变量) ;
    行为 (成员方法) ;
}

示例:定义一个Student类

首先抽象出学生的属性和行为:
在这里插入图片描述

class Studeng {  // 类名使用大驼峰,单词首字母大写
	// 属性(成员变量)
	String name; // 姓名
	String class;// 班级 
	int number;  // 学号
	int grade;   // 年级
	// 行为(成员方法)
	public void exam() { //考试
		// .......
	}

	public void doTask(){ // 做作业
		// ......
	}
	
	public void read(){ // 读书
		// ......
		System.out.println("阿巴阿巴阿巴");
	}
}

类定义完成之后,只是完成了图纸的绘制,想要使用还需要进行加工,实例化出对象。类是一种我们自定义的引用数据类型。示例对象的两种方式:
方式一:声明并实例化对象
在这里插入图片描述

类名 对象名 = new 类名 ( );

方式二:先声明,再实例化
在这里插入图片描述

类名 对象名 = null;
对象名 = new 类名 ();

总结:

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

使用

引用数据类型中存储的是类型的地址,需要使用new关键字给这个地址分配内存空间。学生对象中存储的是一个内存地址,指向堆中分配给这个对象的内存空间。

实例化对象之后我们就可以使用 . . . 操作符调用对象的属性和行为。

示例:调用学生类的属性和行为

......
public static void main(String[] args) {
	Student s1 = new Student();
	s1.name = "张三"; // 调用s1对象的名字属性进行赋值
	s1.doTask();     // 调用s1对象的方法,张三做作业
}

如果只创建了类变量,没有引用对象那么会怎样?

......
public static void main(String[] args) {
	Student s1;
	s1.name;
}

Exception in thread “main” java.lang.NullPointerException 空指针异常,引用变量没有指向任何对象,但却访问了name属性。

对象引用

同一块堆内存空间,可以同时被多个栈内存所指向,不同的栈可以修改同一块堆内存的内容。简单来说,多个对象可以引用同一块内存空间。
在这里插入图片描述
此时,这三个对象就都可以访问 0 x 18 0x18 0x18空间内的字段。

例如:

......
public static void main(String[] args) {
	Student s1 = new Student();
	Student s2 = s1;// 改变引用
	Student s3 = s1;
}

此时s1 ,s2 ,s3都同时指向一块内存空间。就像上面图所画一样。

又例如:

......
public static void main(String[] args) {
	Student s1 = new Student();
	Student s2 = new Student();
	s1 = s2;// ①
}

在这里插入图片描述

当程序执行到①时,s2原来指向的内存空间没有被任何对象所指向,会等待GC的回收。

这里有没有被对象引用,内部是使用"引用计数器"这样的技术实现的,没多一个对象引用该内存空间,计数器就加一,如果计数器为0,那么等待这块内存空间的将是被GC回收。

JVM - Java虚拟机GC,会自动回收垃圾,管理好内存,大大避免了内存泄漏(C++ 投来了羡慕的眼光~~)
垃圾:指的是没有被引用的堆内存空间,这块空间就成为垃圾,所有的垃圾将等待GC(垃圾收集器)不定期的进行回收与空间的释放。

对象的初始化和构造

构造方法

构造方法就是给类的成员进行初始化的,这是一个比较特殊的方法:

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

默认初始化

局部变量不初始化编译器是会报错的,但是成员变量不初始化却并不会报错。
在这里插入图片描述
这是因为编译器在替我们负重前行,将类中的成员变量进行了默认初始化。

在程序层面只是简单的一条语句,在JVM层面需要做好多事情:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题
    比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
  4. 初始化所分配的空间
    即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,给成员变量对相应类型的0值。
byteshortintlongfloatdoublecharbooleanreference(引用类型)
0000L0.0f0.0‘\u0000’falsenull

就地初始化

就地初始化就是在声明成员变量时,就直接给出了初始值

public class Date {
    public int year = 1900;
    public int month = 1;
    public int day = 1;

    public Date() {
    }

    public Date(int year, int month, int day) {
    }

    public static void main(String[] args) {
        Date d1 = new Date(2021, 6, 9);
        Date d2 = new Date();
    }
}

代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。

本小节到这里就结束了,如果对你有帮助,请点赞,评论,转发,你的支持是我创作的动力。

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

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

相关文章

AMD发布大小核 CPU,6核心直接砍成单核了

2022年 Intel 第12代酷睿发布,PE 大小核设计被正式带到了 PC 上。 P-Core 也就是传统的大核有着高性能、高功耗,而 E-Core 小核则是更讲究能效比以更低频率运行。 虽说小蝾也曾有对 Windows 调度方面的怀疑,但多线程性能确实实打实证明了其优…

node插件MongoDB(四)—— 库mongoose 操作文档使用(新增、删除、更新、查看文档)(二)

文章目录 前言(1)问题:安装的mongoose 库版本不应该过高导致的问题(2)重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 三、修改文档…

react类式组件的生命周期和useEffect实现函数组件生命周期

概念 生命周期是一个组件丛创建,渲染,更新,卸载的过程,无论是vue还是react都具有这个设计概念,也是开发者必须熟练运用的,特别是业务开发,不同的生命周期做不同的事是很重要的. ....多说两句心得,本人是先接触vue的,无论是vue2还是vue3的生命周期,在理解和学习上都会比react更…

echarts饼图label显示不全原因?

echarts饼图label显示不全原因? 标签数量过多:当饼图的扇形数量较多时,为了保证图形的清晰性,ECharts 可能不会显示所有的标签,而是选择显示部分标签或者不显示标签。标签过长:如果标签的文字过长&#xf…

软件测试常用的测试方法详解

软件测试是软件开发过程中重要组成部分,是用来确认一个程序的质量或者性能是否符合开发之前提出的一些要求。软件测试的目的有两方面,一方面是确认软件的质量,另一方面是提供信息,例如,给开发人员或者程序经理反馈意见…

基于springboot实现家具商城管理系统项目【项目源码】计算机毕业设计

基于springboot实现家具商城管理系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的…

vue+nodejs商城实战项目【登录 + 购物车 + 支付】

从零开始一个前端项目并将其完成需要经历一系列步骤。以下是一个常见的开发流程,可以帮助规划和管理项目: 需求分析和规划: 确定项目的目标和范围。定义用户需求和功能要求。制定项目计划和时间表。 技术选型: 选择适当的前端技术…

Jira Software Enterprise Crack

Jira Software Enterprise Crack Jira软件是为您的应用程序组中的每一个成员设计、监控和启动优秀软件的。 策略:生成用户故事和问题,策略冲刺,并在应用程序团队中分配任务。 跟踪:在具有绝对可见性的完整背景下,确定团…

【论文阅读笔记】Detecting AI Trojans Using Meta Neural Analysis

个人阅读笔记,如有错误欢迎指出! 会议:2021 S&P Detecting AI Trojans Using Meta Neural Analysis | IEEE Conference Publication | IEEE Xplore 问题: 当前防御方法存在一些难以实现的假设,或者要求直…

基本数据类型小题两道

根据公式计算A地区教师任教年薪,统计键盘输入的字符串中数字个数,按字典序输出。 (笔记模板由python脚本于2023年11月10日 18:05:18创建,本篇笔记适合熟悉python列表、元、字符串等基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】 Pyth…

vue同时校验多个表单

0 效果 1 代码 checkForm (formRef) {return new Promise((resolve, reject) > {this.$refs[formRef].validate((valid) > {if (valid) {resolve();} else {setTimeout(() > {this.$refs[formRef].clearValidate();reject(new Error(错误));}, 1500);}});}); }, conf…

【unity3D】Input Field组件(可供用户输入的文本框)

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的Input Field组件 Input Field组件 基础属性详细解释 Unity中的InputField组件可以用来创建一个可供用户输入的文本框。 基础属性…

Linux内核密码模块

目录 密码算法介绍 Hash摘要算法 Cipher加解密算法 块密码算法 认证算法 MAC和HMAC AEAD算法 Linux内核密码模块的基本构件 Linux内核密码模块介绍 如何使用Linux密码模块 用户层调用Linux内核密码模块的方法 cryptodev AF_ALG 如何开发一个密码引擎驱动 开发一个…

Pycharm常用快捷键和替换正则表达式

原生快捷键的使用: 1.CtrlF:查找 2.CtrlZ:返回上一步 3.Alt 鼠标左键选择:多行同时编辑(上、下、左、右键能够移动光标) 按住Ctrl,左键点击,定位光标 编辑过程 URL常用的替换正则表达式&am…

从小白到测试专家:掌握Pytest的实用技巧和优秀实践

pytest是一个功能丰富且易于使用的Python测试框架,它建立在Python标准库的unittest模块之上,提供了更简洁、灵活和可读性强的测试代码编写方式。下面,我将按照步骤引导您学习pytest。 步骤1:安装pytest 首先,您需要安装…

python3.8及以上版本绑定gdal库的一个注意事项

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> gdal和python绑定参考文章:windows环境下python和gdal绑定方法   值得注意的是绑定python3.8及以上版本后在python程序中初始化gdal库时会出…

自媒体项目详述

总体框架 本项目主要着手于获取最新最热新闻资讯,以微服务构架为技术基础搭建校内仅供学生教师使用的校园新媒体app。以文章为主线的核心业务主要分为如下子模块。自媒体模块实现用户创建功能、文章发布功能、素材管理功能。app端用户模块实现文章搜索、文章点赞、…

Qt QTableWidget表格的宽度

默认值 QTableWIdget的表格宽度默认是一个给定值,可以手动调整每列的宽度,也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{"11","111111111111",&…

ios 对话框 弹框,输入对话框 普通对话框

1 普通对话框 UIAlertController* alert [UIAlertController alertControllerWithTitle:"a" message:"alert12222fdsfs" pr…

Springboot自动装配(SPI技术、@Import动态加载配置类)

SpringBoot原理 起步依赖 依赖传递,a依赖b,b依赖c 自动配置 Springboot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不用手动配置了 Springboot采用的是EnableXXXX注解,分装…