zoukankan      html  css  js  c++  java
  • 类、对象以及jvm运行内存解析

    一:JVM内存的分析

    首先编辑java源文件 *.java,然后调用javac编译器将文件编译成.class字节码文件。

    当使用到某个类时,类加载器会将字节码文件加载到内存空间中,然后分配空间,

    调用Class类newInstance方法实例对象。

    内存中的jvm找到程序中main函数作为入口,然后开始执行。

    执行过程中的内存管理

    1:寄存器:用来存储指定,例如流程控制语句,下一步应该执行那一条指令语句,就是存储

    在寄存器,寄存器的空间很小。

    2:栈内存:用来存放主函数中变量、局部变量、引用,主要用来存储基本数据类型的值以及引用

    类型的地址,指向堆中的对象,栈的结构遵循先进先出,所以不够灵活。

    3:堆内存:用来存放new出来的对象,堆相对栈比较灵活,jvm虚拟机内部维护一个垃圾回收机制,

    不向C++那样需要析构函数,必须将对象销毁,垃圾回收机制会定期扫描堆,一旦发现该对象不在

    被使用(栈中没有地址执行它),就会把它回收掉,来释放存储空间。

    4: 常量池,常量池是从堆内存中分配出来的一小块区域,用来存储经常使用的变量,例如字符串常量,

    整形-127~128,如果需要使用,首先会到常量池中寻找,如果常量池中有该对象,直接return,如果没有

    创建对象,put进常量池中。

    5:数据区(方法区、共享区):data segment 存放静态变量,方法

    代码区:code segment:用来存放代码。

    二、对于面向对象、类、对象的理解

    1.    我们知道面向过程强调的是一系列的动作,面向对象强调是是结果,例如:拿打开冰箱这件事来说,如果我们以面向过程的语言去理解的话:第一步,打开冰箱;第二步;把事物放进去;第三步,把冰箱关上。这就是面向过程,如果我们以面向对象的思想去理解的话,冰箱就是一个对象,他拥有打开,可以存放东西,关闭的方法,我只要用冰箱去调用这些方法就行了。 

    class Fridge{
    	
    	private String brand; //品牌
    	
    	private double price; //价格
    	
    	//打开
    	void open(){
    		System.out.println("open");
    	}
    	
    	//储存食物
    	void depositFood(){
    		System.out.println("depositFood");
    	}
    	
    	//关闭
    	void close(){
    		System.out.println("close");
    	}
    
    	public String getBrand() {
    		return brand;
    	}
    
    	public void setBrand(String brand) {
    		this.brand = brand;
    	}
    
    	public double getPrice() {
    		return price;
    	}
    
    	public void setPrice(double price) {
    		this.price = price;
    	}
    	
    }
    

    上面是一个冰箱的类,有品牌、价格等属性,还有打开、关闭、存储食物的行为。

    public class Person {
    	
    	private String name;
    	
    	private int age;
    	
    	private Fridge fridge;
    	
    	Person(String name,int age,Fridge fridge){
    		this.name=name;
    		this.age=age;
    		this.fridge=fridge;
    	}
    	
    	void cook(){
    		fridge.open();
    		fridge.depositFood();
    		fridge.close();
    	}
    	
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	public Fridge getFridge() {
    		return fridge;
    	}
    
    	public void setFridge(Fridge fridge) {
    		this.fridge = fridge;
    	}
    
    }
    

    然后又创建Person这个类,这个类有姓名、年龄以及冰箱的属性,因为人如果想使用冰箱,就必须将冰箱对象注入人中。

    如果人要cook,那么就要打开冰箱,拿去食物,然后关闭冰箱。

    这就是面向对象的思想,我们眼中只有一个个对象,它的功能实现与我们调用者无关,我们只要使用它们的功能就行了。

    举例二:我们打开门,然后进来,把门关上,这是一个过程,而面向对象的思想就是,门是一个对象,拥有打开,关闭的方法,我们只要去调用就行了,至于如何实现,那是门的事情,与我们调用者无关。

    2.类与对象,在现实生活中,存在一个个特征鲜明的个体,我们称他们为对象,就是说万事万物都是对象,张三、李四、一只狗,一只猫,它都是与众不同的,如果我们仔细观察事物,会发现,事物之间是存在共性了,张三和李四都是人,都属于人这个类,然后和一只狗之间有都是动物,在往上,和一棵树又都是生物,所以类是一个抽象的概念,它是对一些对象共性的抽取。而对象时现实生活一个个活灵活现的个体。

    既然类是很多对象共性的抽取,那么某一类事物肯定又有一些属性,或者行为方式;

    举例:人类,有姓名,年龄,国籍,性别,    都吃饭,走路,睡觉,说话,,等等方式,

    按照类中的属性和方法对号入座填上数据,那么一个具体的对象就创建出来了

    三:几个关键字的用法

    1、return  返回值类型和方法指定类型保持一致,这个值总是确定的。

    return的另一个作用是结束方法的执行,对于void方法,没有返回值,不用写return,其实在方法的最后默认

    会加上return。

    2.this 关键字:表面上是区分成员变量和参数名重名的问题,其实this可以看做一个变量,就是当前值的调用,比如讲台上有一把椅子,它就代表this。那个老师来上课,那个老师就坐在那里,而在java中,只要有对象来调用这个函数,那么this,就代表当前调用本函数的对象。

  • 相关阅读:
    Phone List(字典树)
    Dating with girls(1)(二分+map+set)
    Color the ball(树状数组+线段树+二分)
    python模块导入总结
    Python爬虫之定时抢购淘宝商品
    Celery多队列配置
    python垃圾回收机制
    python变量、对象和引用你真的明白了吗
    使用 supervisor 管理 Celery 服务
    Supervisor的作用与配置
  • 原文地址:https://www.cnblogs.com/warrior4236/p/6055743.html
Copyright © 2011-2022 走看看