第七章 :类与对象
类与对象的关系
![类与对象的关系](https://i-blog.csdnimg.cn/blog_migrate/0b427894f8b364e9540f719defd4aec9.png)
对象内存分配机制
![对象内存分配机制](https://i-blog.csdnimg.cn/blog_migrate/55e33f146c0011b21c49fd4567813f1d.png)
属性和注意细节
概念:属性又称成员变量、字段
如何创建对象和访问属性
1.创建对象:
(1):先声明再创建
Cat cat;
cat = new Cat();
(2):直接创建
Cat cat = new Cat();
2.访问属性:
对象名.属性名
方法调用机制
![方法调用机制](https://i-blog.csdnimg.cn/blog_migrate/39bdcf8b075a532e4d3316ab655d10e1.png)
方法注意细节
注意细节:
(1):返回类型可以为任何类型,包含基本类型和引用类型(数组、对象)
(2):如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值,且返回值类型与return的值类型一致或兼容
(3):方法不能嵌套定义
方法传参机制
基本数据类型传参机制
![基本数据类型传参机制](https://i-blog.csdnimg.cn/blog_migrate/5cf8838bb34c6861656639f91355bbfb.png)
结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
引用数据类型传参机制
![引用数据类型传参机制](https://i-blog.csdnimg.cn/blog_migrate/63606234f3fe74cd7008fb80f00b405e.png)
结论:引用类型,传递的是地址(传递也是值,但值是地址),可以通过形参影响实参
递归
概念:方法自己调用自己,每次调用时传入不同的变量
过程:
(1):递归
(2):回溯
递归练习
打印
阶乘
桃子问题
斐波那契数列
import java.util.Scanner;
public class fibonaqi {
public static void main(String[] args){
System.out.println("请输入想要知道的斐波那契数列的第多少项:");
Scanner reader = new Scanner(System.in);
int num = reader.nextInt();
double sum = fibonaqi1(num);
System.out.println("斐波那契数列第" + num + "项的值为:" + sum);
}
static double fibonaqi1(int num){
if(num == 1|num == 2){
return 1;
}else{
return fibonaqi1(num - 1) + fibonaqi1(num - 2);
}
}
}
迷宫问题
汉诺塔
public class hannuota {
public static void main(String[] args){
int num = 5;
char a = 'A',b = 'B',c = 'C';
hannuota1(5,a,b,c);
}
static void hannuota1(int num,char a,char b,char c){
if(num == 1){
System.out.println(a + "-->" + b);
}else{
hannuota1(num - 1,a,c,b);
System.out.println(a + "-->" + b);
hannuota1(num -1 ,b,a,c);
}
}
}
八皇后
方法重载以及细节
同名不同参(参数类型、个数、顺序不同)
注意细节:
(1):方法名相同
(2):形参不同
(3):返回类型无要求
可变参数以及细节
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。(通过可变参数实现)
简单来说:形参可以传入0个或多个,以数组形式存在
语法:
访问修饰符 返回类型 方法名(数据类型...形参名){
}
注意细节:
(1):可变参数的实参可以为0个或任意多个
(2):可变参数的实参可以为数组
(3):可变参数的本质就是数组
(4):可变参数可以和普通类型的参数一起放在形参列表,但需保证可变参数在最后
(5):一个形参列表中只能出现一个可变参数
作用域以及细节
作用域的分类:
(1):全局变量:属性,作用域为整个类体,声明周期较长
(2):局部变量:除了属性之外的其他变量,作用域为定义它的代码块,生命周期较短
注意细节:(1):全局变量(属性)可以不赋值,有默认值
局部变量必须赋值后使用,没有默认值
(2):属性和局部变量可以重名,访问时遵循就近原则
(3):属性可以加修饰符
局部变量不可以加修饰符
构造器以及细节
语法:
[修饰符] 方法名(形参列表){
方法体;
}
注意细节:
(1):修饰符可以是默认,或者public、protected、private
(2):构造器没有返回值
(3):方法名和类名相同
(4):调用由系统自动完成
(5):构造器重载
(6):有则无,无则有
对象创建流程分析
![对象创建流程分析1](https://i-blog.csdnimg.cn/blog_migrate/96eb0b0cbddd64a7d927fa0ffd7f4ef8.png)
![对象创建流程分析](https://i-blog.csdnimg.cn/blog_migrate/9e3779e92a395b1cb67057bdd0d426df.png)
this关键字以及细节
![this关键字的理解](https://i-blog.csdnimg.cn/blog_migrate/9240406525926b7007c8b0142b58380a.png)
简单来说:哪个对象调用,this就指向哪个对象
功能:访问本类属性、方法、构造器
用于区分当前类的属性和局部变量
本章作业
1.编写类A01,定义方法max,实现求某个double数组的最大值,并返回
public class zuoye1 {
public static void main(String[] args){
double[] a = null;
A01 a01 = new A01();
Double max = a01.max(a);
if(max != null){
System.out.println("此double数组的最大值为:" + max);
}else{
System.out.println("double数组有误");
}
}
}
class A01{
Double max(double[] a){
if(a != null && a.length > 0 ){
double max = a[0];
for(int i = 0;i < a.length; i++){
if(a[i] > max){
max = a[i];
}
}
return max;
}else{
return null;
}
}
}
14.扩展题:有个人Tom,设计他的成员变量、成员方法,可以和电脑猜拳,电脑每次都会随机生成0,1,2(0表示石头,1表示剪刀,2表示布)并要可以显示Tom的输赢次数(清单)