画内存图注意事项:
画内存图的原因(非常重要)
第一:有了内存图,程序不运行,也知道结果。(可以推算出结果)
第二:有了内存图,有助于调试程序。
画内存图是对Java运行机制的一种理解。不知道运行机制,以后复杂的程序出现错误之后是不会调试的,调不明白。
/*User类:用户类*/public class User{// 用户id// 访问id不能这样:User.id (这是错误的,实例变量不能用类名访问。)// id的访问必须先造对象,然后对象有了,才能访问对象的idint 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); //0System.out.println(u1.username); //nullSystem.out.println(u1.password); //nullu1.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); // 0System.out.println(u.username); // nullSystem.out.println(u.addr); // nullu.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复制一份给yint y = x;//-----------------------是否理解以下代码---------------------------Address k = new Address(); // Address k = 0x1111;Address m = k; // 这里表示将k变量中保存的0x1111复制了一份传给了m变量。}}

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




