从零开始学Java(超详细韩顺平老师笔记梳理)06——面向对象编程基础(上):类与对象、成员方法、传参机制、对象克隆、递归(斐波那契、迷宫、汉诺塔、八皇后)

文章目录

  • 前言
  • 一、类与对象
    • 1. 类与对象的概述
    • 2. 快速入门(用面向对象的方式解决问题)
    • 3. 对象在内存中的存在形式(重要)
    • 4. 属性
    • 5. 类与对象的内存分配机制
  • 二、成员方法
    • 1. 基本介绍
    • 2. 快速入门
    • 3. 方法调用机制原理(重点)
    • 4. 基本语法
    • 5. 细节
  • 三、成员方法传参机制(Parameter 参数)
  • 四、克隆对象
  • 五、方法递归调用(Rcursion)
    • 1. 介绍
    • 2. 执行机制理解
    • 3. 重要规则
    • 4. 斐波那契数、老鼠迷宫、汉诺塔、八皇后
  • 总结


前言

从本篇开始,我们就真正接触到Java的核心——面向对象,我们的java学习之路也算是正式踏上旅途,所以本章的所有概念和内容都十分重要,特别是其中的思想一定要好好领悟。

受篇幅限制,面向对象的笔记我分成了上下部分,本篇文章是韩顺平老师课程P192-P226(第7章:面向对象编程基础)上半部分重点内容的详细总结。

  1. 类与对象
  2. 成员方法
  3. 成员方法传参机制
  4. 克隆对象
  5. 方法递归调用

一、类与对象

1. 类与对象的概述

  • 一个程序就是一个世界,这个世界里有很多事物(对象),每个对象都有自己的属性和行为
  • 例如:我们假设把小狗看作一个对象,那么它有:
    • 属性:性别、品种、年龄、体重…
    • 行为:进食、叫、跑…
  • 类与对象关系示意图
    在这里插入图片描述

2. 快速入门(用面向对象的方式解决问题)

public class Object {public static void main(String[] args) {//3.实例化一只猫 创建一只猫//4.把创建的猫赋给 cat1(对象)Cat cat1 = new Cat();cat1.name = "小白";cat1.age = 3;cat1.color = "白色";Cat cat2 = new Cat();cat2.name = "小花";cat2.age = 100;cat2.color = "花色";//使用System.out.println("第一只猫的信息:" + cat1.name + " " + cat1.age + " " + cat1.color);System.out.println("第二只猫的信息:" + cat2.name + " " + cat2.age + " " + cat2.color);}
}
//1.定义一个猫类
class Cat {//2.属性 名字,年龄,颜色String name;int age;String color;
}

3. 对象在内存中的存在形式(重要)

  • 对象和数组一样,都是引用类型,所以在jvm中都是一个地址
  • 三个属性,所以在堆中cat类地址下有三个区域(分配空间)
  • 字符串本质上是引用类型,以地址形式存放在堆中
    • 存放“小白”和“白色”这两个数据的地方是方法区的常量池里面
  • 年龄是基本数据类型,所以直接存放在堆中
  • 同时会在方法区中加载cat类的信息,包括这个cat类中的各种属性信息和方法信息
    在这里插入图片描述

4. 属性

  • 概念
    • 属性也叫做成员变量filed(字段)
    • 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)
      在这里插入图片描述
  • 细节
    • 属性的定义语法与变量一样,只是在前面会多一个访问修饰符(后期讲到包的时候讲)
      • 访问修饰符:控制属性的访问范围, 有四种访问修饰符 public, proctected, 默认, private
        访问修饰符 属性类型 属性名;
    • 属性的定义类型可以为任意类型,包含基本类型或引用类型
    • 属性如果不赋值,有默认值,规则和数组一致。
      int-0,short-0, byte-0, long-0, float-0.0, double-0.0
      char-\u0000,boolean-false,String-null
  • 理解:p1只是这个对象的名字(代词),真正的对象其实是new person()语句所创建的空间
    在这里插入图片描述
  • 创建对象访问属性
    • 如何创建对象
      • 先声明再创建
        • Cat cat ; //声明对象 cat
        • cat = new Cat(); //创建
      • 直接创建
        • Cat cat = new Cat();
    • 访问属性
      • 对象名.属性名 cat.name;

5. 类与对象的内存分配机制

  • Java 内存的结构分析
    • 栈: 一般存放基本数据类型(局部变量)
    • 堆: 存放对象(Cat cat , 数组等)
    • 方法区:常量池(常量,比如字符串), 类加载信息(只会加载一次)
  • Java 创建对象的流程简单分析
    • 1.先加载Person类信息(方法区)
    • 2.在堆中分配空间,进行默认初始化
    • 3.把地址赋给p,p就指向对象
    • 4.进行指定初始化
      在这里插入图片描述
      在这里插入图片描述

这里附上老韩对象机制练习视频,大家可以跟着练习一下,加深理解。

二、成员方法

1. 基本介绍

  • 在某些情况下,我们要需要定义成员方法(简称方法)
  • 例如人类:除了有一些属性外( 年龄,姓名…),还有一些行为,比如:可以说话、跑步…通过学习,还可以做算术题。
  • 实现对象的行为,要用成员方法才能完成。
  • 优点
    • 提高代码的复用性
    • 可以将实现的细节封装起来,然后供其他用户来调用即可

2. 快速入门

现在要求对 Person 类完善:添加 speak 成员方法,输出 “我是一个好人”
在这里插入图片描述

3. 方法调用机制原理(重点)

在这里插入图片描述

4. 基本语法

访问修饰符 返回数据类型 方法名(形参列表..{//方法体 语句; return 返回值; 
}

在这里插入图片描述

  • 形参列表:表示成员方法输入 cal(int n) ,getSum(int num1, int num2)
  • 返回数据类型:表示成员方法输出, void 表示没有返回值
  • 方法主体:表示为了实现某一功能代码块
  • return 语句不是必须的
    • 如果有具体的返回数据类型,要用return

5. 细节

  • 访问修饰符 (作用是控制 方法使用的范围) 如果不写默认访问,[有四种: public, protected, 默认, private]
  • 返回数据类型
    • 一个方法最多有一个返回值(如果要返回多个,用数组)
      在这里插入图片描述
    • 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
    • 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; 而且要求返回值类型必须和 return 的值类型一致或兼容
    • 如果方法是 void,则方法体中可以没有 return 语句,或者只写 return ;
  • 方法名
    • 遵循驼峰命名法,最好见名知义,表达出该功能的意思即可, 比如:得到两个数的和 getSum, 开发中按照规范
  • 参数列表
    • 一个方法可以没有参数,也可以有多个参数,中间用逗号间隔
    • 参数类型可以为任意类型,包含基本类型或者引用类型
    • 调用自带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
    • 方法定义时的参数叫做形式参数,简称形参;方法调用时的传入参数成为实际参数,简称实参,实参和形参的类型一定要一致或者兼容,个数、顺序必须一致
  • 方法体
    • 里面写完成功能的具体语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法
  • 方法调用
    • 同一个类中的方法调用:直接调用即可
      在这里插入图片描述
    • 跨类中的方法A类调用B类方法:需要通过对象名调用
      在这里插入图片描述

三、成员方法传参机制(Parameter 参数)

(这个地方非常重要,文字会比较抽象,建议看一遍老韩的讲解视频)

  • 基本数据类型的传参机制
    • 传递的是值(值拷贝),形参不影响实参
public class Method {public static void main(String[] args) {int a = 10;int b = 20;Exerices aa = new Exerices();aa.swap(a, b); //这里的a, b与方法里的a, b不冲突System.out.println("a=" + a + "\tb=" + b); //a = 10; b = 20;}
}class Exerices {public void swap(int a, int b) {System.out.println("a=" + a + "\tb=" + b); // a = 10; b = 20;int tmp  = a;a = b;b = tmp;System.out.println("a=" + a + "\tb=" + b); // a = 20; b = 10;}}
  • 引用数据类型的传参机制
    • 引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
public class Method {public static void main(String[] args) {B b = new B();int[] arr = {1, 2, 3};b.test100(arr);for(int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " "); //200, 2, 3}System.out.println();}
}class B {public void test100(int[] arr) {arr[0] = 200; //修改元素//遍历数组for(int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " "); //200, 2, 3}System.out.println();}
}

四、克隆对象

案例:编写一个方法 copyPerson,可以复制一个 Person 对象,返回复制的对象。克隆对象,注意要求得到新对象和原来的对象是两个独立的对象(地址不同),只是他们的属性相同

public class MethodExercise02 {//编写一个 main 方法public static void main(String[] args) {Person p = new Person();p.name = "milan";p.age = 100;//创建 toolsMyTools tools = new MyTools();Person p2 = tools.copyPerson(p);//到此 p 和 p2 是 Person 对象,但是是两个独立的对象,属性相同System.out.println("p 的属性 age=" + p.age + " 名字=" + p.name);System.out.println("p2 的属性 age=" + p2.age + " 名字=" + p2.name);//这里老师提示: 可以同 对象比较看看是否为同一个对象System.out.println(p == p2);//false}
}class Person {String name;int age;
}class MyTools {//编写方法的思路//1. 方法的返回类型 Person//2. 方法的名字 copyPerson//3. 方法的形参 (Person p)//4. 方法体, 创建一个新对象,并复制属性,返回即可public Person copyPerson(Person p) {//创建一个新的对象Person p2 = new Person();p2.name = p.name; //把原来对象的名字赋给 p2.namep2.age = p.age; //把原来对象的年龄赋给 p2.agereturn p2;}
}

五、方法递归调用(Rcursion)

(建议这个地方看一看老韩递归机制讲解视频,光看例子会比较抽象)

1. 介绍

递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变 得简洁

2. 执行机制理解

  • 打印问题例子
    在这里插入图片描述
    在这里插入图片描述

  • 阶乘问题例子
    在这里插入图片描述
    在这里插入图片描述

3. 重要规则

  • 执行一个方法时,就会创建一个新的受保护的独立空间(栈空间)
  • 方法的局部变量是独立的,不会相互影响,比如n变量
  • 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据
  • 递归必须向退出递归的条件逼近,否则就是无限递归
  • 当一个方法执行完毕,或者遇到了Return,就会返回,遵守:谁调用,就将结果返回给谁。同时当方法执行完毕或者返回时,该方法也就执行完毕(栈空间消失)

4. 斐波那契数、老鼠迷宫、汉诺塔、八皇后

(由于篇幅问题,只放斐波那契数实现代码,剩下的三个问题我会放上老韩的视频讲解和我的三篇专门分析文章,感兴趣的朋友可以点击连接查看。)
零基础学Java——递归应用:迷宫问题 保姆级思路分析和步骤详解(附上完整源代码)

  • 用递归的方式求出斐波那契数:1, 1, 2, 3, 5, 8, 13… 给出一个整数n,求出值是多少
class Recursion {public static void main(String[] args) {T t1 = new T();int res = t1.fbnq(7);System.out.println(res); //13}
}class T {public int fbnq(int n) {//n = 1, 1//n = 2, 1//n = 3, 2//n = 4, 3if(n == 1 || n == 2){return 1;}else {return (fbnq(n - 1) + fbnq(n - 2));}}
}
  • 老鼠出迷宫老韩视频讲解
    这里附上我对于该问题初步拆解细化的专题文章:零基础学Java——递归应用:迷宫问题 保姆级思路分析和步骤详解(附上完整源代码)
    在这里插入图片描述

  • 汉诺塔
    在这里插入图片描述

  • 八皇后
    在这里插入图片描述


总结

从本篇开始,我们就真正接触到Java的核心——面向对象,我们的java学习之路也算是正式踏上旅途,所以本章的所有概念和内容都十分重要,特别是其中的思想一定要好好领悟。

受篇幅限制,面向对象的笔记我分成了上下部分,本篇文章是韩顺平老师课程P192-P226(第7章:面向对象编程基础)上半部分重点内容的详细总结。

  1. 类与对象
  2. 成员方法
  3. 成员方法传参机制
  4. 克隆对象
  5. 方法递归调用

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

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

相关文章

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户&#xff0c;包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为&#xff0c;需要提前获取用户授权&#xff0c;或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…

【JavaEE初阶】线程的概念及创建

目录 &#x1f4d5; 前言 &#x1f4d5; 认识线程&#xff08;Thread&#xff09; &#x1f6a9; 概念 &#x1f60a;线程是什么 &#x1f642; 为啥要有线程 &#x1f62d; 进程和线程的区别&#xff08;面试题重点&#xff09; &#x1f92d; Java的线程和操作系统线程…

MyBatis-Plus的基本使用(一)

目录 前言 特性 MyBatis-Plus入门案例 常用注解 小结 前言 这篇文章主要来学习MyBatis-Plus这个非常强大的框架. 在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#x…

Leetcode3216. 交换后字典序最小的字符串

Every day a Leetcode 题目来源&#xff1a;3216. 交换后字典序最小的字符串 解法1&#xff1a;模拟 找到第一个 s[i] > s[i 1]&#xff0c;且它们奇偶性相同&#xff0c;交换它们。 代码&#xff1a; /** lc appleetcode.cn id3216 langcpp** [3216] 交换后字典序最小…

Efficient and Effective Weakly-Supervised Action Segmentation via ATBA

**基于动作转移感知边界对齐的高效弱监督动作分割**介绍 动作分割的目的是将一个长的未裁剪的视频分割成几个片段&#xff0c;并将每个片段分类为一个动作类别&#xff0c;如下图所示&#xff1a; 弱监督动作分割 现有的训练方法大多需要通过对所有帧和文本进行序列比对来…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

笔记小结:现代卷积神经网络之批量归一化

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;&#xf…

Dav_笔记10:Using SQL Plan Management之3

将SQL计划基准与SQL Tuning Advisor一起使用 使用SQL Tuning Advisor调整SQL语句时&#xff0c;如果顾问程序找到调优计划并验证其性能优于从相应SQL计划基准中选择的计划&#xff0c;则建议接受SQL配置文件。 接受SQL配置文件后&#xff0c;数据库会将调整后的计划添加到相应…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

云仓如何改变传统仓储模式?

云仓&#xff0c;即云仓储&#xff0c;是一种基于互联网技术的现代仓储模式&#xff0c;与传统的仓储模式相比&#xff0c;它在多个方面进行了创新和优化&#xff0c;包括&#xff1a; ———————————————————— 1、数据管理与实时监控&#xff1a; 云仓储利…

Element-ui :el-table 中表尾合计行

Table 表格 | Element Plus <template><el-table :data"tableData" border show-summary :summary-method"getSummariesss" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

C++与lua联合编程

C与lua联合编程 一、环境配置二、lua基本语法1.第一个lua和C程序2.基本数据类型和变量2.1 Nil2.2 Booleans2.3 Numbers2.4 String(最常用) 3. 字符串处理3.1 错误处理3.2 字符串长度:string.len3.3 字符串子串 :string.sub3.4 字符串查找: string.find3.5字符串替换: string.gs…

【笔记】ubuntu 误退了搜狗输入法:终端上输入fcitx即可重启

有时候&#xff0c;我们可能嫌弃ubuntu上的搜狗输入法&#xff0c;点击了退出&#xff1a; 但是当我们想开启搜狗输入法时&#xff0c;发现它消失了&#xff0c;此时我们可以打开终端&#xff0c;键入&#xff1a; fcitx 即可成功开启。

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合

全国区块链职业技能大赛国赛考题前端功能开发

任务3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件login.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下: 具体要求如下: (1)有明确的提示,提示用户选择角色; (2)用户可看…

微服务安全——OAuth2详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

用51单片机或者stm32能否开发机器人呢?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;能的。但是由于单片机和st…

百度,有道,谷歌翻译API

API翻译 百度&#xff0c;有道&#xff0c;谷歌API翻译&#xff08;只针对中英相互翻译&#xff09;,其他语言翻译需要对应from&#xff0c;to的code 百度翻译 package fills.tools.translate; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis…

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题&#xff0c;关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…

axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个&#xff0c;一是设置全局config,比如请求的基础路径&#xff0c;超时时间等&#xff0c;第二点是在每次…