day08_面向对象基础_内存关系

零、今日内容

一、作业
二、面向对象

一、作业

package com.qf.homework;import java.util.Arrays;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/2/28* @desc*/
public class Homework {public static void main(String[] args) {test();}//写一个方法 用于合并两个int类型的数组  合并法则如下// {1,2,5,3,8,9}{1,3,0}---->// {0,1,2,3,5,8,9} (合并,去重,并排序)public static void test(){int[] arr1 = {1,2,4,5,3,8,9};int[] arr2 = {1,0,3,4,5,8,10};// 1先合并int[] arr3 = new int[arr1.length + arr2.length];//System.out.println("合并前arr3:" + Arrays.toString(arr3));System.arraycopy(arr1,0,arr3,0,arr1.length);System.arraycopy(arr2,0,arr3,arr1.length,arr2.length);//System.out.println("合并后arr3:" + Arrays.toString(arr3));// 2先排序Arrays.sort(arr3);//System.out.println("排序后arr3:" + Arrays.toString(arr3));// 3去重/*** 1)重新创建一个数组,存储去重后的元素* 2)先创建一个和数组一样长的* 3)从原数组中取值,与新数组中每个元素比较,如果不相等则存储* 4)最后如果装不满,再创建小点的数组,将元素拷贝过来*/// 创新创建新数组,存储不重复元素int[] arr4 = new int[arr3.length];int index = 0;for (int i = 0; i < arr3.length; i++) {int n = arr3[i];boolean flag = false;// 标志,false意味着不重复for (int j = 0; j < index; j++) {if (n == arr4[j]) {flag = true;// 说明有重复}}if (!flag) {arr4[index] = n;index++;}}//System.out.println("arr4中不重复的元素:"+Arrays.toString(arr4) );int[] arr5 = new int[index];System.arraycopy(arr4,0,arr5,0,index);System.out.println("arr5中不重复的元素:"+Arrays.toString(arr5) );}
}

二、面向对象编程

面向对象编程(Object Oriented Programing ) , OOP

2.1 面向对象编程介绍

C语言: 面向过程

C++语言: 半面向过程半面向对象

Java: 纯面向对象编程语言


面向过程:

  • 事无巨细全部考虑
  • 把大象装进冰箱,使用面向过程考虑
    • 冰箱怎么制作,多大冰箱?
    • 大象怎么进去?
    • 又怎么关门?
  • 吃烩面
    • 从面粉-面条-煮面-调料-吃饭…所有步骤都需要我们自己做

面向对象:

  • 事情交给对象做
  • 把大象装进冰箱,使用面向对象考虑
    • 大象是个对象,冰箱是对象
    • 调用冰箱对象开门,调用大象对象进去,调用冰箱对象关门
  • 吃烩面
    • 找一个饭店厨师对象,调用他来碗烩面,你吃就可以
    • 不需要考虑做烩面

面向对象编程到最后还得是面向过程,因为总要有人去实现这个功能,但是面向对象实现完功能后可以复用!

2.2 面向对象编程中的概念

类: 中文指种类,类别,分类,人以类聚

  • 具有相同属性和行为的一系列东西统称为类
  • 简单说: 类是模板

例如: 手机类,人类,神仙类

属性: 中文指特征,特点,形状

  • 描述一类东西特征的,一般都是名词

例如:

手机类属性: 颜色,价格,品牌

人类属性: 身高,体重,年龄,性别

行为: 就是动作

  • 行为就是方法,能执行出一些效果

例如:

手机行为: 打电话,发短信

人类行为: 吃饭,睡觉,敲代码

对象:

  • 是类的具体体现,是一个实物
  • 对象会将类的属性和行为具体体现出来

人类的对象: 具体的人,比如你的同桌(他身高180,体重180,年龄18,他会吃饭,睡觉)

类,属性,方法,对象之间什么关系?

  • 类里面有属性和方法
  • 类创建出对象,对象由类创建(对象是类的实例)
  • 对象有属性和方法,且能表现出来

2.3 第一个类

类名要求见名知意,

  • 创建手机类
    • 有属性品牌,价格,颜色 (属性就是变量)
    • 有行为打电话,打游戏 ( 行为就是方法)
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/2/28* @desc 手机类*/
public class Phone {// 类中有属性和方法// 属性就是变量/*** 属性需要写在类中方法外,写法* [访问修饰符] 数据类型 属性名;* 访问修饰符可写可不写,目前写的话就写public*/public double price;String brand;// 品牌String color;/*** 定义方法,在类中定义的方法不要加static* 其他与之前学的方法一模一样*/// 打电话public void call(String phoneNum){System.out.println("打电话给"+phoneNum );}// 打游戏public void play() {System.out.println("打游戏" );}
}

练习: 创建英雄类

  • 有属性: 血量,等级,类型
  • 有行为: 攻击
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/2/28* @desc 英雄类*/
public class Hero {int hp;// 血量int lv; // 等级String type;// 类型public void attack(){System.out.println("攻击" );}
}

2.4 创建对象

由类创建对象,语法是: 类名 对象名 = new 类名();

package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/2/28* @desc 测试创建对象*/
public class TestOOP1 {public static void main(String[] args) {// 数据类型 变量 = 值;// 类名 对象名 = new 类名();Phone phone = new Phone();Hero hero = new Hero();}
}

2.5 操作属性和方法

对象创建完就可以使用对象调用属性和方法

  • 可以获得属性,给属性赋值
  • 调用调用方法,使其执行
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/2/28* @desc 测试创建对象*/
public class TestOOP1 {public static void main(String[] args) {// 数据类型 变量 = 值;// 类名 对象名 = new 类名();Phone phone = new Phone();Hero hero = new Hero();/*** 通过对象调用属性和方法*/// 获得属性值// 对象名.属性// 刚创建的对象,属性都是默认值double price = phone.price;String color = phone.color;String brand = phone.brand;System.out.println(price );// 0.0System.out.println(color );// nullSystem.out.println(brand );// 属性赋值// 对象.属性 = 值;phone.price = 3000.0;phone.color = "黑色";phone.brand = "HUAWEI";System.out.println(phone.brand );System.out.println(phone.price );System.out.println(phone.color );// 对象调用方法// 对象名.方法();// 有参数要传实参,有返回值可以接收phone.call("110");phone.play();}
}

练习: 创建Hero类对象,给属性赋值,输出属性值,调用方法执行

2.6 类可以创建多个对象

  • 一个类可以创建多个对象

  • 对象和对象之间没有关系

  • 每个对象都拥有属于自己的属性和方法

public class TestOOP2 {public static void main(String[] args) {/**** - 一个类可以创建多个对象* - 对象和对象之间没有关系* - 每个对象都拥有属于自己的属性和方法*///// 创建第1个对象Phone p1 = new Phone();p1.brand = "OPPO";p1.price = 2999.0;System.out.println(p1.price );// 2999.0System.out.println(p1.brand );// OPPOSystem.out.println("------------" );// 创建第2个对象Phone p2 = new Phone( );System.out.println(p2.brand );// nullSystem.out.println(p2.price );// 0.0// p1和p2对象没有任何关系// p1和p2对象都有属于自己的属性和方法}
}

2.7 多个引用指向一个对象

public static void main(String[] args) {Phone p1 = new Phone( );Phone p2 = p1;/*** 此时,p1和p2都是引用* 且都指向一个对象*/p1.price = 3999.0;System.out.println(p2.price );// 3999}

image-20240228154022039

应用场景: 类当做方法参数,调用时传递对象

    public static void main(String[] args) {// 方法的参数列表是类时候,传入对象Phone p3 = new Phone( );test(p3);// p3赋值给方法的参数phoneSystem.out.println(p3.brand );// 锤子System.out.println(p3.price );// 1999.0}// 当方法的参数列表是类名时,如何调用?public static void test(Phone phone) {// phone和上面的p3指向同一个对象phone.brand = "锤子";phone.price = 1999.0;}
}

三、对象内存

3.1 一个对象内存

  • 代码是先编写后编译
  • 执行时类加载进内存
  • 方法执行进栈
  • new的对象都会进堆
  • 堆中创建对象时
    • 开辟空间
    • 分配地址
    • 属性和方法初始化(初始值)
  • 使用对象名调用属性和方法时,其实是通过地址值找到堆中的对象中的属性和方法

image-20240228150018270

3.2 多个对象内存图

一个类创建出多个对象,内存展示

  • 一个类可以创建多个对象

  • 对象和对象之间没有关系

  • 每个对象都拥有属于自己的属性和方法

image-20240228151057465

四、成员变量和局部变量

所谓成员,是指类的成员,即类中方法外称为成员

所谓局部,是指类中的方法内

成员变量(属性)局部变量
位置类中方法外方法内
作用域类中的所有方法只能在当前方法内使用
内存位置在堆中的对象中在栈中的方法里面
初始化时机new时赋默认值方法调用时赋值

image-20240228161346272

特殊的,局部变量可以和成员变量重名,重名时,默认方法内使用自己的局部变量

就近原则

但是,当重名时,就指定使用成员变量,可以使用this来指代,因为this是当前类对象

image-20240228161219732

五、练习

T1: 请写出编译运行后的结果。

class MyClass{int value;
}
public class TestRef{public static void main(String args[]){int a = 10;int b = a;b++ ;System.out.println(a);//10MyClass mc1 = new MyClass();mc1.value = 10;MyClass mc2 = mc1;mc2.value ++;System.out.println(mc1.value);//11}
}
思考:

T2: 编译运行TestReturnRef 程序,结果为:

class ClassA{int value = 10;
}
public class TestReturnRef{public static void main(String args[]){ClassA ca = new ClassA();ca = getObject();ca = getObject();ca = getObject();System.out.println(ca.value);}public static ClassA getObject(){ClassA newObject = new ClassA();newObject.value += 10;return newObject;}
}
思路:

T3:

class ClassA{int value;
}
public class TestClassA{public static void main(String args[]){int value = 10;changeInt(value);System.out.println(value);// 10ClassA ca = new ClassA();ca.value = 10;changeObject(ca);System.out.println(ca.value);// 11}public static void changeInt(int value){value++;}public static void changeObject(ClassA ca){ca.value++;}
}
思路

T4:

class ClassA{int value;
}
public class ChangeRef{public static void main(String args[]){ClassA ca = new ClassA();changeValue(ca);System.out.println(ca.value);//100changeRef(ca);System.out.println(ca.value);// 100}public static void changeValue(ClassA ca){ca.value = 100;}public static void changeRef(ClassA ca){ca = new ClassA();ca.value = 200;}
}

// 调用changeValue方法时内存

image-20240228165534817

// 调用changeRef方法时内存

image-20240228165521070

// 方法执行完后

image-20240228165621997

补充

一个类文件中只能有一个public修饰的类

六、总结

  1. 会创建类(定义属性,方法)
  2. 会创建对象
  3. 会调用属性和方法
  4. 理解内存图
    1. 创建一个对象
    2. 创建多个对象
    3. 对象和对象之间关系

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

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

相关文章

事件驱动的奇迹:深入理解Netty中的EventLoop

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 事件驱动的奇迹&#xff1a;深入理解Netty中的EventLoop 前言基础概念EventLoop的工作原理Channel与EventLoop的关系定时任务与延时任务EventLoop的生命周期EventLoop中的线程模型性能优化与最佳实践 …

minikube windows 下载安装

下载地址 https://multipass.run/ 选择版本 下载结果 安装就是持续的下一步&#xff0c;安装后的效果 打开后的效果

【数据结构】从链表到LinkedList类

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

5.WEB渗透测试-前置基础知识-常用的dos命令

内容参考于&#xff1a; 易锦网校会员专享课 上一篇内容&#xff1a;4.WEB渗透测试-前置基础知识-快速搭建渗透环境&#xff08;下&#xff09;-CSDN博客 常用的100个CMD指令 1.gpedit.msc—–组策略 2. sndrec32——-录音机 3. Nslookup——-IP地址侦测器 &#xff0c;是一个…

Vue.js实战:构建一个简单的学生管理系统

摘要&#xff1a; 本文将引导你使用Vue.js框架来构建一个完整的学生管理系统。我们将从环境搭建开始&#xff0c;逐步介绍Vue的核心概念、组件创建、数据管理、事件处理、路由配置以及项目构建等关键步骤。通过实际操作&#xff0c;你将能够掌握Vue.js的基础知识&#xff0c;并…

搭建XSS 测试平台

XSS 测试平台是测试XSS漏洞获取cookie并接收Web 页面的平台&#xff0c;XSS 可以做 JS能做的所有事&#xff0c;包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进 行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP 地址)等。这 里使用的是基于x…

Linux:Kubernetes(k8s)——基础理论笔记(1)

我笔记来源的图片以及共享至GitHub&#xff0c;本章纯理论。这是k8s中部分的基础理论 &#x1f447; KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf&#x1f446; 什么是kubernetes kubernetes 是一个开源的&#xff0c;用于管…

Unity中的UI系统之GUI

目录 概述工作原理和主要作用基础控件重要参数及文本和按钮多选框和单选框输入框和拖动条图片绘制和框 复合控件工具栏和选择网络滚动视图和分组窗口 自定义整体样式自定义皮肤样式 概述 什么是UI系统 UI是User Interface&#xff08;用户界面&#xff09;的简称&#xff0c;用…

【基于React实现共享单车管理系统】—项目简介(一)

【基于React实现共享单车管理系统】—项目简介&#xff08;一&#xff09; 一、项目整体架构

探索 Sora 背后的核心技术

2024年2月16日&#xff0c;OpenAI发布Sora文生视频模型&#xff0c;一石激起千层浪&#xff0c;迅速刷屏爆火于整个AI圈。一方面&#xff0c;Sora从文本、图像迈向视频大模型&#xff0c;这可以说是通向通用人工智能的里程碑事件&#xff1b;另一方面&#xff0c;训练和推理需求…

基于Python网络爬虫的IT招聘就业岗位数据分析可视化推荐系统

文章目录 基于Python网络爬虫的IT招聘就业岗位数据分析可视化推荐系统项目概述招聘岗位数据爬虫分析系统展示用户注册登录系统首页IT招聘数据开发岗-javaIT招聘数据开发岗-PythonIT招聘数据开发岗-AndroidIT招聘数据开发岗-其它招聘岗位数据分析算法方面运维方面测试方面招聘岗…

Linux学习之system V

目录 一&#xff0c;system V共享内存 快速认识接口 shmget(shared memory get) shmat(shared memory attach) shmdt(shared memory delete) shmctl (shared memory control) 编写代码 综上那么共享内存与管道通信有什么区别&#xff1f; system v消息队列 system v信号…

08 MyBatis之查询专题(返回对象/Map/List封装Map/Map封装Map)+列名与属性名映射的三种方法

准备: INSERT INTO t_car (id, car_num, brand, guide_price, produce_time, car_type) VALUES (165, 6666, 丰田霸道, 32.00, 2020-11-11, 燃油车); INSERT INTO t_car (id, car_num, brand, guide_price, produce_time, car_type) VALUES (166, 1202, 大众速腾, 30.00, 2020…

搜维尔科技:AR/VR技术对制造业劳动力危机的影响

借助 AR/VR 的力量缩小现代制造业的技能差距 数字化转型仍然是企业的首要任务&#xff0c;其许多方面都需要人工干预。然而&#xff0c;推动此类举措所需的技术工人日益短缺。这就造成了我们所说的“制造业劳动力危机”。 了解以下详情&#xff1a; 制造业用工危机正在影响产…

算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)

算法沉淀——动态规划之回文串问题 01.回文子串02.最长回文子串03.分割回文串 IV04.分割回文串 II05.最长回文子序列06.让字符串成为回文串的最少插入次数 01.回文子串 题目链接&#xff1a;https://leetcode.cn/problems/palindromic-substrings/ 给你一个字符串 s &#xf…

Android 架构MVI、MVVM、MVC、MVP

目录 一、MVC&#xff08;Model-View-Controller&#xff09; 二、 MVP&#xff08;Model-View-Presenter&#xff09; 三. MVVM&#xff08;Model-View-ViewModel&#xff09; 四. MVI&#xff08;Model-View-Intent&#xff09; 五.MVI简单实现 先简单了解一下MVC、MVP和…

LabVIEW磁阻自动优化测量系统

LabVIEW磁阻自动优化测量系统 介绍了一种基于LabVIEW开发的磁阻自动优化测量系统&#xff0c;通过自动优化测试分辨率和高度模块化设计&#xff0c;大幅提升磁阻测试的效率和准确性。系统采用功率电源、电磁铁、高分辨率特斯拉计、步进电机转动器、精密电流源与精准电压表等硬…

ruoyi框架学习

RBAC模型 数据字典 拦截器 token没有&#xff0c;submit&#xff0c;request.js中&#xff0c;前端前置拦截器&#xff0c;响应拦截器 后台 注解

Word | 论文使用 Springer LNICST 工具包进行格式化

目录 Step1&#xff1a;下载 Springer LNICST 工具包 Step2&#xff1a;导入宏文件 Step3&#xff1a;处理导入失败&#xff08;大概意思是这个宏不安全&#xff09; Step4&#xff1a;导入成功并使用 Step1&#xff1a;下载 Springer LNICST 工具包 会议官网的 SUBMISSIO…

当你使用ChatGPT时,选择合适的提示(prompt)是引导对话方向的关键

马斯克曾说&#xff0c;人生中最重要的事情&#xff0c;就是提出真正的好问题。 因此&#xff0c;我要开始接触某个新领域&#xff0c;并且开始要自主学习的时候&#xff0c;我首先要问自己这个问题&#xff1a; 我为什么要学这个&#xff0c;学这个的目的是为了创造什么&#…