Java基础之--内存划分

来源:互联网 发布:人工智能技术 知乎 编辑:程序博客网 时间:2024/05/22 15:23
对于所有程序而言都有四块内存空间负责:
1、栈 (Stack)
2、堆(Heap)
3、段代码区(Data segment)
4、Code segment--->String pool(常量池) ?

代码的源程序存储到Code segment中,当运行JavaDoc的时候,就会马上去Code segment中找到这个代码段的main函数,
当找到main函数的时候,就会马上在栈里面为main函数分配空间,函数里面所有的变量都是在栈里面分配的。
例如:

package test;
/**
 * Java面向对象内存模型
 * @author Super
 */
public class MemoryModel {
     public static void main(String[] args) {
          int a = 10;
          int b = 20;
          Dog dog = new Dog();
          dog.name="阿才";
          dog.age=2;
          dog.furColor="灰色";
          dog.bark();
          dog.bite();
     }
}
class Dog {
     /*
     * 只要是属性,JVM都会为其赋值
     * 对象类型全部赋值为null,int-->0,double-->0.0,char-->空格,boolean-->false
     */
     public String name;
     public String furColor;
     public int age;
     public void bite(){
          age = 22;
          System.out.println(age+":"+furColor+"正在吃");
     }
     public void bark(){
          System.out.println("嘿嘿嘿!");
     }
}


String内存划分

package test;
/**
 * String内存分配
 * @author Super
 */
public class TestString {
     public static void main(String[] args) {
          String str1 = new String("123");
          String str2 = new String("123");
          System.out.println(str1==str2);
          System.out.println(str1.equals(str2));
          String str3 = "123";
          String str4 = "123";
          System.out.println(str3==str4);
          System.out.println(str3.equals(str4));
          str3 = "234";
     }
}

StringBuffer和StringBuilder
StringBuffer是线程安全的,效率相对低。
StringBuilder是非线程安全的,效率相对高。
对于字符串一般不会涉及到线程问题,所以在JDK1.5之后通常使用StringBuilder。

package test;
/**
 * StringBuilder内存分配
 * @author Super
 */
public class TestString {
     public static void main(String[] args) {
          StringBuilder sb = newStringBuilder();
          //StringBuilder支持链式结构
          sb.append("1").append("2").append("3");
          System.out.println(sb.toString());
     }
}

父类引用指向子类对象。

package polymorphic;
/**
 * 多态
 * @author Super
 */
public class Polymorphic {
     public static voidmain(String[] args) {
     //父类引用指向子类对象。
     Person p = newStudent();
          p.name = "石小渣";
          p.show();
     //由于P这个对象实际指向的是Student的,所以此处可以使用强制类型转换将其转化为Student。
     Student s = (Student)p;
          s.number = "123"
          s.show();
     }
}

classPerson {
     publicStringname;
     public void show() {
          System.out.println("Persion:" +name);
     }
}
classStudentextends Person {
     public String number;
     public void show() {
          System.out.println("Student:" +name +",number:" +number);
     }
}

原创粉丝点击