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

韩顺平零基础Java(超详细笔记梳理) 06——面向对象编程基础(上):类与对象、成员方法、传参机制、对象克隆、递归(斐波那契、迷宫、汉诺塔、八皇后)本篇文章是韩顺平老师课程 P192 P226 第 7 章 面向对象编程基础 上半部分重点内容的详细总结 内容包括 类与对象 成员方法 成员方法传参机制 克隆对象 方法递归调用 斐波那契 迷宫 汉诺塔 八皇后经典递归问题

大家好,欢迎来到IT知识分享网。


前言

从本篇开始,我们就真正接触到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; //创建 tools MyTools 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.name p2.age = p.age; //把原来对象的年龄赋给 p2.age return 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, 3 if(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. 方法递归调用

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/145400.html

(0)
上一篇 2024-11-24 16:00
下一篇 2024-11-24 16:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信