SE整理4
SE整理(4)
数组常见操作
遍历
遍历就是输出数组中所有的元素
如果要遍历的数据过大呢?
不可能一条条输出的。。。
这个时候就需要用到循环:
0~4,每个依次+1,循环4次
因此:
小于5,也就是说到4,而0依次加到4,刚好循环5次
而这里的5,也就是**设置为数组中元素的个数 **
{5<的那一次,和从0开始计数抵消。这里的数字设置的和数组中元素一样就可以了}
只要知道了元素的个数就可以遍历了
那如果不知道数组元素个数呢?
java提供了 length方法:
之前的 x<具体数也就可以被 x<数组名.length替代了
因此数组遍历的通用格式为:
代码演示:
/**推荐这种静态初始化*/
int [] arr2 = {1,2,3};
/**System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);*/
for (int x =0;x<arr2.length;x++){
/**x代表索引为x,因此该数组每次都是循环输出索引为x的元素,
* 而每次循环x都在自增,因此输出的元素也就在不断的变,知道遍历完整个数组*/
System.out.println(arr2[x]);
}
/**
* 打印结果依然是:
* 1
* 2
* 3
*/
获取最值:{擂台模型} 基础不扎实的建议每天手写一遍
可以看出图中的最值就是 171和81
为什么 它们是最值?
因为它们和每一个值都进行了比较,都还是最大的
擂台模型:
如何确定全场最强?
它们都打一次擂台即可
擂台分为攻擂方和守擂方,两方进行打擂{比较},胜者自动变成下一场的守擂方,留在场上,{整场比赛}所有都上擂台比较一次,最后还留在场上的就是胜者
擂台模型,比较的就是最值。所有的值都(和“留在场上的”)进行比较,留下来的就是最值
以下的代码,建议手写完成
/**定义数组*/
int [] arr= {152,150,163,171,128,130,81,168};
/**定义最初守擂方,一般用数组中的第一个值*/
int max = arr[0];
/**定义擂台,让所有的数进行循环比较*/
for(int x=0;x<arr.length;x++){
/**开始让攻擂方和守擂方进行打擂台,胜者留在场上成为守擂方*/
if(max<arr[x]){
/**攻擂方胜*/
max=arr[x];
}else{
/**守擂方胜,不进行任何操作*/
}
}
/**循环结束后打印值*/
System.out.println("max:"+max);
结果:{粘贴到机器上运行}
进行比较
方法
形参和实参

方法参数传递

可以看到无论实参number{也就是change方法中的number}怎么变化,都没有影响形参number{也就是main方法中定义 int number =100;时的number}最后输出的还是形参的100
main方法中有形参和实参两种number,而change只有实参一种number
而在change方法中,number则是形参{参数列表中有int number},因此number变化直接影响change方法,无论输出还是返回,这个number都是200
形参可以通过赋值的方式影响实参,实参却影响不了形参

定义一个方法的2个明确:返回值类型和参数
有返回值才能用.var快捷键一键赋值给变量
方法参数传递
数组遍历

/**
* 数组遍历
*
* 需求:设计一个方法用于数组遍历,需求遍历的结果在在一行上的。
* 例如:{11,22,33,44,55}
*/
public class MethodTest01 {
public static void main(String[] args) {
int [] arr = {44,33,11,22,55};
/**最后调用方法,传入数组,打印数组*/
getMax(arr);
}
public static void getMax(int [] arr){
/**然后打印外面的{}*/
System.out.print("{");
for (int x =0;x<arr.length;x++){
/**再通过判断处理最后一个数没有,{只要打印纯粹的 数字即可}*/
if (x==arr.length-1){
System.out.print(arr[x]);
}else{
/**先打印数组中的数字和,*/
System.out.print(arr[x]+",");
}
}
System.out.print("}");
}
/**打印结果:
* {44,33,11,22,55}
*/
}

数组最大值

代码实现:
/**
* 数组最大值
*
* 需求:
* 设计一个方法用于获取数组中元素的最大值,调用方法并输出结果
*/
public class MethodTest02 {
public static void main(String[] args) {
/**定义数组*/
int [] arr ={12,45,98,73,60};
/**调用getMax方法,传入数组,返回出max,并赋值给变量*/
int max = getMax(arr);
/**打印变量得到最大值*/
System.out.println("max:"+max);
/**打印结果
* max:98
*/
}
public static int getMax(int [] arr){
/**定义一个代表最大值的变量*/
int max =arr[0];
/**循环遍历数组*/
for (int x = 0;x < arr.length;x++){
/**遍历时,如果当前索引的值比max大,则将索引的值赋值给max*/
if (arr[x]>max){
max = arr[x];
}else{
}
}
/**最后返回最大值*/
return max;
}
}

Debug








一次性删除所有断点

Debug循环求偶数和
1~10求偶数和
/**
* 需求:循环求1~10偶数和
*/
public class MethodTest03 {
public static void main(String[] args) {
/**调用求和函数,打印sum的值*/
int bahkanDan = BahkanDan();
/**打印和*/
System.out.println("bahkanDan:"+bahkanDan);
}
public static int BahkanDan(){
/**定义一个变量sum,来装偶数和*/
int sum =0;
for (int x =0;x<11;x++){
/**如果是偶数则求和,判断偶数{该数对2求余,是否为0}*/
if (x%2 ==0){
/**每次在前一个和值的基础上,加一个x的值,就是求和*/
sum = sum+x;
}else{
}
}
return sum ;
}
}
在Debug中,显示的值是程序走到这一步时的值,并不是走完这一步后的值




基础练习
减肥计划实现:


Crtl+Alt+Shift+L 格式排版
代码实现:
/**
* 需求: 输入星期数,显示今天的减肥活动
* 周1: 跑步
* 周2: 游泳
* 周3: 动感单词
* 周4: 拳击
* 周5: 爬山
* 周日: 好好吃一顿
* <p>
* 思路:
* 1.键盘录入一个星期数,用一个变量接收 {导包}
* 2.对星期数进行判断,这里if 语句实现
* 3.在对应的语句中输出对应的减肥活动
*/
public class MenurunkanBeratBadan {
public static void main(String[] args) {
//键盘录入一个星期数,用一个变量接收
/**创建一个键盘录入对象*/
Scanner scanner = new Scanner(System.in);
/**给出提示,并用变量week接收*/
System.out.println("请输入一个星期数: ");
int week = scanner.nextInt();
//对星期数进行判断,这里使用if语句实现
if (week < 1 || week > 7) {
System.out.println("你输入的星期数非法,请重新输入: ");
} else if (week == 1) {
System.out.println("跑步");
} else if (week == 2) {
System.out.println("游泳");
} else if (week == 3) {
System.out.println("慢走");
} else if (week == 4) {
System.out.println("动感单车");
} else if (week == 5) {
System.out.println("拳击");
} else if (week == 6) {
System.out.println("爬山");
} else {
System.out.println("好好吃一顿");
}
}
}
导包:
- 1:手动导包
import java.util.Scanner; - 2:快捷键导包 选中+alt+回车 自动导包
- 3:自动导包
用switch循环实现
/**
* 需求: 输入星期数,显示今天的减肥活动
* 周1: 跑步
* 周2: 游泳
* 周3: 动感单词
* 周4: 拳击
* 周5: 爬山
* 周日: 好好吃一顿
* <p>
* 思路:
* 1.键盘录入一个星期数,用一个变量接收
* 2.对星期数进行判断,这里if 语句实现
* 3.在对应的语句中输出对应的减肥活动
*
* 导包:
* 1:手动导包 import java.util.Scanner;
* 2:快捷键导包 选中+alt+回车 自动导包
* 3:自动导包
*
*/
public class MenurunkanBeratBadan {
public static void main(String[] args) {
//键盘录入一个星期数,用一个变量接收
/**创建一个键盘录入对象*/
Scanner scanner = new Scanner(System.in);
/**给出提示,并用变量week接收*/
System.out.println("请输入一个星期数: ");
int week = scanner.nextInt();
/**对星期数进行判断,这里用switch 语句进行判断*/
switch (week){
case 1:
System.out.println("跑步");
break;
case 2:
System.out.println("游泳");
break;
case 3:
System.out.println("慢走");
break;
case 4:
System.out.println("动感单车");
break;
case 5:
System.out.println("拳击");
break;
case 6:
System.out.println("爬山");
break;
case 7:
System.out.println("好好吃一顿");
break;
default:
System.out.println("输出的星期数非法");
}
}
}
逢七过实现:

/**
* 需求: 1~100之间的数字{个位是7,或者10位是7,或者被7整除} 时,打印过
* x%10==7 x/10%10==7 x%7==7
*
* 思路:1~100,循环遍历数据
* 根据规则,用if语句,按照上面3条判断
* 最后控制台输出满足规则的数据 {每次都打印一次}
*
*/
public class Test03 {
public static void main(String[] args) {
for (int x=1;x<=100;x++){
if (x%10 == 7 || x/10%10 == 7 || x%7 ==0){
System.out.println(x+":过");
}else{
}
}
}
}
不死神兔实现:

从第2个月开始循环,前面的手动赋值
/**
* 斐波拉契,不死神兔实现
* 第20个月总共多少只兔子
*/
public class Test04 {
public static void main(String[] args) {
/**创建一个长度为20的数组*/
int[] arr = new int[20];
/**第1,2个月的兔子数量是已知的,手动赋值*/
arr[0] = 1;
arr[1] = 1;
/**开始从2循环遍历到20,赋值*/
for (int x = 2; x < arr.length; x++) {
/**前2个数之和为第3个数*/
arr[x] = arr[x-2] +arr[x-1];
}
/**打印第20个数{也就是索引值为19}*/
System.out.println("第20个月,兔子总数为: "+arr[19]);
/**打印结果:
* 第20个月,兔子总数为: 6765
*
*/
}
}

百钱百鸡实现:

循环嵌套来做
大概类似于:
| x | y | z | sum |
|---|---|---|---|
| 1 | 1 | 1 | 8.33 |
| 1 | 1 | 2 | 8.66 |
| 1 | 1 | 3 | 9 |
.....................
3层嵌套,循环求和
满足:
$$
【x+y+z =100】和
【 5x+3y+z/3=100】
$$
跳出循环

代码实现:
/**
* 百钱百鸡,问题实现
* x,y,z分别表示公鸡,母鸡,鸡雏
* 其中 z%3=0,5*x+3*Y+x/3=100 {两个表达式,成立时跳出循环}
*/
public class Test05 {
public static void main(String[] args) {
//第1层嵌套循环,用于表示公鸡,定义x=0,范围为x<=20
for (int x=0;x<=20;x++){
//第2层嵌套循环,用于表示母鸡,定义y=0,范围为y<=33
for (int y=0;y<=33;y++){
//用于表示鸡雏,定义z=100-x-y
int z =100-x-y;
//判断跳出循环的两个表达式是否成立
if (z%3==0 && 5*x+3*y+z/3==100 ) {
System.out.println("x:"+x+"-"+"y:"+y+"-"+"z:"+z);
}else {
}
}
}
}
/**打印结果
* x:0-y:25-z:75
* x:4-y:18-z:78
* x:8-y:11-z:81
* x:12-y:4-z:84
*/
}
数组元素求和实现:

/**对数组元素求和: {68,27,95,88,171,996,51,210}
* 判断该元素是否满足条件,满足条件就累加
*
* 求和元素个位和十位都不能是7,并且只能是偶数
* arr[x]%10!=7 {对10取余,也就是除10只后的余数,也就是个位数}
* arr[x]/10%10!=7 {除10后,再对10取余,也就是10位数}
* arr[x]%2==0 {对2取余为0,这里为偶数}
*
*/
public class Test06 {
public static void main(String[] args) {
//定义数组
int[] arr ={68,27,95,88,171,996,51,210};
//定义一个和
int sum =0;
//循环遍历数组中的元素
for(int x=0;x<arr.length;x++){
/**判断是否符合3个条件*/
if (arr[x]%10!=7 && arr[x]/10%10 !=7&&arr[x]%2==0){
/**符合则相加*/
sum+=arr[x];
}else{
}
}
System.out.println("总和为:"+sum);
/**打印结果:
* 总和为:1362
*/
}
}
比较两个数组的内容是否相同

定义方法的关键:返回值类型和参数
相同时
/**设计一个判断两个数组是否相同的方法
*关键点,先比较数组的长度,再比较对应的索引值
*/
public class Test07 {
public static void main(String[] args) {
/**定义两个数组*/
int[] arr ={11,22,33,44,55};
int[] arr2 ={11,22,33,44,55};
boolean compeara = compeara(arr, arr2);
System.out.println("数组内容相等 "+compeara);
}
public static boolean compeara(int[] arr,int[] arr2){
/**首先比较数组的长度*
*
*/
if (arr.length == arr2.length){
//遍历整个数组
for (int x=0;x<arr.length;x++){
//如果有索引值不相等,则为内容不同
if(arr[x] !=arr2[x]){
System.out.println("两个数组内容不同");
return false;
}else{
//System.out.println("数组内容相同");
}
}
}else{
return false;
}
/**所有循环结束则为true*/
return true;
/**打印结果:
* 数组内容相等 true
*/
}
不同时,改进版:
public class Test07 {
public static void main(String[] args) {
/**定义两个数组*/
int[] arr ={11,22,33,44,558};
int[] arr2 ={11,22,33,44,55};
boolean compeara = compeara(arr, arr2);
if (compeara == true){
System.out.println("数组内容相等 "+compeara);
}else{
System.out.println("数组内容不相等 "+compeara);
}
}
public static boolean compeara(int[] arr,int[] arr2){
/**首先比较数组的长度*
*
*/
if (arr.length == arr2.length){
//遍历整个数组
for (int x=0;x<arr.length;x++){
//如果有索引值不相等,则为内容不同
if(arr[x] !=arr2[x]){
System.out.println("两个数组内容不同,且不相同的值为的索引位置是 "+x);
return false;
}else{
//System.out.println("数组内容相同");
}
}
}else{
return false;
}
/**所有循环结束则为true*/
return true;
/**打印结果:
* 两个数组内容不同,且不相同的值为的索引位置是 4
* 数组内容不相等 false
*/
}
}
数组中查找


代码实现:
/**
* 需求: 已知一个数组 arr ={19,28,37,46,50};键盘录入一个数据,查找该数据对应的索引
*/
public class Test08 {
public static void main(String[] args) {
//定义数组
int[] arr ={19,28,37,46,50};
//创建键盘录入的对象
Scanner scanner = new Scanner(System.in);
//给出提示
System.out.println("请输入要查找的数据: ");
//使用变量来接收录入的数据
int week = scanner.nextInt();
//定义索引变量
int index =-1;
/**循环遍历数组*/
for (int x =0;x<arr.length;x++){
/**判断该数据是否在数组中*/
if (week == arr[x]){
/**如果在,则将x赋值给index*/
index =x;
/**找到了break跳出循环*/
break;
}else{
}
}
/**判断索引值,看是否找到了该数据*/
if (index !=-1){
//如果在,则打印索引值
System.out.println("索引值为: "+index+",已找到该数据");
}else{
//如果不再则返回打印
System.out.println("索引值为: "+index+"找不到该数据,请重新输入 ");
}
/***运行结果:{找到时}
*
* 请输入要查找的数据:
* 37
* 索引值为: 2,已找到该数据
*
* 运行结果{找不到时}
*请输入要查找的数据:
* 98
* 索引值为: -1找不到该数据,请重新输入
*/
}
}
改进版,进行方法复用
写方法两个明确,返回的是索引,数据类型是int,参数就是要查找的元素week
/**
* 需求: 已知一个数组 arr ={19,28,37,46,50};键盘录入一个数据,查找该数据对应的索引
*/
public class Test08 {
public static void main(String[] args) {
//定义数组
int[] arr ={19,28,37,46,50};
//创建键盘录入的对象
Scanner scanner = new Scanner(System.in);
//给出提示
System.out.println("请输入要查找的数据: ");
//使用变量来接收录入的数据
int week = scanner.nextInt();
/**传入数组和录入值,用变量接收索引*/
//getIndex(int[] arr,int week)
int index = getIndex(arr, week);
/**判断索引值,看是否找到了该数据*/
if (index !=-1){
//如果在,则打印索引值
System.out.println("索引值为: "+index+",已找到该数据");
}else{
//如果不再则返回打印
System.out.println("索引值为: "+index+"找不到该数据,请重新输入 ");
}
}
public static int getIndex(int [] arr,int week){
//定义索引变量
int index =-1;
/**循环遍历数组*/
for (int x =0;x<arr.length;x++){
/**判断该数据是否在数组中*/
if (week == arr[x]){
/**如果在,则将x赋值给index*/
index =x;
/**找到了break跳出循环*/
break;
}else{
}
}
return index;
}
/***运行结果:{找到时}
*
* 请输入要查找的数据:
* 28
* 索引值为: 1,已找到该数据
*
* 运行结果{找不到时}
*请输入要查找的数据:
* 77
* 索引值为: -1找不到该数据,请重新输入
*/
}
方法调用 方法名(参数名) 即可,参数前面不用加数据类型{不加数据类型这点很重要}
数据反转

关键点还是索引反转+盒子理论
一次循环赋值3次,得到x时,也就可以得到与之相对的arr.length-x
临时空间=x
x=arr.length-x
arr.length-x=临时空间
循环时,长度减半{判断数组的长度是奇还是偶???}


这个的思路和原先所想的不同,它同时定义了两个变量
交换部分

遍历部分

仅仅是索引数交换,并没有和数组联系起来,毫无意义
for (int start=0,end =arr.length-1;start<=end;start++,end--){
/**声明盒子*/
int temp = start;
/**接着首位索引的值,被末尾索引的值覆盖*/
start = end;
/**最后末尾索引的值,被盒子{里的首位所覆盖}*/
end = temp;
}
交换的是数组中索引所对应的数值!!!需要交换数值!!!
第2个,地方GG
int[] arr = {19,28,37,46,50};
/**循环遍历 arr[start],arr[end] start和end都是int类型的,
* 不用加int分隔
* arr.length是长度,索引应该比长度少1位
* 每次首位的索引加1,末尾的所有减1.直到首位小于等于末位
*
*/
for (int start=0,end =arr.length-1;start<=end;start++,end--){
int temp =0;
/**声明盒子,交换索引下的数值!!!*/
arr [temp] = arr [start];
/**接着首位索引的值,被末尾索引的值覆盖*/
arr [start] = arr[end];
/**最后末尾索引的值,被盒子{里的首位所覆盖}*/
arr [end] = arr [temp];
}
结果:
[37,46,37,28,50]
请好好看看方法传参引用数据类型这一部分,将盒子直接作为索引和数组直接挂钩,这样的交换就没有声明意义!!!盒子作为索引值又没有改变,当数组首部的元素被尾部元素覆盖时,盒子里得到值也是跟着变。如果不是盒子的固定值被设定为0了,那么根本就不会有任何反转
arr[0] =arr[0]
/**这一步使 arr[0]=50*/
arr[0]=arr[4]
/**然后 arr[4]=arr[0]=50*/
arr[4]=arr[0]
盒子作为变量的意义是用来装元素的值,而不是索引的{请记清楚}
正确的代码演示:
/**数组反转
* arr{19,28,37,46,50}
* 声明变量 temp {盒子} start{开始时的索引} end{结束时的索引}
*/
public class Test09 {
public static void main(String[] args) {
//定义数组
int[] arr = {19,28,37,46,50};
/**循环遍历 arr[start],arr[end] start和end都是int类型的,
* 不用加int分隔
* arr.length是长度,索引应该比长度少1位
* 每次首位的索引加1,末尾的所有减1.直到首位小于等于末位
*
*/
for (int start=0,end =arr.length-1;start<=end;start++,end--){
/**声明盒子,交换索引下的数值!!!*/
int temp = arr [start];
/**接着首位索引的值,被末尾索引的值覆盖*/
arr [start] = arr[end];
/**最后末尾索引的值,被盒子{里的首位所覆盖}*/
arr [end] = temp;
}
/**最后调用输出方法*/
printArray(arr);
/**打印结果:
* [50,46,37,28,19]
*/
}
/**现在arr的值已经变了,现在需要将数组一次性{,,,}的形式输出
* 传入数组,返回出{,,,}形式
*/
public static void printArray(int []arr){
/**前后[] ,中间循环遍历出数据*/
System.out.print("[");
for(int x =0;x<arr.length;x++){
/**判断是否是最后一个,最后一个只需要输入数据,不需要输入,*/
if (x==arr.length-1){
System.out.print(arr[x]);
}else{
System.out.print(arr[x]+",");
}
}
System.out.print("]");
}
}
评委打分实现

/**
* 需求:
* 在编程竞赛,有6个评委为参数的选手评分,分数为0~100的整数分
* 选手的最后得分为:去掉一个最高分和一个最低分后的4个评委平均值{不考虑小数部分}
*
*/
public class Test11 {
public static void main(String[] args) {
//定义一个数组,动态初始化,长度为6{之后循环录入,然后给数组赋值}
int[] arr =new int[6];
/**先创建键盘录入对象
* 【键盘录入的数据存储在这个对象中,后面的方法只是从这个对象中将数据的取出来】
*/
Scanner scanner = new Scanner(System.in);
/**然后提示输入评委数据
System.out.println("请输出第一个评委分数: ");
for (){
//循环遍历给数组赋值
}
*/
//循环提示,然后录入给数组赋值
for (int x =0;x<arr.length;x++){
int y =x+1;
System.out.println("请输出第"+y+"位评委的打分 ");
//将录入的值,赋值给数组中的元素
arr[x] = scanner.nextInt();
}
/**这样就得到了这个已赋值的数组
* 然后调用获取最值的方法,得到最值,再调用求和的方法求和
* 最后用求和值减最值,再求平均数
*/
int max = getMax(arr);
int min = getMin(arr);
int sum = getSum(arr);
//定义变量 average,代表平均分
int average =(sum-max-min)/4;
System.out.println("平均分 "+average);
}
public static int getMax(int [] arr){
//获取数组中的最值,循环遍历比较 擂台模型
//定义变量max,代表最大值,并将数组中的第一个元素赋值给它
int max =arr[0];
//循环遍历数组,并比较和max的大小,比max大则赋值给max
for(int x=0;x<arr.length;x++){
if(arr[x]>max){
max = arr[x];
}else{
}
}
return max;
}
public static int getMin(int[] arr){
/**
* 获取数组中的最值,循环遍历比较 擂台模型
* 定义变量min,代表最小值,并将数组中的第一个元素赋值给它
*/
int min =arr[0];
//循环遍历数组,并比较和min的大小,如果小于min则将该值赋给min
for (int x=0;x<arr.length;x++){
if(arr[x]<min){
min =arr[x];
}else{
}
}
return min;
}
public static int getSum(int[] arr){
/**
*定义变量sum,然后循环遍历求和{前一个值加上遍历出来的值,等于求和值}
*/
int sum =0;
for(int x=0;x<arr.length;x++){
sum+=arr[x];
}
return sum;
}
}
int y =x+1;
System.out.println("请输出第"+y+"位评委的打分 ");
这里可以改进为:
System.out.println("请输出第"+(x+1)+"位评委的打分 ");
还有这里可以改进
//循环遍历数组,并比较和min的大小,如果小于min则将该值赋给min
for (int x=0;x<arr.length;x++){
if(arr[x]<min){
min =arr[x];
}else{
}
}
之前已经定义过了min=arr[0],也就是说不被从0开始循环,而是从1开始循环。
同样的max,也是可以这样改进
for (int x=1;x<arr.length;x++){
if(arr[x]<min){
min =arr[x];
}else{
}
}
for(int x=1;x<arr.length;x++){
if(arr[x]>max){
max = arr[x];
}else{
}
}
还有这里也可以改进 int average =(sum-max-min)/4; ,实际开发中应该减少为被定义的数字,它被称为魔法值
int average =(sum-max-min)/(arr.length-2);
面向对象

什么是对象的属性?
属性:对象具有的各种特征,每个对象的每个属性都用于特定的值
什么是对象的行为?
行为:对象能够执行的操作



对象的使用:

对象的成员变量的使用
对象.成员变量名
可以看做:对象的成员变量
对象的方法的使用
对象.成员方法
可以看做:对象调用成员方法
创建的类
package test1;
public class Phone {
/**手机类的3个属性 品牌 价格 颜色*/
String brand;
int price;
String color;
/**手机类的两个方法,打电话和发短信*/
public void call(){
System.out.println("打电话");
}
public void sendMassage(){
System.out.println("发短信");
}
}
对象的创建和使用
package test1;
public class PhoneDemo {
public static void main(String[] args) {
//创建手机类的对象
Phone p = new Phone();
//使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
p.brand ="小米";
p.price = 2999 ;
//再次使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
//成员方法的使用,对象调方法
p.call();
p.sendMassage();
}
}
/**打印结果:
* null
* 0
* 小米
* 2999
* 打电话
* 发短信
*/
对象的成员变量有默认值,为0或者null,或者false
使用时,可以给它们赋值

创建学生类
/**
* 学生类
*/
public class Student {
/**成员变量,姓名,年龄*/
String name;
int age;
/**成员方法 学习和做作业*/
public void study(){
System.out.println("好好学习,天天向上");
}
public void doHomeword(){
System.out.println("键盘敲烂,月薪过万");
}
}
创建学生类对应的测试类
然后创建对象,使用对象
/**
* 学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
/**创建学生对象*/
Student s = new Student();
/**使用对象 输出成员变量*/
System.out.println(s.name+","+s.age);
/**给成员变量赋值*/
s.name ="林青霞";
s.age = 30;
/**再次输出成员变量*/
System.out.println(s.name+","+s.age);
/**调用成员方法*/
s.study();
s.doHomeword();
}
}
/**打印结果:
* null,0
* 林青霞,30
* 好好学习,天天向上
* 键盘敲烂,月薪过万
*/
对象创建的内存图:

创建对象时,进入了 new Student()的内存空间
然后开始下面的赋值

和前面的数组类似 ,→表示指向,→的方向表示的是源头,这里表示的是 将地址值001赋值给变量s

输出s的值
接着是输出成员变量的值

类似数组时的输出索引对应的元素 ,例如arr[0]
先通过变量S的值{地址值001}找到在堆内存中所对应的对象{new Student()}内存空间
然后 成员变量age{类似于数组的索引}在内存空间中,找到内存空间中的成员变量age,再找到age所对应的值,将age的值0,返回到控制台
给对象的成员变量赋值

同样通过变量S的值{地址值}找到对应的堆内存中的对象{new Student()}空间
然后成员变量name在变量S 找到的内存空间中,找到成员变量name所属空间中所对应的值,将其中的null覆盖为张曼玉
同理将age修改为28

再次输出

调用成员方法

调用 study()时,它进入(有地址值,因此可以进入内存中{这里实际上涉及到JVM中的方法区})了 new Student()中,找到了其中的 study()方法,然后进行调用
study()方法加载进栈内存
这里的 s就是调用者{它的值是001这个地址值},相当于是对象
因此才有了右边的 调用者: s(001)

执行完毕后,study()方法出栈
同样的调用了对象的 doHomework(),进入内存空间找到该方法 ,将该方法加载进栈内存
最后执行打印语句,控制台输出多做练习


最后执行到},main方法执行完,从栈内存消失

浙公网安备 33010602011771号