在idea中创建一个新文件,名称为Hello.java
其中,Hello就是一个类,main是这个类里面的方法,这意味着我们在学习的时候已经在使用类了。
对象和类
- 一、概念
- 二、⭐内存分配机制分析
- Ⅰ、基本内存结构
- ⭐⭐Ⅱ、调用类方法的内存分析(栈思想)
一、概念
简单性解释:类是一个模板,对象是根据这个模板创建的(专业语法:类的实例)。
看图就懂了:
上代码:
//建立一个类
class Dog{//类的属性:可以为基本数据类型,也可以为引用类型(数组、对象)String breed; //品种String size; //大小String name; //名字//类的方法:方法修饰符有public、private等,后期在写笔记void eat(){System.out.println("吃东西");}void run(){System.out.println("跑步");}void sleep(){System.out.println("睡觉");}
}public class Hello{public static void main(String args[]) {//用类去创建一个对象Dog Dog1 = new Dog();//赋值属性Dog1.breed = "博美"; Dog1.size = "小型犬";Dog1.name = "来福";//调用方法Dog1.eat();Dog1.run();Dog1.sleep();}
}
结果:
拿人这个群体来举例的话,人类就是一个抽象集合(属性包括姓名、性别、年龄,方法包括吃饭、睡觉),我们每个人都是根据人类这一个模板来创建的,都有姓名、性别、年龄,都会吃饭、睡觉,因此是具体的。(很简单的理解就可以了,没必要记繁杂的专业解释!!!)
注意细节:
1、访问里面的属性、方法是用 对象名.属性(方法)进行访问。
2、属性如果不赋值,有默认值。(和数组一样)
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | \u0000 |
boolean | false |
String | null |
二、⭐内存分配机制分析
Java内存结构(简单版)
1、栈:一般存放基本数据类型(局部变量)
2、堆:存放对象(数组、Dog1对象)
3、方法区:常量池(常量,比如字符串),类加载信息
对下面的代码进行内存分析:(步骤看代码,一定要看啊,朋友们,和数组其实很像)
Ⅰ、基本内存结构
//用类去创建一个对象(采用先声明,在创建的方式,方便演示步骤而已)
//1、先加载Dog类信息到方法区,包括属性和方法,只会加载一次
Dog Dog1;
//2、new Dog():类为引用类型,在堆中分配空间,进行默认初始化
//3、把步骤2创建的对象地址赋给Dog1,此后Dog1指向这个对象
Dog1 = new Dog();//4、进行指定的初始化
Dog1.breed = "博美";
Dog1.size = "小型犬";
Dog1.name = "来福";Dog Dog2 = new Dog(); //这里不在加载Dog信息,因为只加载一次就可以了
如果看过13、数组(一维、二维用图形化的方式解析内存空间⭐)这篇文章就会发现,在堆区中发生了变化,为什么里面的breed、size、name存放的是一个地址呢?因为这几个变量是String类型(引用类型),所以里面存储的是相关值的地址,然后通过这个地址在指向“博美”、“小型犬”、“来福”这几个值。
这里提示,String类型有点特殊,它的值是存放在变量池的,当我们赋值Dog1.breed = “博美”,JVM首先会在常量池中找有没有“博美”这个字符串,若有则直接指向该地址,若无会在常量池创建一个新的字符串,然后指向该字符串的地址,推荐去看这个链接:java字符串内存 java中字符串存在哪里
⭐⭐Ⅱ、调用类方法的内存分析(栈思想)
需要用到栈的一点知识:栈是先进后出的,意味着,最后进来的反而最早出去。
这里只演示方法的调用,还没有涉及方法里面的值传递和引用传递,下一篇在写这个,这里只简单展示栈的变化。
每次调用方法都会在栈区开辟一块新的区域给这个方法,内存图中的栈名都是按演示方便取得,不要在意哈哈哈。
①首先展示的是只在main()方法里面调用Dog类方法的情况:
②这里展示的是先在main()方法中访问Dog类的方法,然后Dog类中的方法在访问Dog类自身方法的情况:
其实很简单的,只要你学过栈,就能简单理解成每次调用一个方法都要进栈,执行完该栈中的代码之后就要出栈,就ok了。
下一篇文章写类方法中的值传递和引用传递,这篇文章的进出栈图都是简单举例,还没有任何修改类属性的步骤。
本人正在B站跟着韩顺平老师学Java(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。
大家一起学,一起进步!!
各位宝子们如果觉滴还不错的话,可以点个赞 or 收个藏 or 打个赏哦,佛系博主一个。