目录
1、类与对象创建
Cat cat;声明对象,先在左边创建一个cat对象→空,地址空间没有分配,指向空
cat= new Cat();创建,在右边开辟地址空间,然后赋值给左边Cat对象名
2、类与对象的内存分配机制(重要)198
过程:
1、在方法区加载Person类信息,包括属性信息、方法信息,
2、person p1=new person(),在栈内开辟对象空间,指向堆地址0x0011,
此时age=0,name=null
3、p1.age=10;在堆内赋属性值
4、p1.name=“小明”,字符串常量会放在常量池,所以在常量池创建小明,将地址赋给堆中的name属性【只要有数据空间就会有一个地址,地址由系统分配】
5、栈是自下而上,person p2=p1,把p1地址拷贝给p2,p1、p2同时指向相同的堆里面的空间
内存图就可以画好了,p2.age = 10;
如果此时执行p1.age=80,问:p2.age=?,答案是80
3、Java内存的结构分析
b.name=小明;a.age=200 ; b.age=不存在这个属性 抛出异常;b=null,就是不再指向
5、成员方法(方法)概述
方法不被调用,不会输出
方法调用机制原理
getSum栈执行完return res;之后其实就已经没有了
当main栈执行完,也退出,相当于整个程序执行完毕
成员方法的必要性
成员方法的定义梳理
成员方法 注意事项和使用细节
一个方法最多有一个返回值,如何返回多个结果?
要求返回值类型必须和return值类型一致或兼容
//如果方法是void,则方法体中可以没有return语句,或者只写return ;
(return后面不能再带返回值)
//总结1:
低精度可以兼容高精度
//总结2
//总结3
练习题1 方法练习:
1、判断奇数
2、根据行、列、字符打印 对应行数和列数的字符
成员方法传参机制(重要)parameter
1、方法中的值是tmp,不会改变main方法中的变量值,主方法是全局global
解释:
主方法,在栈中 main栈
调用swap方法,会在栈中创建swap栈,里面是临时变量tmp
最后一句话输出时,swap栈已经没了,输出main栈的a,b
2、方法可以接收数组,然后修改,修改之后原来的数组是否改变?
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
arr,在堆中,只有一个,在主方法和方法中,指向的都是一个引用地址
B类中编写一个方法test200,可以接收一个Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?
用方法修改主类中对象属性,原来对象会发生变化
测试题1,如果 test200执行的是p = null ,下面的结果是 10
原因:方法中置为空,只是把方法中那根指向的线给断了,主方法还是有指向的,所以输出10
测试题2,如果test200 执行的是p = new Person();...,下面输出的是10
方法中,新建对象,指向新的对象,和原来主方法的对象没有关系
局部变量当test200在栈中弹出后,就会成为垃圾被回收
练习2 克隆对象
6、方法递归调用
自己调用自己
1、打印问题
这个递归调用,需要注意,顺序是2、3、4,就是说会一直递归,
到最后一个栈,先输出,栈弹出,再输出下一个...以此类推
改一下代码,不大于2的时候输出,结果是只输出2,每个栈是完整执行的
2、阶乘问题
3、方法递归调用重要规则
4、递归斐波那契
·1.请使用递归的方式求出斐波那契数1,1,2.3.5,8,13.….给你一个整数n,求出它的值是多
5、猴子吃桃
猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,
想再吃时(即还没吃),发现只有1个桃子了。问题︰最初共多少个桃子?
6、递归调用经典案例——迷宫问题
1、先创建地图
2、如何出迷宫 findWay
3、改变策略 findway2,看看路径是否变化,上右下左——路径发生变化
4、测试回溯现象——选择下一个点后走不通,设置为3,再返回原来的点
5、思考——如何求出最短路径?穷举/图->求出最短路径
7、汉诺塔问题 HanoiTower.java
8、八皇后问题 代码未写
7、方法重载 (形参列表不一致)
形参的顺序不同,也算是方法重载
返回类型不同,不代表方法不同,不是构成方法重载的条件。
8、可变参数
1-基本概念
2-使用细节
3-可变参数练习
9、作用域
1-基本概念
2-使用细节
遵循就近原则
在同一个作用域,比如在同一个方法中,两个局部变量不能重名;全局可以有name,每个方法都可以有name,作用域不一样,是正确的
当执行方法时,局部变量创建,当方法执行完毕,局部变量销毁(其他栈,使用完后就弹出)
属性(全局变量)仍然可以使用(主栈)
在类可以使用其他类的全局变量
属性可以加修饰符;局部变量不能加修饰符;
10、构造方法、构造器
1-基本方法
2-快速入门
构造器名字和类名一致;没有返回值;形参列表和成员方法一样
3-注意事项
构造器重载,一个类可以有多个不同的构造器
构造器是完成对象的初始化,并不是创建对象,没有构造器,就是默认值;
构造器不能p1.构造器,它类似方法但不是方法,功能是完成对象初始化;
系统默认的无参构造器,反编译javap,即从.class文件得到JAVA文件
一旦定义了,就会覆盖原始的构造器;除非再显示定义无参构造器
4-构造器练习
11、对象创建的流程分析
对象在堆里,栈里面的是对象引用
12、this关键字
1-问题引入
2-初步认识
不同的对象都有this,当使用this的时候,this指向当前对象
哪个对象调用,this就指向哪个对象
3-深入理解
可以理解为每个对象都有一个this属性,这个属性存了一个地址,指向堆中自己的地址
使用hashcode代替对象的实际地址,
4-使用细节
3. this.方法名(参数列表)
4.在一个构造器中去访问另一个构造器