Java学习笔记(第7章 P191-P263)(第8章 P264-P360)
第7章 面向对象编程(基础部分)
类与对象
-
使用现有技术解决
1)单独的定义变量解决
2)使用数组解决 -
现有技术解决的缺点分析
不利于数据的管理
效率低 -
类与对象的关系示意图
-
类和对象的区别和联系
1)类是抽象的,概念的,代表一类事物,比如人类,猫类…,即它是数据类型
2)对象是具体的,实际的,代表一个具体事物,即是实例
3)类是对象的模板,对象是类的一个个体,对应一个实例 -
对象在内存中存在形式(重要)
-
属性/成员变量
√基本介绍
1.从概念或叫法上看:成员变量 = 属性 = field(字段)(即 成员变量是用来表示属性的,授课中,统一叫属性)例如:Car(name,price,color)
2.属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类的int age就是属性
√注意事项和细节说明
1)属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;
访问修饰符:控制属性的访问范围
有四种访问修饰符 public,proctected,默认,private
2)属性的定义类型可以为任意类型,包含基本类型或引用类型
3)属性如果不赋值,有默认值,规则和数组一致。
-
如何创建对象
1.先声明再创建
Cat cat;
cat = new Cat();
2.直接创建
Cat cat = new Cat(); -
如何访问属性
√基本语法
对象名.属性名; -
类和对象的内存分配机制(重要)
√Java内存的结构分析
1.栈:一般存放基本数据类型(局部变量)
2.堆:存放对象(Cat cat,数组等)
3.方法区:常量池(常量,比如字符串),类加载信息
√Java创建对象的流程简单分析
Person p = new Person();
p.name = "jack";
p.age = 10;
1.先加载Person类信息(属性和方法信息,只会加载一次)
2.在堆中分配空间,进行默认初始化(看规则)
3.把地址赋给p,p就指向对象
4.进行指定初始化,比如p.name = “jack”; p.age = 10;
成员方法
-
基本介绍
在某些情况下,我们需要定义成员方法(简称方法)。比如人类:除了有一些属性外(年龄,姓名…),我们人类还有一些行为比如:可以说话、跑步…通过学习,还可以做算术题,这时就要用成员方法才能完成。 -
成员方法快速入门
实例:
1)添加speak 成员方法,输出 我是一个好人
2)添加cal01成员方法,可以计算从1+…+1000的结果
3)添加cal02成员方法,该方法可以接收一个数n,计算从1+…+n的结果
4)添加getSum成员方法,可以计算两个数的和 -
方法的调用机制原理(程序getSum的执行过程)
-
为什么需要成员方法
√看一个需求:
请遍历一个数组,输出数组的各个元素值。
解决思路1:传统方法,就是使用单个for循环,将数组输出(问题:相同代码的重复)
解决思路2:定义一个类MyTools,然后写一个成员方法,调用方法实现 -
成员方法的好处
√提高代码的复用性
√可以将实现的细节封装起来,然后供其他用户来调用即可。 -
成员方法的定义
-
注意事项和使用细节
√访问修饰符(作用是控制方法使用的范围)
如果不写默认访问,[有四种:public,protected,默认,private]
√返回数据类型
1.一个方法最多有一个返回值(多个值考虑使用数组)
2.返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
3.如果方法要求有返回数据类型,则方法体中最后执行语句必须为return值;而且要求返回值类型必须和return的值类型一致或兼容
4.如果方法是void,则方法体中可以没有return语句,或者只写return;
2对应实例:
class AA{
public int[] getSumAndSub(int n1,int n2){
int[] resArr = new int[2]; //创建一个数组
resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
}
√方法名
遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如 得到两个数的和getSum,开发中按照规范
√形参列表
- 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1, int n2)
- 参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int[][] map)
- 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数!【getSum】
- 方法定义时的参数称为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致!
√方法体
里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!即:方法不能嵌套定义。
√方法调用细节说明
1.同一类中的方法调用:直接调用即可。
2.跨类中的方法A类调用B类方法:需要通过对象名调用。比如对象名.方法名(参数);
3.特别说明一下:跨类的方法调用和方法的访问修饰符相关
实例:
class A{
//同一个类中的方法调用:直接调用即可
//可执行
public void print(int n){
System.out.println("print()方法被调用 n=" + n);
}
public void sayOk(){
//sayok调用 print(直接调用)
print(10);
System.out.println("继续执行sayOk()~~~~");
}
//跨类中的方法A类调用B类方法:需要通过对象名调用。比如对象名.方法名(参数);
public void m1(){
//创建B对象,然后再调用方法即可
System.out.println("m1()方法被调用");
B b = new B();
b.hi();
System.out.println("m1()继续执行");
}
}
class B{
public void hi(){
System.out.println("B类中的hi()被执行");
}
}
成员方法传参机制(!!!)
- 基本数据类型的传参机制
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参! - 引用数据类型的传参机制
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
实例:
public class MethodParameter02{
//编写一个main方法
public static void main(String[] args){
B b = new B();
//测试
Person p = new Person();
p.name = "jack";
p.age = 10;
b.test200(p);
//测试题,如果test200执行p = null;下面结果是10
//测试题,如果test200执行p = new Person();下面结果是10
System.out.println("main 的p.age=" + p.age); //如果test200执行p.age = 10000; 下面结果为10000
}
}
class Person{
String name;
int age;
}
class B{
public void test200(Person p){
//p.age = 10000;
//思考
//p = null;
//思考
p = new Person();
p.name = "tom";
p.age = 99;
}
}
方法递归调用(!!!)
-
基本介绍
递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂问题,同时可以让代码变得简洁。 -
递归能解决什么问题?
1.各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)
2.各种算法中也会使用递归,比如快排,归并排序,二分查找,分治算法等。
3.将用栈解决的问题–>递归代码比较简洁
递归调用实例:
public class Recursion01{
//编写一个main方法
public static void main(String[] args){
T t1 = new T();
t1.test(4); //输出什么?
}
}
class T{
//分析
public