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

news2024/11/18 1:47:09

零、今日内容

一、作业
二、面向对象

一、作业

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.0
        System.out.println(color );// null
        System.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.0
        System.out.println(p1.brand );// OPPO

        System.out.println("------------" );

        // 创建第2个对象
        Phone p2 = new Phone( );
        System.out.println(p2.brand );// null
        System.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赋值给方法的参数phone
        System.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);//10
        MyClass 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);// 10
        ClassA 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);//100
        changeRef(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://www.coloradmin.cn/o/1476273.html

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

相关文章

golang 泛型详解

目录 概念 ~int vs .int 常见的用途和错误 结论&#xff1a; 概念 Go 在1.18 中添加了泛型&#xff0c;这样Go 就可以在定义时不定义类型&#xff0c;而是在使用时进行类型的定义&#xff0c;并且还可以在编译期间对参数类型进行校验。Go 目前只支持泛型方法&#xff0c;还…

无源蜂鸣器驱动实验

1.原理 计划是&#xff0c;生成不同的7个频率控制蜂鸣器发声&#xff0c;每个音调发声0.5秒。 50MHZ计数0.5秒&#xff0c;50MHZ一个周期20ns&#xff0c;要计数0.5秒 &#xff0c;0.5/0.000_000_02s25000_000个时钟周期。因为是从0开始计数&#xff0c;所以计数的最大值是0-24…

docker版本 jenkins配置gitlab自动部署

前端项目 Build steps pwd npm config set registry https://registry.npm.taobao.org npm -v node -v #npm install npm run build:prod tar -czvf QASystem.tar.gz distpwd cd /data/zhouxy37/vue_deploy tar -zxvf QASystem.tar.gz sudo mv dist QASystem cp -r QASyste…

K8S常用kubectl命令汇总(持续更新中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

NGINX的重写与反向代理机制解析

目录 引言 一、重写功能 &#xff08;一&#xff09;if指令 1.判断访问使用的协议 2.判断文件 &#xff08;二&#xff09;return指令 1.设置返回状态码 2.返回指定内容 3.指定URL &#xff08;三&#xff09;set指令 1.手动输入变量值 2.调用其它变量值为自定义变…

web学习笔记(二十二)DOM开始

目录 1.DOM简介 2.DOM树 3.DOM节点 4.查找DOM节点方法汇总 5.查找子结点的属性 5.1父子关系 5.2兄弟关系 6.几个特殊元素的查找 1.DOM简介 DOM&#xff08;Document Object Model&#xff09; 也叫页面文档对象模型&#xff0c;是W3C组织推荐的处理可扩展标记语言(HTML…

蓝桥杯第十二届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课&#xff08;点击查看&#xff09; 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十二届比赛原题 1.比赛题目 2.题目解读 蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客 二、…

TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 + GLIP视觉理解 + SAM分割技术

TV-SAM 新型零样本医学图像分割算法&#xff1a;GPT-4语言处理 GLIP视觉理解 SAM分割技术 提出背景TV-SAM 方法论 提出背景 论文&#xff1a;https://arxiv.org/ftp/arxiv/papers/2402/2402.15759.pdf 代码&#xff1a;https://github.com/JZK00/TV-SAM 利用了GPT-4的强大语…

深入理解Spring Security

第1章&#xff1a;Spring Security简介 大家好&#xff0c;我是小黑&#xff0c;在谈到网站安全的时候&#xff0c;Spring Security是个避不开的话题。它就像是个守门员&#xff0c;决定谁能进入我们的网站&#xff0c;又能在网站的哪些角落里走动。简单来说&#xff0c;Sprin…

语音合成(TTS) GPT-SoVITS认知

写在前面 小伙伴推荐&#xff0c;简单了解相对之前试过的其他的TTS项目&#xff0c;GPT-SoVITS的优点简单易用&#xff0c;文档完整&#xff0c;默认的模型效果就很好理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候…

智能驾驶控制规划理论学习02-基于搜索的路径规划算法

目录 一、路径搜索问题 二、图论基础 三、图搜索方法 1、广度优先搜索&#xff08;BFS&#xff09; bfs与dfs的区别 bfs的搜索过程 bfs的算法实现 2、迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 核心思想 优先级队列 Dijkstra搜索过程 Dijkstra优缺点…

MySQL(基础篇)——函数、约束

一.函数 1.定义 函数是指一段可以直接被另一段程序调用的程序或代码。 2.字符串函数 常见如下&#xff1a; -- 字符串拼接 SELECT CONCAT(hello,MySql) AS CONCAT -- 将字符串全部转为小写 SELECT LOWER(HEllo MYSql) AS LOWER -- 将字符串全部转为大写 SELECT UPPER(Hello…

前端mock数据 —— 使用Apifox mock页面所需数据

前端mock数据 —— 使用Apifox 一、使用教程二、本地请求Apifox所mock的接口 一、使用教程 在首页进行新建项目&#xff1a; 新建项目名称&#xff1a; 新建接口&#xff1a; 创建json&#xff1a; 请求方法&#xff1a; GET。URL&#xff1a; api/basis。响应类型&#xff1…

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写&#xff0c;可以编译为原生机器代码&#xff0c;从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码&#xff0c;多平台部署&#xff1a;Flutter可以使用一套代…

183896-00-6,Biotin-C3-PEG3-C3-NH2,可以选择性降解靶蛋白

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;183896-00-6&#xff0c;Biotin-C3-PEG3-C3-NH2&#xff0c;Biotin-C3-PEG3-C3-amine&#xff0c;生物素-C3-PEG3-C3-胺 一、基本信息 【产品简介】&#xff1a;Biotin-PEG3-C3-NH2是一种PROTAC linker&#xff0c;…

Redis在中国火爆,为何MongoDB更受欢迎国外?

一、概念 Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用ANSI C编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库。Redis是由Salvatore Sanfilippo于2009年启动开发的&#xff0c;首个版本于同年5月发布。 MongoDB MongoDB…

Apache Bench(ab )压力测试

目录 参数说明示例1&#xff1a;压力测试示例2&#xff1a;测试post接口post数据文件该如何编写&#xff1f; apr_pollset_poll: The timeout specified has expired (70007)apr_socket_recv: Connection reset by peer (104)参考 参数说明 官方文档参考这里。 ab -c 100 -n …

JVM——JVM与Java体系结构

文章目录 1、Java及JVM简介1.1、Java是跨平台的语言1.2、JVM是跨语言的平台 2、Java发展里程碑3、Open JDK和Oracle JDK4、虚拟机与JVM4.1、虚拟机4.2、JVM 5、JVM整体结构6、Java代码执行流程7、JVM的架构模型7.1、基于栈式架构的特点7.2、基于寄存器架构的特点 8、JVM的生命周…

使用pytorch实现一个线性回归训练函数

使用sklearn.dataset 的make_regression创建用于线性回归的数据集 def create_dataset():x, y, coef make_regression(n_samples100, noise10, coefTrue, bias14.5, n_features1, random_state0)return torch.tensor(x), torch.tensor(y), coef 加载数据集&#xff0c;并拆分…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向cpu提出中断处理请求&#xff0c;从而实现&#xff0c;定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ&#xff0c;…