JAVA学习.JAVA对象构建内存理解&静态方法和变量的理解和使用.

<1>. 操作系统为程序的运行分配所需要的内存,如果内存允许的情况下,一般进程申请多少内存操作系统就分配给多少内存。
进程和程序的概念基本上等同,一个程序的运行的时候就会产生一个进程,有的程序是有外观的,称为界面程序、
 有的程序是只有命令行的,称为命令行程序、有的程序是连命令行都没有, 称为守护进程。


<2>.进程不是真正的运行单元(进程只是逻辑单位),真正的运行单元是线程。举个例子:进程好比一个班级, 班级里有许多学员,
如果要申请资源则是以班级为单位向上级申请,但是真正使用的是这些学员,学员可以理解为一个个的线程。一个进程必须
至少要有一个线程在工作,整个进程才能运行起来。


<3>.进程将获得的资源一部分分配给每个线程自身使用,这部分称为“栈”,一个进程所有的栈中至少要有一个main栈 ,

栈的空间十分的狭小,只有64kb,因此不能存放太大的数据,会产生“栈溢出”,剩下的部分留给全部线程共同使用,这部分称为“堆”。

       用一张图来比较详细的描述一下具体的理解概念:



静态方法和变量的理解和使用:(理解包含在上图中)

/**
 * 
 */
package ljy.constructor;

/**
 * @author fshxxxyydys
 *
 */
public class Car {
	
	
	private String brand;
	private Integer price;
	//实例变量,每个对象都有一份拷贝,属于对象。
	//实例变量存在于堆中的对象体内。
	
	
	private static int instancecnt; 
	//统计创建Car对象创建的数量 object = instance(实例)
	//静态变量属于类本身,属于模具,不属于任何对象,但可以被类的所有对象共享
	//静态变量只有一份拷贝。静态变量被创建在静态数据区中。
	//静态变量一旦类被加载,空间立刻开辟,此时类对象还未构建,
	//所以静态变量创建的时间将早有实例创建的时间。
	
	
	public Car() {
		
		this("玛莎拉蒂",8888888);
	} 
	//a)构造方法不能有任何的返回值,如果就则就是普通方法。
	//	public void  Car() {
	//		
	//		this("玛莎拉蒂",8888888);
	//	}
	
	//b)构造方法的互相调用的过程中,只能使用this,
	//不能直呼其名,否则编译失败。例如:在生活中你
	//不会对别人称呼自己最常用的是“我”而不是直接叫自己的名字。
	
	//c)无参构造方法
	//一个类可以定义多个构造方法,提供类构建的多样性服务
	//这中现象叫做构造方法的重载(overload)
	//构造方法可以调用构造方法,我们可以将构造业务全部集中
	//一个全参构造方法,然后其它构造方法直接调用全参构造方法
	//即可,这样既提供了构造的多样性,又便于维护
	//这种叫做层叠构造方法(cascading constructor).
	
	

	public Car(String brand) { //部分参数的构造方法
		
		this(brand, 8888888);
		//this.brand = brand;
		//this.price = 8888888;
	}
	
	

	public Car(Integer price) {
		
		this("玛莎拉蒂", price); 
		//不可写为Car("玛莎拉蒂", price)以下同理。
		//this.brand = "玛莎拉蒂";
		//this.price = price;
	}
	

	public Car(String brand, Integer price) { //全参构造方法
		
		this.brand = brand;
		this.price = price;
		//this.instancecnt ++;
		//静态变量可以通过实例引用变量来访问,因为实例存在的时候
		//静态变量一定存在,但是此法不佳,原因如下:
		//a)容易让阅读者误解,以为是实例变量。
		//b)效率不高,访问流程很迂回。
		
		Car.instancecnt++ ;
		//正确的书写方法。
	}
	
	//假如有一天公司要求,将品牌用花括号包起来,那么我们只需要
	//改写全参构造方法为:this.brand = "{"+ brand + "}";即可
	//无需为每一个构造函数都重新再写一遍,这就减少的工作量。
	
	
	public void runCar(){
		System.out.println("一辆价值" + this.price +"的" + this.brand +
				"跑车,在奔跑..." );
		
		
	}
	//实例方法,只有类对象被创建后,通过引用变量可以访问,不能直接用类名调用。
	
	
	public static void showCarcnt(){
		System.out.println("static method showCarcnt is invoked!");
		System.out.println("已经创建了"+ Car.instancecnt +"量汽车!");
		
		//this.price = 300000;
		//this.run();
		//静态方法不能访问实例属性和方法,因为静态方法能够被调用的时候,对象还未创建。
		//但是反过来,实例方法可以访问静态变量和静态方法,因为对象已经创建,类一定被加载,
		//静态变量和方法一定存在。
			
	}
	//静态方法只要类被加载,就可以被调用,不需要对象的存在
	//所以可以直接通过类名来调用,当然你想通过引用变量名来调用
	//也是可以的,只是效率不高容易误解。
	
	

}

/**
 * 
 */
package ljy.constructor;

/**
 * @author fshxxxyydys
 *
 */
public class ConstructorDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Car car = new Car();
		car.runCar();
		
		Car car2 = new Car("玛莎拉蒂");
		car2 .runCar();
		
		Car car3 = new Car(8888888);
		car3.runCar();
		
		Car car4 = new Car("玛莎拉蒂",8888888);
		car4.runCar();
		
		Car.showCarcnt();
		
		

	}

}

==========================================================

Result:

一辆价值8888888的玛莎拉蒂跑车,在奔跑...
一辆价值8888888的玛莎拉蒂跑车,在奔跑...
一辆价值8888888的玛莎拉蒂跑车,在奔跑...
一辆价值8888888的玛莎拉蒂跑车,在奔跑...
static method showCarcnt is invoked!
已经创建了4量汽车!

==========================================================

原创出处:http://blog.csdn.net/u012830807

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值