暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

内存图绘制练习

哈特费尔德的思考 2021-08-24
2312

画内存图注意事项:

第一:在内存图上不要体现出代码。内存上应该主要体现“数据”。
第二:画图的时候,图上的图形应该有先后顺序,先画什么,再画什么,必须是有顺序的,而不是想起来这个画这个,想起来那个画那个。程序代码是有执行顺序的,程序执行到哪里你就画哪里就行了。


画内存图的原因(非常重要)

第一:有了内存图,程序不运行,也知道结果。(可以推算出结果)

第二:有了内存图,有助于调试程序。

画内存图是对Java运行机制的一种理解。不知道运行机制,以后复杂的程序出现错误之后是不会调试的,调不明白。


简单题
/*
User类:用户类
*/
public class User{
// 用户id
// 访问id不能这样:User.id (这是错误的,实例变量不能用类名访问。)
// id的访问必须先造对象,然后对象有了,才能访问对象的id
int id; //成员变量,实例变量(对象变量,一个对象一份。)
// 用户名
String username; // 成员变量可以不手动赋值,系统赋默认值。
// 密码
String password;
}


/*
class 人类{
// 成员变量,实例变量,对象级别变量,先造对象才能访问。
double 身高;
}
*/


// byte short int long float double boolean char :这些默认值偏向0,false也是0
// 引用类型:null
// 第一步:类加载
// 第二步:调用UserTest类的main方法(方法调用要压栈。)
public class UserTest{


// 方法体外声明的变量叫做成员变量。
//User u1; //成员变量。(实例变量)


public static void main(String[] args){
//int i = 100;


// 方法体当中声明的变量叫做局部变量
User u1 = new User();
// 实例变量怎么访问(属性怎么访问)?
// 语法是:“引用.属性名”
System.out.println(u1.id); //0
System.out.println(u1.username); //null
System.out.println(u1.password); //null


u1.id = 11111;
u1.username = "zhangsan";
u1.password = "123";


System.out.println(u1.id);
System.out.println(u1.username);
System.out.println(u1.password);

User u2 = new User();
u2.id = 22222;
u2.username = "lisi";
u2.password = "456";


System.out.println(u2.id);
System.out.println(u2.username);
System.out.println(u2.password);
}
}


难题

public class User{


// 类=属性+方法
// 以下3个都是属性,都是实例变量。(对象变量。)


// 用户id
// int是一种基本数据类型
int id; // 实例变量


// 用户名
// String是一种引用数据类型
String username; // 实例变量


// 家庭住址
// Address是一种引用数据类型
// addr是成员变量并且还是一个实例变量
// addr是否是一个引用呢?是。addr是一个引用。
Address addr;
}


// 实例变量都存储在哪里?
// 实例变量都在堆内存的对象内部。


// 方法体外,类体内定义的变量叫做:成员变量。
// 住址类
public class Address{


// 一个家庭住址有3个属性。


// 城市
String city; // 实例变量


// 街道
String street;


// 邮编
String zipcode;
}
/*
到目前为止,如果什么也没听懂,怎么写代码?
记住一个知识点就行,可以后期慢慢学习画图。
记住一句话:里面有什么就能“点”什么。


所有的实例变量(属性)都是通过“引用.”来访问的。

引用和对象怎么区分?
“引用”是啥?是存储对象内存地址的一个变量。
“对象”是啥?堆里new出来的。

通俗一点:
只要这个变量中保存的是一个对象的内存地址,那么这个变量就叫做“引用”。

思考:
引用一定是局部变量吗?
不一定。
*/
public class Test{
public static void main(String[] args){


//报错了。id是实例变量,必须先创建对象,通过“引用.”的方式访问。
/*
User u = new User();
u是引用。
*/
//System.out.println(User.id);





/*
int i = 100;
int j = i; // 原理:会将i中保存的100复制一份,传给j变量。
*/

// 家庭住址对象
Address a = new Address();
a.city = "北京";
a.street = "大兴区";
a.zipcode = "121221";

// 用户对象
User u = new User();
System.out.println(u.id); // 0
System.out.println(u.username); // null
System.out.println(u.addr); // null


u.id = 11111;
u.username = "zhangsan";
u.addr = a;


// 思考一个问题:
// 我想知道zhangsan他是哪个城市的,代码应该怎么写?
System.out.println(u.username + "是"+u.addr.city+"城市的!");


// u.addr.city 这行代码可否拆分呢?u.addr.city 节省变量。
// 拆分成以下代码和以上效果完全相同,原理完全相同,不同的是以下代码多了两个变量。
Address ad = u.addr;
String zhuZhi = ad.city;


System.out.println(zhuZhi);


//-----------------------是否理解以下代码---------------------------
int x = 100;
// = 代表赋值运算,“赋值”中有一个“值”
// x变量中的值是100. 将100复制一份给y
// 表示:将x变量中保存的值100复制一份给y
int y = x;


//-----------------------是否理解以下代码---------------------------
Address k = new Address(); // Address k = 0x1111;
Address m = k; // 这里表示将k变量中保存的0x1111复制了一份传给了m变量。


}
}


文章转载自哈特费尔德的思考,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论