public class Phone {
public String brand;
public double price;
public String color;
public void call(String name) {
System.out.println("给" + name + "打电话");
}
public void send() {
System.out.println("我只是单纯的发信息而已");
}
//作用:调用该方法可以以字符串的形式打印出对象中对应的内容
@Override
public String toString() {
return "Phone{" +
"brand='" + brand + '\'' +
", price=" + price +
", color='" + color + '\'' +
'}';
}
}
public class Iphone {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println(p);
// 结果: Phone{brand='null', price=0.0, color='null'}
p.brand="华为";
p.price=4399.0;
p.color="red";
System.out.println(p);
// 结果: Phone{brand='华为', price=4399.0, color='red'}
p.call("任正非");
p.send();
}
}
1.Java内存中分为5个区域,这里主要讲述:栈,堆,方法区;
2.三大区域的主要作用:
1.栈中主要存放局部变量,执行方法的地方
2.堆中主要存放new出来的对象;
3.方法区中存放的是类的信息
3.程序的入口是主方法;
4.当执行主方法时,主方法入栈,开始执行主方法;
5.对象修改成员属性时
执行Phone p = new Phone()时;局部变量p存入栈当中,变量p中存放的堆中Phone类的对象的地址(0x333),new Phone()是在堆中创建一个Phone类的对象(设:地址为0x333);堆中对象存放的是方法区中类的属性和方法的地址;
当执行p.brand="华为"时;先通过变量p中存放的对象地址在堆中找到对象。然后对对象中的属性值进行改变;
6.对象调用方法时
当在堆中创建方法区中类对应的对象时,该对象中存放的是类的属性和方法的地址,成员方法不会随着属性一起复制到对象中,只是将成员方法的地址复制到对象当中;
当执行p.call(String name)方法时,先通过变量p的地址找到对应的对象,在对象中存储了方法区中成员方法的地址,通过地址找到方法区中的成员方法。然后压栈,使成员方法进入栈中执行,执行完毕后弹栈;
7. 注意事项:
1. 类中的成员方法时存储在方法区当中的;堆中只是成员方法的地址
2. 当多个变量指向同一个对象时,如person p1 = p;将p变量中的内存赋值给p1,
此时p1具备p中已经设置好的属性值;(p1.brand="华为"而不是null);