循序渐进学Java笔记(Chapter07_面向对象编程[基础部分])
2024-1-24
| 2024-4-21
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
@ZZHow(ZZHow1024)
参考课程:
韩顺平 循序渐进学Java】

0193_面向对象快速入门

  • 案例:面向对象的方式解决养猫问题。
案例演示:Object.java

0194_对象内存布局

对象内存布局
对象内存布局

0195_属性概念

  • 属性 / 成员变量 介绍
  1. 从概念或叫法上看:成员变量 = 属性 = field(字段)。
  1. 属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。

0196_属性注意细节

  1. 属性的定义语法同变量。
    1. 访问修饰符 属性类型 属性名;
      访问修饰符:控制属性的访问范围。
      public、protected、默认、private.
  1. 属性的定义类型可以为任意类型,包含基本类型或引用类型。
  1. 属性如果不赋值,有默认值,规则和数组一致。

0197_创建对象访问属性

  1. 方法1:先声明再创建。
  1. 方法2:直接创建。

0198_对象分配机制

对象分配机制
对象分配机制

0199_对象创建过程

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

0201-0202_方法快速入门

  • 案例:
      1. 添加speak 成员方法,输出“我是一个好人”。
      1. 添加cal01 成员方法,可以计算从 1 + … + 1000的结果。
      1. 添加cal02 成员方法,该方法可以接收一个数n,计算从 1 + … + n 的结果。
      1. 添加getSum成员方法,可以计算两个数的和。
案例演示:Method.java

0203_方法调用机制

方法调用机制
方法调用机制
  • 方法调用小结:
  1. 当程序执行到方法时,就会开辟一个独立的空间(栈空间)。
  1. 当方法执行完毕,或者执行到 return 语句时,就会返回。
  1. 返回到调用方法的地方。
  1. 返回后,继续执行调用方法后面的代码。
  1. 当main方法(栈) 执行完毕,整个程序退出。

0205_方法的定义

  1. 形参列表:表示成员方法输入。
  1. 返回数据类型:表示成员方法输出,void 表示没有返回值。
  1. 方法主体:表示为了实现某一功能的代码块。
  1. return 语句不是必须的。

0206-0208_方法使用细节

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

0210-0212_方法传参机制

  • 基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!
  • 引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

0213_克隆对象

  • 案例:编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同。
案例演示:CloneObject.java

0214_递归解决什么问题

  1. 各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)。
  1. 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等。
  1. 将用栈解决的问题 → 递归代码比较简洁。

0215-0218_递归执行机制

notion image
  • 运行结果:
    • n = 2
      n = 3
      n = 4
  • 案例1:打印问题。
  • 案例2:计算阶乘。
案例演示:Recursion.java
  • 递归重要规则
  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。
  1. 方法的局部变量是独立的,不会相互影响,比如n变量。
  1. 如果方法中使用的是引用类型变量(比如数组、对象),就会共享该引用类型的数据.。
  1. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError。
  1. 当一个方法执行完毕,或者遇到return时,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

0219_递归斐波那契数

  • 案例:请使用递归的方式求出斐波那契数1,1,2,3,5,8,13...给你一个整数n,求出它的值是多少。
案例演示:FibonacciNumber.java

0220_猴子吃桃

  • 案例:猴子吃桃子问题,有一堆桃子,猴子第一天吃了其中的一半,每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃)发现只有1个桃子了。问题:第n(1 ≤ n ≤ 10)天共有多少个桃子?
案例演示:MonkeysEatPeaches.java

0221-0224_老鼠出迷宫

  1. 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关。
  1. 再得到小球路径时,可以先使用(下右上左)再改成(上右下左),看看路径是不是有变化。
  1. 测试回溯现象。
老鼠出迷宫
老鼠出迷宫
案例演示:Labyrinth.java

0225_汉诺塔

  • 规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
汉诺塔
汉诺塔
案例演示:HanoiTower.java

0226_八皇后

  • 问题表述:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
八皇后
八皇后
案例演示:EightEmpresses.java

0227_重载介绍

重载(OverLoad)
  • 基本介绍:
    • java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致。
      比如:System.out.println0; out是PrintStream类型。
  • 重载的好处:
      1. 减轻了起名的麻烦。
      1. 减轻了记名的麻烦。

0228_重载快速入门

  • 案例:
    • 类:MyCalculator | 方法:calculate
      calculate(int n1, int n2) // 两个int
      calculate(int n1, double n2) // 一个int,一个double
      calculate(double n1, int n2) // 一个double,一个int
      calculate(int n1, int n2, int n3) // 三个int
案例演示:OverLoad.java

0229_重载使用细节

  1. 方法名:必须相同。
  1. 形参列表:必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求)。
  1. 返回类型:无要求。

0233_可变参数使用

  • 基本概念:
    • Java允许将同一个类中多个同名同功能参数个数不同的方法,封装成一个方法就可以通过可变参数实现。
  • 基本语法:
使用可变参数时,可以当作数组来使用。
  • 案例:DnxMethod类,sum方法。要求可以计算2个数的和,3个数的和,4个数的和,5个数的和…
案例演示:VarParameter.java

0234_可变参数细节

  1. 可变参数的实参可以为 0 个或任意多个。
  1. 可变参数的实参可以为数组。
  1. 可变参数的本质就是数组。
  1. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后。
  1. 一个形参列表中只能出现一个可变参数。

0236_作用域基本使用

  1. 在Java编程中,主要的变量就是属性(成员变量)和局部变量。
  1. 我们说的局部变量一般是指在成员方法中定义的变量。
  1. Java中作用域的分类:
    1. 全局变量:也就是属性,作用域为整个类体 Cat类: cry eat 等方法使用属性。
    2. 局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中。
  1. 全局变量(属性)可以不赋值,直接使用,因为有默认值。
    1. 局部变量必须赋值后,才能使用,因为没有默认值。

0237-0238_作用域使用细节

  1. 属性和局部变量可以重名,访问时遵循就近原则。
  1. 在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
  1. 属性生命周期较长伴随着对象的创建而创建,伴随着对象的销毁而销毁。
    1. 局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用过程中。
  1. 作用域不同:
    1. 全局变量 / 属性:可以被本类使用,或其他类使用(通过对象调用)。
    2. 局部变量:只能在本类中对应的方法中使用。
  1. 修饰符不同:
    1. 全局变量 / 属性可以加修饰符。
    2. 局部变量不可以加修饰符。

0239_构造器基本介绍

  • 构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:
      1. 方法名和类名相同。
      1. 没有返回值。
      1. 在创建对象时,系统会自动的调用该类的构造器完成对对象的初始化
  • 基本语法

0240_构造器快速入门

  • 案例:在创建人类的对象时,就直接指定这个对象的年龄和姓名。[用构造方法来实现]
案例演示:Constructor.java

0241-0242_构造器使用细节

  1. 一个类可以定义多个不同的构造器,即构造器重载。
  1. 构造器名和类名要相同。
  1. 构造器没有返回值。
  1. 构造器是完成对象的初始化,并不是创建对象。
  1. 在创建对象时,系统自动的调用该类的构造方法。
  1. 如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造方法(也叫默认构造方法)。
  1. 一旦定义了自己的构造器,默认的构造器就被覆盖了就不能再使用默认的无参构造器,除非显式的定义一下。
    1. Person()
      {
      }

0244_对象创建流程详解

  1. 加载Person类信息(Person.class),只会加载一次。
  1. 在堆中分配空间(地址)。
  1. 完成对象初始化
    1. 默认初始化 age=0 name=null
    2. 显式初始化 age=90,name=null
    3. 构造器的初始化 age =20,name=小明
  1. 在对象在堆中的地址,返回给 p(p是对象名也可以理解成是对象的引用)。

0246_this入门

  • 案例:使用this解决变量命名问题(构造器中的形参不能与类的属性一样的问题)。
案例演示:This.java

0247_this本质

this本质
this本质

0248_this小结

  • 小结:哪个对象调用,this就代表哪个对象。

0249_this使用细节

  1. this关键字可以用来访问本类的属性、方法、构造器。
  1. this用于区分当前类的属性和局部变量。
  1. 访问成员方法的语法:this.方法名(参数列表);
  1. 访问构造器语法:this(参数列表); 注意只能在构造器中使用(只能在构造器中访问另外一个构造器),且必须是第一条语句。
  1. this不能在类定义的外部使用,只能在类定义的方法中使用。
  • 文字
  • 推荐
  • Java
  • 循序渐进学Java笔记(Chapter08_面向对象编程[中级部分])循序渐进学Java笔记(Chapter06_数组、排序和查找)
    Loading...
    目录