面向对象

package com.mm;public class Person {/*** 名词-属性*/String name;int age;double height;/*** 动词-方法*/public void sleep(String add) {System.out.println("我在" + add + "睡觉");}public String introduce() {return "我的名字是" + name + "我的年龄是" + age;}
}

调用Person类

package com.mm;/*** 测试类:一般在测试类中编写业务逻辑代码*/
public class test {/*** main程序的入口*/public static void main(String[] args) {//创建一个Person类的对象Person p1 = new Person();//参照类的模板,给对象赋值p1.name = "丽丽";p1.age = 19;p1.height = 164.7;p1.sleep("宾馆");//接收对象返回值String s = p1.introduce();System.out.println(s);//创建新对象,对象不能重复命名Person p2 = new Person();p2.age = 30;//匿名对象new Person().age = 10;//可以对对象的属性进行赋值//注意,重复调用匿名对象产生的是不同对象,这是一个新的对象new Person().name = "菲菲";//用于仅一次调用,支持链式调用。表示返回下标为1的字符new Person().introduce().charAt(1);System.out.println(new Person().introduce().charAt(1));}
}

构造器

package com.mm;public class Person {/*** 名词-属性*/String name;int age;double height;/*** 显式的将构造器编写出来*/public Person(){System.out.println("这是无参构造器");}/*** 动词-方法*/public void sleep(String add) {System.out.println("我在" + add + "睡觉");}public String introduce() {return "我的名字是" + name + "我的年龄是" + age;}
}

调用Person类

package com.mm;/*** 测试类:一般在测试类中编写业务逻辑代码*/
public class test {/*** main程序的入口*/public static void main(String[] args) {Person p = new Person();}
}

有参构造器——构造器的重载

package com.mm;public class Person {int age;String name;double height;public Person(){//空参构造器,尽量保证存在}//构造器的重载public Person(int age, String name, double height) {//形参名可以跟属性一样,//默认就近原则:下面两个age都默认是形参age,相当于没有赋值给属性this.age = age;//使用this关键字,修饰要表示的属性this.name = name;this.height = height;}
}

调用Person类

package com.mm;public class test {public static void main(String[] args) {Person p = new Person(1, "菲菲", 110.1);System.out.println(p.age);System.out.println(p.name);}public static void main(String[] args) {Person p = new Person(2, "琳琳", 120.1);System.out.println(p.age);System.out.println(p.name);
}
步骤1

在栈中为main方法开辟栈帧。把Person类对应的字节码信息加载到方法区。等号右侧:new操作在堆空间开辟空间创建对象,此时属性为初始值。

步骤2

调用有参构造器(在构造方法栈中产生有参构造方法的栈帧,含参数a、b、c)。JVM(从栈内存?)把基本数据类型通过值传递传给a、b,从字符串常量池把字符串(地址)传给参数c。

步骤3

构造方法栈帧中的a、b、c把对应值传给堆中的对象属性。构造方法栈帧消失。

步骤4

堆空间中生成一个对应的地址0x88。等号左侧:把地址赋给栈空间中main栈帧的对象p

内存分析

方法形参为自定义引用数据类型。对象和对象之间的数据本身是不会相互影响的,但多个变量指向同一个对象时就会相互影响

package com.mm;public class Person {int id;int age;Person(int a, int b) {id = a;age = b;}class Test {public void change(Person p) {//传递对象p(不是传递对象的数据)p.id = 2;p.age = 18;}public static void main(String[] args) {//主方法Person p = new Person(1, 20);//创建对象p(0x88地址指向堆内存中的对象)Test t = new Test();//创建对象t(0x72地址指向堆内存中的对象)t.change(p);//t调用change方法。为change方法创建对应栈帧,把main方法里的对象p传到chage方法里(虽然是通过值传递方式,但传过去的也是0x88地址指向堆内存中的对象)System.out.println(p.id);//2System.out.println(p.age);//18}}
}
步骤1

在栈中为main方法开辟栈帧。

把Person类对应的字节码信息加载到方法区。等号右侧:new操作在堆空间开辟空间创建对象,此时属性为初始值。堆空间中生成一个对应的地址0x88。等号左侧:把地址赋给栈空间中main栈帧的对象p

把Test类对应的字节码信息加载到方法区。等号右侧:new操作在堆空间开辟空间创建对象,此时属性为初始值。堆空间中生成一个对应的地址0x72。等号左侧:把地址赋给栈空间中main栈帧的对象t

步骤2

在栈帧中开辟change方法栈帧,并将p对象的地址提供‘值传递’方式传到change方法栈帧。

步骤3

change栈帧中的p依旧是0x88,指向堆空间里的对象

方法形参为自定义引用数据类型。对象和对象之间的数据本身是不会相互影响的,但多个变量指向同一个对象时就会相互影响

步骤4

方法change对p.id和p.age重新赋值,改变堆空间0x88对应的对象p的属性

打印时main栈帧里的p对象通过0x88找到堆空间的p对象并返回属性值(被改变)

this关键字

package com.mm;public class Person {int age;String name;public Person(int age, String name){//属性名字和形参重名//this修饰构造器必须放在第一行this(age);//等于this.age = age。相当于调用本类的构造器(下面第一个)System.out.println(this); // 指代的就是当前正在构建的对象//this.age = age; // 如果属性名字和形参重名,那么要表示的属性前面必须加上thisthis.name = name;}public Person(int age){//被this隐式修饰的构造器,被上面调用this.age = age;}public Person(String name){//参数类型不同,不会被调用this.name = name;}public void sleep(){System.out.println(/*this.*/age); // 10,此处没有重名问题,那么可以省略this.int age = 66;System.out.println(age);//66  如果局部变量和属性重名,也会发生就近原则System.out.println(this.age); // 10}public void eat(){System.out.println(this); // 指代的就是正在调用当前方法的对象System.out.println("我可以吃饭");play();//如果在同一个类中调用本类的方法,可以不用写this}public void play(){System.out.println("我可以玩");}
}

调用Person类sleep方法

package com.mm;public class Test {public static void main(String[] args) {// 创建Person类的具体的对象:Person p = new Person(10, "丽丽");System.out.println(p);p.sleep();p.eat();}
}

封装

package com.mm;public class Person {private int age;/*** 定义一个方法,用来设置age,提供合理的暴露*/public void setAge(int age) {if (age >= 18) {//只暴露小于18的,大于等于18的都是18this.age = 18;} else {this.age = age;}}/*** 用来读取age*/public int getAge() {return this.age;}
}

调用Person

package com.mm;public class test {public static void main(String[] args) {Person p = new Person();p.setAge(19);System.out.println(p.getAge());}
}

封装实操

package com.mm;public class Person {private String name;private String sex;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {if (sex.equals("男") || sex.equals("女")) {//使用equals更规范this.sex = sex;} else {this.sex = "男";}}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person() {}public Person(String name, String sex, int age) {this.name = name;//相当于this.sex = sex;setSex(sex);//使用上面的方法setSexthis.age = age;}
}

调用Person类

package com.mm;public class test {public static void main(String[] args) {Person p = new Person();p.setAge(19);p.setName("丽丽");p.setSex("女");System.out.println(p.getAge());System.out.println(p.getName());System.out.println(p.getSex());Person p2 = new Person("菲菲", "sdfa", 19);System.out.println(p2.getAge());System.out.println(p2.getName());System.out.println(p2.getSex());}
}

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

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

相关文章

地下隧道管廊结构健康监测系统 测点的布设及设备选型

隧道监测背景 隧道所处地下环境复杂,在施工过程中会面临围堰变形、拱顶沉降、净空收敛、初衬应力变化、土体塌方等多种危险情况。在隧道营运过程中,也会受到材料退化、地震、人为破坏等因素影响,引发隧道主体结构的劣化和损坏,若不…

node.js卸载与安装超详细教程

文章目录一、卸载Step1:通过控制面板删除node版本Step2:删除node的安装目录Step3:查找.npmrc文件是否存在,有就删除。Step4:查看以下文件是否存在,有就删除Step5:打开系统设置,检查系…

飞算JavaAI“删除接口信息” 功能:3 步清理冗余接口,让管理效率翻倍

在飞算JavaAI的接口设计与管理流程中,“删除接口信息” 功能为用户提供了灵活调整接口方案的便利。该功能的存在,让用户能够在接口生命周期的前期(审核阶段)及时清理无需创建的接口,保证接口管理的简洁性与高效性。一、…

行业热点丨SimLab解决方案如何高效应对3D IC多物理场与ECAD建模挑战?

半导体行业正快速超越传统2D封装技术,积极采用 3D集成电路(3D ICs)和2.5D 先进封装等方案。这些技术通过异构芯粒、硅中介层和复杂多层布线实现更高性能与集成度。然而,由于电子计算机辅助设计(ECAD)数据规…

2025暑期—05神经网络-BP网络

按误差反向传播(简称误差反传)训练的多层前馈网络线性回归或者分类不需要使用神经元,原有最小二程即可。求解J依次变小。使用泰勒展开,只看第一阶。偏导是确定的,需要让J小于0的delta WkWk构造完成后 J(Wk1)已知&#…

qml的信号槽机制

qml的信号槽机制和qtwidget差不多,但是使用方法不一样,qtwidget一般直接用connect函数把信号和槽一绑定就完事了,qml分为自动绑定和手动绑定。信号自动绑定在一个组件里面定义一个信号,用signal定义,当事件触发&#x…

Unity国际版下载链接分享(非c1国内版)

转载Unity国际版下载链接分享(非c1国内版) - 哔哩哔哩 大家平时使用Unity注意一下会发现,现在我们下载的Unity版本号后面都一个c1,但是大家在B站学习时大神UP主们使用的Unity版本号大都是没有c1的。 例如:我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在复杂的系统中,每个业务实体都需要使用ID做唯一标识,以方便进行数据操作。例如,每个用户都有唯一的用户ID,每条内容都有唯一的内容ID,甚至每条内容下的每条评论都有唯一的评论ID。 4.1.1 全局唯一与UUID 在互联网还未…

图论水题日记

cf1805D 题意 给定一棵树,规定dis(u,v)≥kdis(u,v) \geq kdis(u,v)≥k时(u,v)(u,v)(u,v)之间存在一条无向边,求k(1,2,...n)k(1,2,...n)k(1,2,...n)时图中的连通块个数 思路 前置知识:树上一点到其最远的点一定是树直径的两个端点之一若一个点…

自定义线程

每个程序至少有一个线程 —— 主线程 主线程是程序的起点,你可以从它开始创建新的线程来执行任务。为此,你需要创建自定义线程,编写在线程中执行的代码,并启动它。 通过继承创建自定义线程 创建新线程有两种主要方式:继…

2025真实面试试题分析-安卓客户端开发

以下是对安卓客户端开发工程师面试问题的分类整理、领域占比分析及高频问题精选(基于​​85道问题,总出现次数118次​​)。按技术领域整合为​​7大核心类别​​,按占比排序并精选高频问题标注优先级(1-5🌟…

算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题

拓扑排序(Topological Sorting)是一种针对有向无环图(DAG)的线性排序算法,它将图中的顶点按照一定规则排列,使得对于图中的任意一条有向边 u→v,顶点 u 都排在顶点 v 之前。拓扑排序在任务调度、…

利用Web3加密技术保障您的在线数据安全

在这个信息爆炸的数字化时代,保护个人和企业数据安全变得尤为重要。Web3技术以其去中心化和加密特性,为在线数据安全提供了新的解决方案。本文将探讨Web3技术如何通过加密技术保障您的在线数据安全,并介绍如何有效利用这些技术。 什么是Web3技…

Vue实现el-checkbox单选并回显选中

先说需求 我要在页面进行checkbox单选并回显 第一步先把基本的页面写好噢&#xff1a;vue代码&#xff1a;别忘了写change啊<el-form-item label"按钮颜色:" prop"menuColor"><el-checkbox-group v-model"buttonColor" change"bin…

动态规划--序列找优问题【1】

一、说明 动态规划似乎针对问题很多&#xff0c;五花八门&#xff0c;似乎每一个问题都有一套具体算法。其实不是的&#xff0c;动态规划只有两类&#xff1a;1&#xff09;针对图的路径问题 2&#xff09;针对一个序列的问题。本篇讲动态规划针对序列的算法范例。 二、动态规划…

独家|百度副总裁尚国斌即将离职,此前统筹百度地图;行业搜索及智能体业务总经理谢天转岗IDG

百度人事再变动。作者|文昌龙编辑|杨舟据「市象」了解&#xff0c;近期&#xff0c;百度副总裁尚国斌即将离职。公开资料显示&#xff0c;尚国斌2010年毕业于南开大学&#xff0c;2012年加入百度&#xff0c;先后在商业分析部、集团战略办、智能驾驶事业群工作。尚国斌同样也在…

Qt 网络编程进阶:HTTP 客户端实现

在 Qt 应用程序中&#xff0c;实现高性能、可靠的 HTTP 客户端是常见需求。Qt 提供了丰富的网络模块&#xff0c;包括 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 等类&#xff0c;用于简化 HTTP 通信。本文将深入探讨 Qt 网络编程中 HTTP 客户端的进阶实现&…

Python Requests-HTML库详解:从入门到实战

一、库简介 Requests-HTML是Python中集网络请求与HTML解析于一体的全能型库&#xff0c;由知名开发者Kenneth Reitz团队维护。它完美结合了Requests的易用性和Parsel的选择器功能&#xff0c;并内置JavaScript渲染引擎&#xff0c;特别适合现代动态网页抓取。最新版本&#xf…

基于springboot的小区车位租售管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

Kafka 如何优雅实现 Varint 和 ZigZag 编码

ByteUtils 是 Kafka 中一个非常基础且核心的工具类。从包名 common.utils 就可以看出&#xff0c;它被广泛用于 Kafka 的各个模块中。它的主要职责是提供一套高效、底层的静态方法&#xff0c;用于在字节缓冲区 (ByteBuffer)、字节数组 (byte[]) 以及输入/输出流 (InputStream/…