1.方法(即函数):method
声明一个方法:
权限修饰符+返回值类型+方法名
调用方法时需要调用者和被调用者是同等级
如用static修饰的main方法比未用static修饰的方法高一等级,则无法调用。
方法递归:方法自己调用自己。可能会造成内存溢出。
方法的重载:
Java中允许存在方法名相同的方法,但参数表不能相同
2.Java程序的内存分配:
方法区:
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。它存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。包含.class文件,方法的代码,静态成员,静态变量等。简单而言,就是存储类结构信息,信息里包含了有常量池信息,加载到JVM之后就变成了运行时常量池。
至于字符串常量池(串池)在jdk1.8之前和之后位置不同,1.8之前跟随运行时常量池在方法区,在1.8之后就独自在堆内存中。
JDK8之前,方法区就是永久代,JDK8以后,永久代被元空间取代,方法区就是元空间。元空间与永久代的区别在于元空间不在虚拟机中,而是位于本地内存。
栈:
存放基本数据类型和堆中对象的引用。方法运行时在栈中开辟内存,用来存放方法中的局部变量,局部变量发生改变时是对原值进行覆盖而不是新开辟空间,特点是“先进后出”。
堆:
堆是一种线程共享的内存区域,存储new出来的数组或对象,也存放类的成员变量。
本地方法栈:
jvm在调用操作系统功能时使用,与开发无关
在运行阶段,类加载器的作用就是在目录中找到具体的class文件,class文件就是被装在方法区中的。<br />![](https://cdn.nlark.com/yuque/0/2021/webp/21686270/1637764951883-b0de1206-2723-4d47-8af6-ad4b5678a73f.webp#clientId=u41186597-42a5-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ufd567429&margin=%5Bobject%20Object%5D&originHeight=331&originWidth=629&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u9e58ba13-f631-455f-ba16-93d6a498566&title=)
3.数组
引用数据类型:变量arr存储的是数组在栈内存中的地址值,而不是数组元素的值,变量arr通过内存地址引用堆内存中的数组,所以数组是引用数据类型。
//声明一个数组
String[] str = new String[10];
这种声明方法中,左边是声明了一个变量,放在栈内存中,右边是一个数组,放在堆内存中。
引用数据类型存放在栈内存中的是一串地址,指向堆内存中被new出来的部分,这是地址的指向。
基本数据类型存放在栈内存中的是值。
或者声明一个静态数组
int a[] = {10,20,30,40,50}
左右两边都存放在栈内存中
4.面向对象
特征:封装,继承,多态。
如一个包的对象要使用另一个包中类的属性,可以选择将被使用类的权限设置为public,但这会失去封装的意义,所以一般采用将类中变量设置为private,方法设置为public,通过方法调用变量(如getName和setName)。
可用this关键字指向本类的成员变量
构造方法:给对象的数据进行初始化。
构造方法格式:
———方法名与类名相同
———无返回值类型
如public user(){} //无参构造方法
//有参构造方法,作用是在创建对象时就给本类的属性赋值
public user(string name,int age){
this.name = name;
this.age = age;
}
//this指向的是本类的成员变量name,右边的name是传过来的参数。
所有的类,若是不写构造方法,都会自带一个无参构造方法,若是写了构造方法,则会覆盖掉自带的无参构造方法。
构造方法也可以重载,建立不同参数表的构造方法,根据所传参数来选择调用其中某一个构造方法。
创建一个对象:
class Animal
Animal cat = new Animal()
类名+对象名 = new 类名()