码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • java基础4


    类、对象、方法、作用域、构造器、this关键字

    • 一、类与对象
      • 类与对象的区别和联系
      • 对象在内存中的存在形式
      • 属性/成员变量
      • 注意事项和细节
      • 如何创建对象
      • 类和对象的内存分配机制(重要)
    • 二、方法
      • 方法的调用机制(重要)
      • 成员方法的细节
      • 成员方法传参机制(重要)
      • 克隆对象
      • 方法的递归调用(栈)
      • 递归的重要规则
      • 解决递归问题:三步曲
        • 迷宫问题
        • 汉诺塔
      • 方法的重载
      • 可变参数
        • 可变参数细节(本质是数组)
    • 三、作用域
        • 作用域细节
    • 四、构造方法/构造器
      • 对象创建的流程分析
    • 五、this关键字
      • 细节

    一、类与对象

    类与对象的区别和联系

    在这里插入图片描述

    对象在内存中的存在形式

    注意:String 是引用类型,所以堆中的name和color存放的是地址,指向常量池中的常量
    在这里插入图片描述

    属性/成员变量

    注意事项和细节

    在这里插入图片描述
    在这里插入图片描述

    如何创建对象

    1、先声明再创建

    Cat cat;//声明了一个对象,在栈中,指向null
    cat = new Cat();// 在堆中开辟了一个空间,同时把栈中的引用变量cat指向堆中地址
    
    • 1
    • 2

    2、直接创建

    Cat cat = new Cat();
    
    • 1

    类和对象的内存分配机制(重要)

    在这里插入图片描述
    在这里插入图片描述

    二、方法

    方法的调用机制(重要)

    当程序执行到方法的时候会开辟一个独处的栈空间

    如:
    在这里插入图片描述

    成员方法的细节

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    成员方法传参机制(重要)

    在这里插入图片描述
    结论: 基本数据类型传递的是值传递(值拷贝),形参的任何改变不影响实参
    在这里插入图片描述
    结论: 引用类型传递的是地址(地址拷贝),可以通过形参影响实参
    在这里插入图片描述
    补充:引用数据类型分3种:类,接口,数组
    类:Object,String,Date,Void

    克隆对象

    public class test {
        public static void main(String[] args) {
            Person p = new Person();
            p.name = "aaa";
            p.age = 26;
            Mytools tools = new Mytools();
            Person p2 = tools.copy(p);
        }
    }
    
    class Person {
        String name;
        int age;
    }
    
    class Mytools {
        public Person copy(Person p) {
            Person p2 = new Person();
            //如果是 Person p2 = p;则不是拷贝一个新对象了,而是拷贝了地址
            p2.name = p.name;
            p2.age = p.age;
            return p2;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    方法的递归调用(栈)

    在这里插入图片描述

    递归的重要规则

    黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组
    doc 5星 超过95%的资源 93KB
    下载

    在这里插入图片描述

    解决递归问题:三步曲

    第一步,定义函数功能
    第二步,寻找递归终止条件
    第二步,递推函数的等价关系式

    迷宫问题

    public class test {
        public static void main(String[] args) {
            //定义迷宫,0代表无障碍,1代表有障碍,2代表能走,3代表走过走不通
            int[][] arr = new int[8][7];
            for (int i = 0; i < 7; i++) {
                arr[0][i] = 1;
                arr[7][i] = 1;
            }
            for (int i = 1; i < 7; i++) {
                arr[i][0] = 1;
                arr[i][6] = 1;
            }
            arr[2][1] = 1;
            arr[2][2] = 1;
            arr[3][2] = 1;
            arr[3][3] = 1;
    //        arr[1][2] = 1;
            Mouse mouse = new Mouse();
            mouse.findWay(arr, 1, 1);
            for (int[] i : arr) {
                for (int j : i) {
                    System.out.print(j + " ");
                }
                System.out.println("");
            }
        }
    }
    
    class Mouse {
        //定义规则,下右上左
        Boolean findWay(int[][] arr, int i, int j) {
            //递归终止条件:能走出,出口标志位为2或者四个方向都不能走标志位为3
            if (arr[6][5] == 2) {
                return true;
            } else {
                if (arr[i][j] == 0) {
                    //假定可以走通
                    arr[i][j] = 2;
                    if (findWay(arr, i + 1, j)) {
                        return true;
                    } else if (findWay(arr, i, j + 1)) {
                        return true;
                    } else if (findWay(arr, i - 1, j)) {
                        return true;
                    } else if (findWay(arr, i, j - 1)) {
                        return true;
                    } else {
                        //上下左右都不能走,则假定失败,标志位为3
                        arr[i][j] = 3;
                        return false;
                    }
                } else {
                    return false;
                }
    
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    汉诺塔

    /*上述可以看出,每次都会有将最大的一个从A移动到C的步骤。假如有n(n>1)个需要移动的盘子,我们可以将这些步骤分为3步:
    1、将1到n-1的盘子通过C的辅助从A移动到B
    2、将第n个盘子移动到C
    3、将1到n-1个盘子通过A辅助从B移动到C*/
    class HanoiTower {
        void move(int num, char a, char b, char c) {
            if (num == 1) {
                System.out.println(a + "==>" + c);
            } else {
                move(num - 1, a, c, b);
                System.out.println(a + "==>" + c);
                move(num - 1, b, a, c);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    方法的重载

    方法名相同,形参列表不同,和形参名,返回的数据类型无关,包括:

    • 个数不同
    • 类型不同
    • 顺序不同
      注意:如图,若没有直接匹配时,会出现自动类型转换,如a.max(1,2,3)也是可以的
      在这里插入图片描述

    可变参数

    在这里插入图片描述

    可变参数细节(本质是数组)

    在这里插入图片描述

    三、作用域

    04 第一个Java程序
    ppt 0星 超过10%的资源 807KB
    下载

    在这里插入图片描述
    注意: 全局变量可以没有初始值,但是局部变量必须要有初始值

    作用域细节

    注意:在方法的形参中如果传的是基本数据类型或者String则不会改变实参的值,如果传的是对象集合或数组会改变实参的值
    在这里插入图片描述
    在这里插入图片描述

    四、构造方法/构造器

    在这里插入图片描述

    在这里插入图片描述
    注意:构造器也不能写void,每个构造器都有一个默认的super()

    细节:在这里插入图片描述
    在这里插入图片描述

    对象创建的流程分析

    在这里插入图片描述
    在这里插入图片描述

    五、this关键字

    this指向当前对象
    在这里插入图片描述
    注意:不是name=this.name而是this.name = name
    在这里插入图片描述

    细节

    在这里插入图片描述

    访问成员方法,调用当前对象的某个方法
    在这里插入图片描述

    在构造器中访问另一个构造器,可以实现构造器的复用
    注意:只能在构造器中使用,this必须在第一行,
    在这里插入图片描述
    this访问本类属性
    在这里插入图片描述

  • 相关阅读:
    Java并发 | 01.进程与线程概述
    【并发编程】-1. 计算机内存架构、JAVA内存模型、Volatile关键字
    【灵魂拷问:读取 excel 测试数据真的慢吗?】
    手写raft(三) 实现日志压缩
    安卓APP源码和设计报告——智能垃圾桶
    Torch模型打包(七)
    达梦 dameng 数据库之升级打怪数据库兼容问题记录(1)
    【牛客编程题】GO语言入门46题
    YOLOv8检测obb标注hrsc数据集
    OpenCV图像处理学习十六,解析图像卷积运算原理并应用Sobel算子,Scharr算子和拉普拉斯算子(Laplance)的应用
  • 原文地址:https://blog.csdn.net/weixin_43903745/article/details/126166298
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号