<1>. 操作系统为程序的运行分配所需要的内存,如果内存允许的情况下,一般进程申请多少内存操作系统就分配给多少内存。
进程和程序的概念基本上等同,一个程序的运行的时候就会产生一个进程,有的程序是有外观的,称为界面程序、
有的程序是只有命令行的,称为命令行程序、有的程序是连命令行都没有, 称为守护进程。
<2>.进程不是真正的运行单元(进程只是逻辑单位),真正的运行单元是线程。举个例子:进程好比一个班级, 班级里有许多学员,
如果要申请资源则是以班级为单位向上级申请,但是真正使用的是这些学员,学员可以理解为一个个的线程。一个进程必须
至少要有一个线程在工作,整个进程才能运行起来。
<3>.进程将获得的资源一部分分配给每个线程自身使用,这部分称为“栈”,一个进程所有的栈中至少要有一个main栈 ,
==========================================================
进程和程序的概念基本上等同,一个程序的运行的时候就会产生一个进程,有的程序是有外观的,称为界面程序、
有的程序是只有命令行的,称为命令行程序、有的程序是连命令行都没有, 称为守护进程。
<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量汽车!
==========================================================