Java类和对象详解

文章目录

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

面向对象概述

面向对象是一种现在主流的程序设计方法,现如今的大部分语言都支持面向对象,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();
    }
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Talk | 马里兰大学博士生吴曦旸:分布式多智能体强化学习在复杂交通轨迹规划中的应用

本期为TechBeat人工智能社区第545期线上Talk! 北京时间11月09日(周四)20:00,马里兰大学博士生—吴曦旸的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “分布式多智能体强化学习在复杂交通轨迹规划中的应用”,介…

SpringBoot定时任务打成jar 引入到新的项目中后并自动执行

一、springBoot开发定时任务 ①&#xff1a;连接数据库实现新增功能 1. 引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependen…

阿里云竞争加剧,腾讯云双十一服务器优惠力度爆表!

腾讯云对于新客户和老客户都有相互照顾的优惠力度。特别是在今年的双十一活动中&#xff0c;腾讯云推出了一系列的优惠活动。首先&#xff0c;轻量服务器和云服务器产品的首购活动中&#xff0c;三年的云服务器仅需540元&#xff0c;这是一个非常低廉的价格。其次&#xff0c;香…

2.3.4 交换机的DHCP技术

实验2.3.4 交换机的DHCP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置。2.将交换机的接口配置为trunk模式&#xff0c;并允许vlan10 和vlan20通过。3.开启交换机的DHCP功能。4.配置交换机的DHCP服务。5.配置vlan的vlanif接口的IP地址&…

【Spring】事务实现原理

在使用事务的时候需要添加EnableTransactionManagement注解来开启事务&#xff0c;Spring事务底层是通过AOP来实现的&#xff0c;所以启用事务后&#xff0c;同样会向容器中注入一个代理对象创建器&#xff0c;AOP使用的是AnnotationAwareAspectJAutoProxyCreator&#xff0c;事…

易点易动固定资产管理系统:实现财务与OA系统的无缝对接,高效管理固定资产

在现代企业经营中&#xff0c;固定资产管理是一个非常重要的环节。准确记录和管理固定资产不仅对企业的财务状况有直接影响&#xff0c;还能提高资产利用率、降低运营成本&#xff0c;并确保企业的合规性。然而&#xff0c;传统的固定资产管理方式往往存在繁琐、效率低下的问题…

计算机考研408到底有多难?25届开个好头很有必要

前言 大家好&#xff0c;我是陈橘又青&#xff0c;相信关注我的各位小伙伴们中&#xff0c;大多都是在计算机专业的大学生吧&#xff01; 每天都有许多人在后台私信我&#xff0c;问我要不要考研&#xff0c;我想说这个东西是因人而异的&#xff0c;像我本人就选择了就业&…

ADS微带单枝短截线匹配电路的仿真

ADS微带单枝短截线匹配电路的仿真 简介环境原理图过程版图过程 简介 利用ADS2020软件设计匹配电路通常有5种方法&#xff0c;本小节首先介绍如何通过“Design-Guide”进行微带单枝短截线匹配电路的设计与仿真。 环境 ADS2020 《ADS2011射频电路设计与仿真实例》 [徐兴福著][…

10 个适用于 Windows 的最佳 PDF 编辑器,用于轻松编辑 PDF 文件

PDF 是当今最流行的文件格式之一。Adobe 于 1993 年开发了 PDF 文件格式。PDF&#xff08;便携式文档格式&#xff09;主要用于存储复杂的文本文档和电子书。PDF 文件包含固定的布局属性&#xff0c;并且可以存储大量文本和图形。PDF 文件格式主要用于分发大型文档。 使用 PDF…

vmware16.2内部win7联网

1、主机配置 前置条件&#xff1a;DHCP和NAT服务已启动 设置无线IP与虚拟机IP为自动获取 二者都是&#xff1a;右键-属性 选择IPv4 自动获取 2、虚拟机配置 设置虚拟机上网方式为NAT 菜单栏-虚拟机-设置 NMnet8改为NAT模式 菜单栏-编辑-虚拟网络编辑器 win7系统内部网…

Linux设置N天未登录强制冻结

1、创建普通用户 2、90天未登录强制冻结 chage -E $(date -d "90 days" %Y-%m-%d) 用户名 3.更改系统日期 sudo date -s "2024-02-07 20:18:00" 4.过期未登录,提示如下 5.账号解冻 chage -E -1 用户名

Apinto 网关进阶教程,使用 API Mock 生成模拟数据

什么是 API Mock &#xff1f; API Mock 是一种技术&#xff0c;它允许程序员在不依赖后端数据的情况下&#xff0c;模拟 web服务器端 API 的响应。通常使用 API Mock 来测试前端应用程序&#xff0c;而无需等待后端程序构建完成。API Mock 可以模拟任何 HTTP 请求方法&#x…

【操作系统】测试二

文章目录 单选题判断题填空题 单选题 在操作系统中&#xff0c;进行资源分配、调度和管理的最小独立单位是&#xff08;&#xff09;。 【 正确答案: C】 A. 作业 B. 程序 C. 进程 D. 用户 进程在发出I/O请求后&#xff0c;可能导致下列哪种进程状态演变&#xff1f; 【 正确答…

MATLAB中Line 属性说明

目录 颜色和样式 位置 Line 属性是注释线条的外观和行为。 Line 属性控制 Line 对象的外观和行为。通过更改属性值&#xff0c;可以修改线条的特定方面。使用圆点表示法查询和设置属性。 h annotation("line"); c h.Color; h.Color "red"; 颜色和样…

【23真题】太难!千万别考!不值!

今天分享的是23年哈尔滨工程大学810的信号与系统试题及解析。 为什么说不值呢&#xff1f;因为哈工程810据之前的分析来看不保护一志愿&#xff0c;就23年810的专业课来看&#xff0c;又在超纲的边缘疯狂试探&#xff01;&#xff08;如果它默认考DSP&#xff0c;当我没说&…

单源最短路的简单应用

1.dijkstra维护最长路 下面这个是讨论区的一个佬的理解&#xff0c;非常的nice 总结一句话&#xff0c;dijkstra的贪心保证了每次选定的点在之后都不会被其他点所更新了 同理维护最长路的时候我们发现&#xff0c;如果权值是0-1的话&#xff0c;选定的最大值在之后不会变的更大…

跨链知识指南

跨链知识指南 什么是跨链 跨链就是能够让两个不同的链产生某种关联的技术&#xff0c;或者说能把链A的东西搬到链B&#xff0c;跨链是一个复杂的过程&#xff0c;需要链对链外的信息的获取与验证&#xff0c;需要节点有单独的验证能力等等 什么是跨链桥&#xff1f; 跨链桥…

凯美瑞 vs 太空船:Web3 游戏生长的两条路径

撰文&#xff1a;Teng Yan&#xff08;0xPrismatic&#xff09;&#xff0c;Delphi Digital 研究员 编译&#xff1a;TinTinLand 来源&#xff1a;https://0xprismatic.substack.com/p/my-short-web3-gaming-thesis 经常有人问我关于 Web3 游戏的看法&#xff0c;所以我想以这…

实时时钟和日历电路MS85163/MS85163M

主要特点 ◼ 基于 32.768kHz 晶振提供年、月、日、 周工作日、小时、分钟和秒 ◼ 具有世纪标记&#xff0c;可工作于 2000-2199 年 ◼ 工作电压&#xff1a; 1.8V-5.5V ◼ 低功耗 ◼ 最高频率达 400kHz 的 I 2 C 接口 ◼ 可编程的时钟输出 (32.768kHz, 1.024kHz…

springcloud二手交易平台系统源码

开发技术&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;nodejs&#xff0c;vscode&#xff08;webstorm&#xff09; springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 用户端&…