类和对象简单概述
简单来说,对象就是一个事物。它是真实存在的,比如现实生活中的手机,冰箱,电视.....那么类就说对象的抽象概念。
什么是类?类就是一个实际中的一类具有共同属性和一定行为的事物的抽象。也就是说,类是对象的抽象,对象就说类的实体。
举个列子:定义一个手机类
手机类{
属性:品牌名称
属性:价格
行为1:拨打电话
行为2:上网
}
这里的属性就可以理解成程序里面的变量,行为就可以理解成程序里的函数。它的定义和实现都是在这个类里面完成的,如果把类实体话就说这个手机,类里面的程序就是这个对象的功能。所以类具有封装性。
所以说对象类就包括成员属性和成员函数,需要注意的是:成员函数与一般函数的区别是少了static。
对象的声明
声明方式:
类名 对象名 =new 类名()
与c++不同的是,java的main函数可以直接定义在类里面,但是为了好看一般会在该包下新建一个java.class,在这里面定义main函数。
单个对象的底层逻辑
举个列子:
这是关于手机类的代码
这是实现main函数的代码
需要明白的常识是,所有程序都说从main函数开始执行的,所以main函数首先放在栈内存里面。在new出一个对象后,会把这个对象放在堆内存里面,返回的则是它的地址。因为类是一个集合,所以这个声明的对象它的类里面的属性都有一个默认值(字符串null,双精度浮点型0.00)。
在main中执行下列这条语句: 即是在main函数中找到了对象的地址,输出的则是这个对象的整体地址。
System.out.println(phone1);
给对象赋初始值,由于加上后缀,寻找的就是精确的属性
phone1.name="华为手机";
phone1.price=2999.9;
成员函数进行压栈
phone1.call(phone1.name);
通过debug调试可以清楚看见实现过程:
首先main函数压栈,成员属性初始化
对象后面加上后缀就可以修改成员属性
成员函数压栈
来个简单的图列演示
new多个对象的底层逻辑
参照上文,就是在堆内存中new的一个对象,返回的是不同的地址。
局部变量和成员变量的区别
成员变量就是定义在类中函数外的变量。
局部变量就说定义在函数里的变量。
局部变量的生命周期就是在函数执行完毕后结束,成员变量则是对象消失则消失。
局部变量没有初始值,成员变量就有默认初始值。
另外需要说的是,例如:Phone phone=new Phone() 这里的new Phone放入了堆内存,phone则进入栈内存,这里的phone对象就是一个局部变量。因为我们定义的Phone类对象实在函数里面定义的(例如main函数),因为局部变量的变量名在同一个函数中不能同时存在多个。例如我在定义个 Phone phone=new Phone()肯定会报错。
用完的对象怎么处理?这里会用到一个单独的CG线程,来处理堆内存里的不可用的对象
ps:函数里面传递的形参也属于局部变量,也就是说形参和该函数里定义的变量名不能一样