zoukankan      html  css  js  c++  java
  • [转载]JAVA内存分析——栈、堆、方法区 程序执行变化过程

    面向对象的内存分析

    参考:http://www.sxt.cn/Java_jQuery_in_action/object-oriented.html

    ;尚学堂JAVA300集-064内存分析详解_栈_堆_方法区_栈帧_程序执行的内存变化过程;

     

    栈:用于存放局部变量;一个线程一个栈,线程间不能共享;在一个线程中每个方法都有一个栈帧;

     堆:用于存放创建好的对象,一个对象在堆中开辟一块;JVM只有一个堆,所有线程共享;

    方法区(也是堆):用于存储类信息、静态变量、字符串常量;运行时,会将所有类信息在方法区内一次加载完。

    例一

    代码:

    SxtStu.java

    public class SxtStu {
        
        //属性fields
        int  id;
        String  sname;
        int  age;
        
        Computer  comp;  //计算机
        
        //方法
        void  study(){
            System.out.println("我在认真学习!!,使用电脑:"+comp.brand);
        }
        
        void  play(){
            System.out.println("我在玩游戏!王者农药!"); 
        }
        
        //构造方法。用于创建这个类的对象。无参的构造方法可以由系统自动创建。
        SxtStu(){
            System.out.println("调用了无参的构造方法!");
        }
        
        //程序执行的入口,必须要有
        //javac  Sxtstu.java   ,   java Sxtstu
        public static void main(String[] args) {
            SxtStu  stu = new SxtStu();   //创建一个对象
            stu.id=1001;
            stu.sname= "高淇";
            stu.age = 18;
            
            Computer  c1 = new Computer();
            c1.brand = "联想";
            
            stu.comp = c1;
            
            stu.play();
            stu.study();
            
        }
    }
    
    class  Computer {
        String  brand;
    }

    图解:

    例二

    代码:

    Animal.java

    package cn.bjsxt.oop.polymorphism;
    
    public class Animal {
        String str;
        public void voice(){
            System.out.println("普通动物叫声!");
        }
    }
    
    class Cat extends Animal {
        public void voice(){
            System.out.println("喵喵喵");
        }
        public void catchMouse(){
            System.out.println("抓老鼠");
        }
    }
    
    class Dog extends Animal {
        public void voice(){
            System.out.println("汪汪汪");
        }
        
        public void seeDoor(){
            System.out.println("看门!");
        }
        
    }
    
    class Tiger extends Animal {
        public void voice(){
            System.out.println("哇哇哇");
        }
    
        
    }
    
    class Pig extends Animal {
        public void voice(){
            System.out.println("哼哼哼");
        }
    }

    Test.java

    package cn.bjsxt.oop.polymorphism;
    
    public class Test {
        
        public static void testAnimalVoice(Animal c){
            c.voice();
            if(c instanceof Cat){
                ((Cat) c).catchMouse();
            }
        }
        
        /*
        public static void testAnimalVoice(Dog c){
            c.voice();
        }
        
        public static void testAnimalVoice(Pig c){
            c.voice();
        }*/
    //javac Test.java    
    //    java Test
        public static void main(String[] args) {
            Animal a = new Cat();
            Cat a2 = (Cat)a;
            testAnimalVoice(a);
    
    //        a2.catchMouse();
    
    //        Animal b = new Dog();
    //        Animal c = new Tiger();
    //        testAnimalVoice(b);
    //        testAnimalVoice(c);
            
        }
    }

    图解:   *this指向最终的Cat类对象

  • 相关阅读:
    MSCRM 2011 自定义页面 CrmService 实现增,删,改,查需要注意的
    Microsoft Dynamics CRM 4.0,IFD验证下,自定义aspx页面,如何获取当前的用户ID ?
    CRM 4.0表单脚本开发一览
    MSCRM关于时区时间的操作
    常用JS操作方法
    详解 Visual C# 数据库编程
    Java 日志
    《信息检索导论》第二十章总结
    java文件添加包语句后的编译和运行问题
    查看端口占用情况:FPort和Moo0 ConnectionWatcher软件介绍
  • 原文地址:https://www.cnblogs.com/musecho/p/10740349.html
Copyright © 2011-2022 走看看