探索Java面向对象编程的奇妙世界(二)

news2025/1/11 16:01:45

    • ⭐ 对象和类的详解
    • ⭐ 构造方法(构造器 constructor)
    • ⭐ 构造方法的重载
    • ⭐ 面向对象的内存分析

⭐ 对象和类的详解

在这里插入图片描述

类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车,怎么样造?类就是这个图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。

类:我们叫做 class。 对象:我们叫做Object,instance(实例)。

注意:

🐟	类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
🐟	类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同的属性、方法。

类的定义
【eg】类的定义方式

// 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致!
	public class Car { 
	}
	class Tyre { // 一个Java文件可以同时定义多个class
	}
	class Engine {
	}
	class Seat {
	}

对于一个类来说,有三种成员:属性 field、方法 method、构造器 constructor。
在这里插入图片描述

属性(field 成员变量)

属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java 使用默认的值对其初始化。

在这里插入图片描述
属性定义格式:

[修饰符] 属性类型 属性名 = [默认值] ;

方法

方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。

	[修饰符] 方法返回值类型 方法名(形参列表) {
			// n 条语句
	}

【eg】编写简单的学生类

	public class SxtStu {
		 //属性(成员变量)
		int id;
		String sname;
		int age;
		//方法
		void study(){
			System.out.println("我正在学习!");
	}
		//构造方法
		SxtStu(){
	}
}

简单内存分析
在这里插入图片描述
源代码

	public class SxtStu {
		int id;
		int age;
		String sname;
	public void study(){
		System.out.println("学习");
}
	public void kickball(){
		System.out.println("踢球");
}
	public static void main(String[] args) {
		SxtStu s1=new SxtStu();
		System.out.println(s1.id);
		System.out.println(s1.sname);
		s1.id = 1001;
		s1.sname = "高淇";
		System.out.println(s1.id);
		System.out.println(s1.sname);
	}
}

⭐ 构造方法(构造器 constructor)

在这里插入图片描述

在这里插入图片描述

声明格式:

	[修饰符] 类名(形参列表){
		//n 条语句
	}

构造器 4 个要点:

🐟	构造器通过 new 关键字调用!!
🐟	构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用 return 返回某个值。
🐟	如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!
🐟	构造器的方法名必须和类名一致!

【eg】

需求:
1.定义一个“点”(Point)类用来表示二维空间中的点(有两个坐标)。要求如下:
2.可以生成具有特定坐标的点对象。
3.提供可以计算该“点”距另外一点距离的方法。
	class Point {
		double x, y;
		public Point(double _x, double _y) {
		x = _x;
		y = _y;
	}
	public double getDistance(Point p) {
		return Math.sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
}
	public static void main(String[ ] args) {
		Point p1 = new Point(3.0, 4.0);
		Point origin = new Point(0.0, 0.0);
			System.out.println(p1.getDistance(origin));
		}
}

⭐ 构造方法的重载

在这里插入图片描述

【eg】构造方法重载(创建不同用户对象)

	public class User {
		int id; // id
		String name; // 账户名
		String pwd; // 密码

	public User() {
	}
	
	public User(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public User(int id, String name, String pwd) {
		this.id = id;
		this.name = name;
		this.pwd = pwd;
	}

	public static void main(String[ ] args) {
		User u1 = new User();
		User u2 = new User(101, "高小七");
		User u3 = new User(100, "高淇", "123456");
	}
}

注意:

如果方法构造中形参名与属性名相同时,需要使用 this 关键字区分属性与形参。
 this.id 表示属性 id;id 表示形参 id

⭐ 面向对象的内存分析

下面我带大家了解下程序的执行过程中,内存到底发生了什么变化,让大家做到“心中有数”,通过更加形象方式理解程序的执行方式。

JAVA 虚拟机内存模型概念
在这里插入图片描述

我们前面做过的内存分析过程:
在这里插入图片描述

Java 虚拟机的内存可以分为三个区域:栈 stack、堆 heap、方法区 method area。

虚拟机栈(简称:栈)的特点如下:

🐟	栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
🐟	JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
🐟	栈属于线程私有,不能实现线程间的共享!
🐟	栈的存储特性是“先进后出,后进先出”
🐟	栈是由系统自动分配,速度快!栈是一个连续的内存空间!

堆的特点如下:

🐟	堆用于存储创建好的对象和数组(数组也是对象)
🐟	JVM 只有一个堆,被所有线程共享
🐟	堆是一个不连续的内存空间,分配灵活,速度慢!
🐟	堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。

在这里插入图片描述

方法区(也是堆)特点如下:

🐟	方法区是 JAVA 虚拟机规范,可以有不同的实现。
				i. JDK7 以前是“永久代”
				ii. JDK7 部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
				iii. JDK8 是“元数据空间”和堆结合起来。
🐟	JVM 只有一个方法区,被所有线程共享!
🐟	方法区实际也是堆,只是用于存储类、常量相关的信息!
🐟	用来存放程序中永远是不变或唯一的内容。
🐟	常量池主要存放常量:如文本字符串、final 常量值。

【eg】编写 Person 类并分析内存

	public class Person {
		String name;
		int age;
	
	public void show(){
		System.out.println(name);
	}

	public static void main(String[ ] args) {
		// 创建p1对象
		Person p1 = new Person();
		p1.age = 24;
		p1.name = "张三";
		p1.show();
		// 创建p2对象
		Person p2 = new Person();
		p2.age = 35;
		p2.name = "李四";
		p2.show();
 		Person p3 = p1;
 		Person p4 = p1;
 		p4.age = 80;
	 	System.out.println(p1.age);
	}
}

运行时的内存分配图(执行到最后一步对应的图形):
在这里插入图片描述

参数传值机制
在这里插入图片描述

Java 中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。

基本数据类型参数的传值

传递的是值的副本。 副本改变不会影响原件。

引用类型参数的传值

传递的是值的副本。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”。

【eg】多个变量指向同一个对象

	public class User {
		int id; //id
		String name; //账户名
		String pwd; //密码
	public User(int id, String name) {
		this.id = id;
		this.name = name;
}
	public static void main(String[ ] args) {
		User u1 = new User(100, "高小七");
		User u3 = u1;
		System.out.println(u1.name);
		u3.name="张三";
		System.out.println(u1.name);
	}
}

执行结果如下所示:
在这里插入图片描述

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

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

相关文章

以太网、工业以太网和Profinet三者有何关联?

总的来说,以太网是一种局域网规范,工业以太网是应用于工业控制领域的以太网技术,Profinet是一种在工业以太网上运行的实时技术规范。 下面,我们来详细说说这三者的区别。 1.以太网 以太网是当今现有局域网采用的最通用的通信协议…

AndResGuard 源码解析

背景 抖音包体积优化提出的“键常量池裁剪”是基于腾讯的AndResGuard资源混淆之后做的进一步处理,也就是对resources.arsc文件的处理。而资源混淆,就是对resources.arsc文件进行修改。那么我们可以尝试基于这个思路,对AndResGuard插件源码进…

推荐一款好用的Idea热部署插件

目录 1.什么是热部署 2.为什么需要热部署 3.热部署产品 3.1.JRebel 3.2.IDEA HotSwap 3.3.HotSwapAgent 3.4.Spring Boot DevTools 3.5.FastHotSwapper 4.FastHotSwapper安装使用 参考: 1.什么是热部署 热部署(Hot Deployment)是指…

chatgpt赋能Python-python_iloc_loc

使用Python中的iloc和loc方法对数据进行索引 如果你正在使用Python来进行数据处理或者数据分析,那么你肯定会遇到需要对数据进行索引的情况。Python提供了两个非常有用的方法——iloc和loc,对于数据的索引和切片操作非常实用。在本文中,我们…

yolov5-7.0 添加BiFPN

1. BiFPN特征融合 BiFPN是目标检测中神经网络架构设计的选择之一,为了优化目标检测性能而提出。主要用来进行多尺度特征融合,对神经网络性能进行优化。来自EfficientDet: Scalable and Efficient Object Detection这篇论文。 在这篇论文中,作…

算法27:从暴力递归到动态规划(2)

上一题比较简单,下面来一道比较难的题目。 假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2 开始时机器人在其中的M位置上(M 一定是 1~N 中的一个) 如果机器人来到1位置,那么下一步只能往右来到2位置; 如果机…

初级程序员如何快速晋升为技术大牛

[请搜索公众号“云智AI助手”、“云智博瑞”关注我们 │ 谢谢支持 ] Cloud wisdom, AI assistant 作为初级程序员,你是否常常遇到代码优Bug调试的难题?幸运的是,ChatGPT可以助你一臂之力。本文将通过多个实例展示,如何借ChatGPT的…

【微信支付】分享一个失败的项目

这个项目是去年做的,开始客户还在推广,几个月后发现服务器已经关掉了。这是一个发图片猜谜语的应用,用户猜对了分红包,所得奖金可以提现。开发的时候对需求都不太看好,觉得用户粘性太低了。今天就把所有的程序拿了出来…

[抢先看] 全平台数据 (数据库) 管理工具 DataCap 1.10.0

推荐一个基于 SpringBoot 开发的全平台数据 (数据库管理工具) 功能比较完善,建议下载使用: github.com/EdurtIO/datacap 目前已经支持 40 多种数据源。国内首个应用 ChatGPT 到数据管理系统中项目。 在 DataCap v1.10.0 中我们主要核心修改了数据编辑器,…

多线程处理有序集合

文章目录 前言一、多线程处理有序集合?总结 前言 通过多线程,处理数据是一个快速提高处理的手段,那么当用多线程处理的时候,如果遇到有序集合怎么办?例如: 我想爬取一本小说,那么爬取完成后,需要的是 一个有序的章节小说,而非混乱的 章节,如何做呢? 一、多线程处…

.Net8顶级技术:边界检查之IR解析(慎入)

前言 C#这种语言之所以号称安全的,面向对象的语言。这个安全两个字可不是瞎叫的哦。因为JIT会检查任何可能超出分配范围的数值,以便使其保持在安全边界内。这里有两个概念,其一边界检查,其二IR解析。后者的生成是前者的功能的保证…

音视频使用qt测试ffmpeg接口时无法运行

仅仅时把自己过程中遇到的稍微阻塞疑惑问题做出整理,疑惑的是拿到的ffmpeg包中没有dll文件,导致自己研究了一系列。 使用qt加载音视频ffmpeg对应的相关lib库,进行接口,源码的研究。 1:使用源码安装的方式获取相关的动…

【蓝桥杯省赛真题40】Scratch报数游戏 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch报数游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

OKR是什么意思啊

一、OKR是什么意思? OKR是"Objective and Key Results"的缩写,即目标和关键结果。它是一种目标管理框架,旨在帮助组织和团队设定明确的目标,并通过关键结果来衡量和追踪目标的实现情况。 为了让大家快速了解什么是OKR…

基于变长频带选择的JPEG图像可逆数据隐藏-文献学习

论文学习 原文题目: Reversible Data Hiding of JPEG Image Based on Adaptive Frequency Band Length 发表期刊: TCSVT 2023(中科院1区) 作者: Ningxiong Mao, Hongjie He, Fan Chen, Yuan Yuan, Lingfeng Qu 摘要 J…

SolVES模型应用(基于多源环境QGIS\PostgreSQL\ARCGIS\MAXENT\R语言支持下模型应用)

生态系统服务是人类从自然界中获得的直接或间接惠益,可分为供给服务、文化服务、调节服务和支持服务4类,对提升人类福祉具有重大意义,且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目(Millennium Ecosystem Asse…

又双叒叕入选!腾讯安全NDR连续四年获Gartner认可

近日,全球权威研究机构 Gartner发布了2023年《Emerging Tech: Security — Adoption Growth Insights for Network Detection and Response》(《新兴技术:安全-网络检测与响应的采用增长洞察》),腾讯安全连续四年被列为…

内卷把同事逼成了“扫地僧”,把Git上所有面试题整理成足足24W字测试八股文

互联网大厂更多的是看重学历还是技术? 毫无疑问,是技术,技术水平相近的情况下,肯定学历高/好的会优先一点,这点大家肯定都理解。 说实话,学弟学妹们找工作难,作为面试官招人也难呀&#xff01…

使用laf云开发三分钟上线你自己的Midjourney

文章尾部有demo 江湖惯例:先来一波感谢,感谢laf,让我们可以不使用魔法、免费接入Midjourney,不了解laf的请猛戳 Laf介绍 一、写这篇博客的背景 laf官方最近发布了一个活动,活动链接,新手也可以接入哦&…

云渲染平台为什么越来越多的效果图公司开始使用?

随着3dmax版本的不断更迭,包括常用的V-Ray渲染器和Corona渲染器的不断更新,室内设计行业对于 效果图的渲染要求越来越高。而要求更高的渲染精度和更真实的渲染效果,所需要付出的代价则是不断增长的参数,这会使渲染一张效果图的时间…