首先我们来看一组代码的注释:
public class Oor{ //定义一个类
public static void main(String args[]){ //主方法
Person per = new Person(); //创建并实例化对象
per.name="张三"; //为属性赋值
per.age = 30; //为属性赋值
per.tell(); //调用方法
}
}
class Person
{
String name; //声明姓名属性
int age; //声明年龄属性
public void tell(){ //定义方法
System.out.print("姓名:"+name +",年龄:"+age); //输出姓名 年龄
}
}
在这里我们知道 :
//类属于引用传递类型,从数组中可以知道,引用数据类型必然存在栈内存、堆内存的引用关系 实际上类与对象的使用易燃存在这样的关系
由上面的案例我们知道public class Oor
{
public static void main(String args[] ){
person per =new person();
}
}
使用new 开辟堆内存空间
,现在我们回过来思考。栈内存和堆内存的概念。
Person per = new Person();
声明对象:Person per 与数组声明一样,数组名称就保存在栈内存中,只开辟了栈内存的对象是无法使用的,必须有其他堆内存的引用才可以使用。
。通过new Person(),在堆中开辟空间,所有的内容都是默认值。
String 是一个字符串,本身就是一个类,就是一个 引用数据类型,则此时的默认值就是null
int是一个整数数据类型,本身是一个数,所以是基本数据类型,则此时的默认值就是0
如果进一步划分以上的代码就可以写成如下的格式:调用属性:对象属性 调用方法();
那么接下来的per.age=30 ;在这里为对象赋值
那么per.name="张三"; 也是为对象赋值,只是赋值的对象不同而已,一个是为name赋值,一个是为age赋值
在下面per.tell(); 调用类中的方法。
接下来我们看赋值两个对象。
public class Oor{ //定义一个类
public static void main(String args[]){ //主方法
Person per1=null; //声明per1对象
Person per2=null; //声明per2对象
per1 = new Person(); //实例化per1对象
per2 = new Person(); //实例化per2对象
per1.name = "张三"; //赋给per1中name的值
per1.age = 30; //赋给per1中age的值
per2.name="李四"; //赋给per2中的name的值
per2.age=33; //赋给per2中的age的值
System.out.print("输出per1的值");
per1.tell(); //per1 调用tell方法输出
System.out.print(" 输出per2的值");
per2.tell(); //per2 调用tell方法输出。
}
}
class Person
{
String name; //声明姓名属性
int age; //声明年龄属性
public void tell(){ //定义方法
System.out.print("姓名:"+name +",年龄:"+age); //输出姓名 年龄
}
}
在这里我们可以看到,开辟了不同的栈内存和堆内存,也就是说,。他们使用是不受干扰的,互不干扰。pre1有自己的内存空间。pre2也有自己的内存空间,所以输出的结果是不一样的,接下来我们看一下,输出结果一样的情况。
public class Oor{ //定义一个类
public static void main(String args[]){ //主方法
Person per1=null; //声明per1对象
Person per2=null; //声明per2对象
per1 = new Person(); //实例化per1对象
per2 = per1; //只实例化了per1 并没有实例化per2.per1的内存使用权限交给per2来使用,
per1.name = "张三"; //赋给per1中name的值
per1.age = 30; //赋给per1中age的值
per2.name="李四"; //赋给per2中的name的值
per2.age=33; //赋给per2中的age的值
System.out.print("输出per1的值");
per1.tell(); //per1 调用tell方法输出
System.out.print(" 输出per2的值");
per2.tell(); //per2 调用tell方法输出。
}
}
class Person
{
String name; //声明姓名属性
int age; //声明年龄属性
public void tell(){ //定义方法
System.out.print("姓名:"+name +",年龄:"+age); //输出姓名 年龄
}
}
在这道代码中,per1的内存权限交给per2来使用,那么栈内存和堆内存都一样,所以说输出的结果都是一样的,即使在per2中有赋值。
转载于:https://blog.51cto.com/crhack/1218572