文章目录
- 前言
- 一、类与对象
- 1. 类与对象的概述
- 2. 快速入门(用面向对象的方式解决问题)
- 3. 对象在内存中的存在形式(重要)
- 4. 属性
- 5. 类与对象的内存分配机制
- 二、成员方法
- 1. 基本介绍
- 2. 快速入门
- 3. 方法调用机制原理(重点)
- 4. 基本语法
- 5. 细节
- 三、成员方法传参机制(Parameter 参数)
- 四、克隆对象
- 五、方法递归调用(Rcursion)
- 1. 介绍
- 2. 执行机制理解
- 3. 重要规则
- 4. 斐波那契数、老鼠迷宫、汉诺塔、八皇后
- 总结
前言
从本篇开始,我们就真正接触到Java的核心——面向对象,我们的java学习之路也算是正式踏上旅途,所以本章的所有概念和内容都十分重要,特别是其中的思想一定要好好领悟。
受篇幅限制,面向对象的笔记我分成了上下部分,本篇文章是韩顺平老师课程P192-P226(第7章:面向对象编程基础)上半部分重点内容的详细总结。
- 类与对象
- 成员方法
- 成员方法传参机制
- 克隆对象
- 方法递归调用
一、类与对象
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
访问修饰符 属性类型 属性名;
- 访问修饰符:控制属性的访问范围, 有四种访问修饰符 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 ;
//声明对象 catcat = 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章:面向对象编程基础)上半部分重点内容的详细总结。
- 类与对象
- 成员方法
- 成员方法传参机制
- 克隆对象
- 方法递归调用