Java 类和对象简介
类是对象的抽象,是一组具有相同特性(属性,事物的状态信息)和行为(事物能做什么)的事物的集合,可以看做一类事物的模板。
对象是类的实例化,是具体的事物。
比如:人类和具体的人、厨师类和具体的厨师。
类的定义
/*** 类定义*/
权限修饰符 其他修饰符 class 类名 {成员变量;初始化代码块;构造方法;成员方法;
}
权限修饰符 :public、protected(内部类时)、默认缺省、private(内部类时)。
其他修饰符:final(最终类,不可继承)、abstract(抽象类)、static(内部类)。
成员变量
- 类变量 / 静态变量
使用 static 关键字修饰,类本身具有的属性,不依赖具体的实例对象,有默认值(参考数组)。
类的内部可以直接访问,外部可以通过类名访问(<类名>.<类变量名>)。
类变量在类加载时进行初始化,只有一份数据,即类的所有实例对象共享类变量。
public class Test1 {public static void main(String[] args) {System.out.println(Human.POPULATION); // 默认值 0}
}class Human {public static int POPULATION;
}
- 实例变量
实例对象具有的属性,依赖具体的实例,有默认值(参考数组)。
在类的内部可以直接访问,和局部变量存在命名冲突时,适用就近原则,此时可以通过 this.实例变量名 访问,外部可以通过实例对象访问(<实例名>.<实例变量名>)。
实例变量在创建实例对象时进行初始化,每个对象都有自己的实例数据。
this:指代当前实例对象,可以通过 this 访问属性、成员方法、构造方法,还能作为参数传递给其他方法。
public class Test1 {public static void main(String[] args) {System.out.println(Human.POPULATION); // 默认值 0Human human = new Human();System.out.println(human.POPULATION); // 实际会转为通过类 Human 访问System.out.println(human.age); // 默认值 0}
}class Human {public static int POPULATION;public int age;
}
- 成员变量和局部变量
成员变量定义在类上,局部变量定义在方法或代码块中。
默认值:成员变量有默认值,局部变量没有默认值。
作用域:成员变量的作用域是类,局部变量的作用域是定义的方法或代码块内部。
初始化代码块
- 静态初始化代码块
用于静态变量的初始化,类加载时执行。
public static int POPULATION;static {POPULATION = 100;
}
- 实例初始化代码块
创建实例对象时执行的代码块,主要用于实例变量的初始化,在构造方法之前执行。
public int age;{age = 20;
}
成员方法
- 类方法 / 静态方法
使用 static 关键字修饰,类本身具有的行为,不依赖具体的实例,可以通过类名调用((<类名>.<类方法名>)),不能访问实例成员,只能访问静态成员。
public class Human {public static int POPULATION;public int age;public static void test1(){System.out.println(POPULATION); // 不能直接访问实例变量 age}
}
- 实例方法
实例对象具有的行为,依赖具体的实例,只能通过实例对象调用(<实例名>.<实例方法名>),可以访问静态成员和实例成员,对静态成员的访问实际会转为通过类访问。
实例方法中有一个隐含的参数,就是 this,指向当前调用方法的对象实例。
public class Human {public static int POPULATION;public int age;public static void test1(){System.out.println(POPULATION); // 不能直接访问实例变量 age}public void test2(){System.out.println(POPULATION);}
}
构造方法
修饰符 类名作构造方法名(){// 无参构造方法
}修饰符 类名作构造方法名(参数列表){this.属性名 = 参数;
}
构造方法用于创建对象时初始化实例对象属性,调用构造方法不代表会生成对象。
构造方法名与类名相同,没有返回值类型声明,可重载。
构造方法中可以使用 this(...) 调用其他的构造方法,但必须在第一行调用,这是为了避免误操作,先调别的,然后根据情况自己再做调整。
- 无参构造方法
默认构造方法,如果类没有显式声明构造方法,编译时会自动生成一个无参的构造方法,如果有显式声明,则不会自动生成无参构造方法。
- 有参构造方法
// 无参构造方法
public Human(){this(null,0); // 可以通过 this 调用其他构造方法
}// 有参构造方法
public Human(String name,int age){this.name = name; // 此处 this 指代当前对象this.age = age;
}
⭐对象创建
通过关键字 new 调用类的构造方法创建对象。
public static void main(String[] args){Human human = new Human("王炸",25);
}
类加载过程

类的加载是指 JVM 将类的相关信息加载到方法区内存,为这个类分配一块空间,存储类的定义、成员变量和方法信息,并对静态变量赋初始值。
在 Java 中,类是动态加载的,当第一次通过 new 创建一个类的对象时,或者第一次直接通过类名访问类变量或类方法时,才会加载该类,加载一个类时会查看其父类是否已加载,如果没有,则还会加载其父类。
类加载进内存后,一般不会释放,直到程序结束,所以静态变量在内存中只有一份。
1)分配内存(方法区内存)保存类的信息(成员变量、成员方法、初始化代码、父类信息引用);
2)给类变量赋默认值;
3)加载父类,设置父子关系;
4)执行类初始化代码,先初始化父类部分。
对象创建过程
当通过 new 创建一个对象的时候,对象产生,在堆内存中,会存储这个对象的实例值,每做一次 new 操作,就会产生一个对象。
每个对象除了保存实例变量的值外,还保存着对应类型即类的地址,这样,通过对象就能知道它的类,访问到类的信息。
1)分配内存保存对象信息(堆内存);
2)对所有实例变量赋默认值;
3)执行实例初始化代码,先初始化父类部分。
对象内存分析

human 在内存中大概如图所示,new 出来的对象实际在堆内存中,栈内存中的变量 human 存储的是对象在堆内存中的 地址。
当没有变量引用 0x1234 指向的对象时,该对象将等待垃圾回收机制处理,具体释放时间由 JVM 决定。
参考:《Java 编程的逻辑》 马俊昌
相关文章:
Java 类和对象简介
类是对象的抽象,是一组具有相同特性(属性,事物的状态信息)和行为(事物能做什么)的事物的集合,可以看做一类事物的模板。 对象是类的实例化,是具体的事物。 比如:人类和…...
时间复杂度的计算
个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 文章目录123456789时间复杂度(就是一个函数)的计算,…...
站内信箱系统的设计与实现
技术:Java、JSP等摘要:在经济全球化和信息技术成为发展迅速的今时今日,人们通过电子邮件收发进行信息传递已经成为主流。随着互联网和网络办公的发展,电子邮件正在被广泛应用在人们的日常生活中。跟据调查研究统计,在全…...
systemV共享内存
systemV共享内存 共享内存区是最快的IPC形式。共享内存的大小一般是4KB的整数倍,因为系统分配共享内存是以4KB为单位的(Page)!4KB也是划分内存块的基本单位。 之前学的管道,是通过文件系统来实现让不同的进程看到同一…...
Python基础之if逻辑判断
在学习if语句之前,我们先学习一种数据类型,布尔类型(bool),在if语句中,我们需要通过判断条件是否为真或者假,才进入下面的语句块执行。 一、布尔类型(bool) 布尔类型&a…...
实现pdf文件预览
前言 工作上接到的一个任务,实现pdf的在线预览,其实uniapp中已经有对应的api:uni.openDocument(OBJECT)(新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。)**实现了相关功能…...
【java】alibaba Fastjson --全解史上最快的JSON解析库
文章目录前序Fastjson 简介Fastjson 的优点速度快使用广泛测试完备使用简单功能完备下载和使用将 Java 对象转换为 JSON 格式JSONField创建 JSON 对象JSON 字符串转换为 Java 对象使用 ContextValueFilter 配置 JSON 转换使用 NameFilter 和 SerializeConfigFastjson 处理日期F…...
绝对零基础的C语言科班作业(期末模拟考试)(十道编程题)
编程题(共10题; 共100.0分)(给猛男妙妙屋更一篇模拟考试)模拟1(输出m到n的素数)从键盘输入两个整数[m,n], 输出m和n之间的所有素数。 输入样例:3,20输出样例:…...
按位与为零的三元组[掩码+异或的作用]
掩码异或的作用前言一、按位与为零的三元组二、统计分组1、map统计分组2、异或掩码总结参考资料前言 当a b 0时,我们能够很清楚的知道b是个什么值,b 0 - a -a,如果当a & b 0时,我们能够很清楚的知道b是什么值吗…...
C++基础篇(一)-- 简单入门
C 语言是在优化 C 语言的基础上为支持面向对象的程序设计而研制的一个通用目的的程序设计语言。在后来的持续研究中,C 增加了许多新概念,例如虚函数、重载、继承、标准模板库、异常处理、命名空间等。 C 语言的特点主要表现在两个方面:全面兼…...
前端整理 —— javascript 2
1. generator(生成器) 详细介绍 generator 介绍 generator 是 ES6 提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态。执行generator,会生成返回一个遍历器对象。返回的…...
Spring-注解注入
一、回顾XML注解 bean 配置 创建 bean public class Student { } 配置 xml bean <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSche…...
华为校招机试 - 攻城战(Java JS Python)
目录 题目描述 输入描述 输出描述 用例 题目解析 JavaScript算法源码 Java算法源码...
Docker入门
Docker一、何为DockerDocker是一个开源的应用容器引擎,基于GO语言并遵循从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后在发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使…...
时间序列分析 | CNN-LSTM卷积长短期记忆神经网络时间序列预测(Matlab完整程序)
时间序列分析 | CNN-LSTM卷积长短期记忆神经网络时间序列预测(Matlab完整程序) 目录 时间序列分析 | CNN-LSTM卷积长短期记忆神经网络时间序列预测(Matlab完整程序)预测结果模型输出基本介绍完整程序参考资料预测结果 模型输出 layers = 具有以下层的 151 Layer 数组:...
【蒸滴C】C语言结构体入门?看这一篇就够了
目录 一、结构体的定义 二、结构的声明 例子 三、 结构成员的类型 结构体变量的定义和初始化 1.声明类型的同时定义变量p1 2.直接定义结构体变量p2 3.初始化:定义变量的同时赋初值。 4.结构体变量的定义放在结构体的声明之后 5.结构体嵌套初始化 6.结构体…...
第十三届蓝桥杯
这里写目录标题一、刷题统计(ceil函数返回的是等值于某最小整数的浮点值,不强制转换回int就wa,没错就连和int整数相加都wa二、修剪灌木(主要应看清楚会调转方向三、统计子矩阵(前缀和滑动窗口⭐)四、[积木画…...
消息队列mq
应用场景: 1、解耦 2、削峰填谷 3、异步处理 4、消息通讯 工作模式: 一个消息只能被消费一次(订阅模式除外),消费者接受到消息会回调业务逻辑,消费逻辑写在回调函数里面。 1、简单模式:一个生产…...
[学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程
文章目录视频资料:一、Spark基础入门(环境搭建、入门概念)第二章:Spark环境搭建-Local2.1 课程服务器环境2.2 Local模式基本原理2.3 安装包下载2.4 Spark Local模式部署第三章:Spark环境搭建-StandAlone3.1 StandAlone…...
git push和 git pull的使用
git push与git pull是一对推送/拉取分支的git命令。git push 使用本地的对应分支来更新对应的远程分支。$ git push <远程主机名> <本地分支名>:<远程分支名>*注意: 命令中的本地分支是指将要被推送到远端的分支,而远程分支是指推送的目标分支&am…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
