java面向对象基本知识
jvm将内存主要划分为:方法区,栈,本地方法栈,堆.程序计数器
方法区
又叫静态区,存放索引的class和static变量,方法区中包含的都是在程序中永远唯一的元素
存放方法常量,static变量类,的描述信息
虚拟机栈
执行引擎每调用一个函数时,就为这个函数创建一个栈帧,并加载入虚拟机.换个角度理解,每个函数从调用到执行结束,其实是对应一个栈帧的入栈和出栈
本地方法区
本地方法栈与虚拟机栈所发挥的作用很相似,他们的区别在于虚拟机为执行java方法服务,而本地方法栈,是为native服务
堆
被所有线程共享的一块区域,在虚拟机器启动时创建,所有的对象实例及数组都在堆上分配(使用new关键字,表示在堆中开辟一块新的存储空间)
程序计数器
每个线程有个计数器记录当前执行到哪个指令,可以把它看成是当前线程所执行的字节码的行号指示器
堆的数组与初始化
public static void main(String[] args) {
//1.int[]age声明了一个int类型的数组
//2.new int[]{10,20,30,40};在堆中初始化数组
//3.把初始化的地址赋值给了ages
int []ages=new int[]{10,20,30,40};
int []age2=ages;
//如果修改age2的值,ages的值也会跟着修改
age2[0]=6;
System.out.println(ages[0]);
}
int []ages=new int[]{10,20,30,40};
创建过程中可分为三步
1.声明int类型的数组ages int[]ages
2.在堆中初始化数组new int[]{10,20,3-}
3.把被初始化数组的地址赋值给ages变量
垃圾回收
java中存在自动垃圾回收机制,若堆中的内存空间没有被引用的时候,就会变成垃圾,等着垃圾回收
程序员不需要再动手控制内存的释放,当jvm发现内存的紧张的时候,会自动清理无用的垃圾
jvm的垃圾回收机制中,判断一个对象是否死亡,并不是根据是否还有对象对其有引用,而是通过可达性分析,对象之间的引用可以抽象成树形结构,通过树根作为起点,从这些树根下往下搜索,搜索过的链称为引用链,当一个对象,到树根没有任何引用链相连时,则证明这个对象是不可用的,该对象会被判定可回收的对象
先进后出
基本数据类型与引用数据类型
基本数据类型在堆中的默认值
基本数据类型共有八种
只有一块存储空间,在栈中存放的是具体的值
引用数据类型
引用数据类型有俩块存储空间一个在栈(stack中)一个在堆(heap)中.栈中存放的是堆中的地址
五种引用数据类型:类,接口,数组,枚举,注解
使用new关键字创建出来的类型都是引用数据类型
基本数据类型是值传递,引用数据类型是地址传递
匿名对象
创建一个对象没有把他赋值给任何一个变量,就叫做匿名对象,匿名对象只能使用一次
生命周期:创建new的时候生,匿名对象创建之后,没有任何人指向,就等着java的垃圾回收
构造器
在创建对象时自动调用的方法,我们称他是构造器
如果没有自己写构造器的时候,java编译成字节码会帮你创建一个构造器
如果给一个字段设置了默认值,这个值也是在构造器当中设置的.(编译成字节码之后会自动在构造器当中给类的成员变量赋值)
一个类中至少存在一个构造器
作用
创建对象,必须和new一起使用
完成对象的初始化操作
特点
构造器的名称是和当前类一样的
禁止有返回类型
在构造器当中不能使用return(构造器其实是由返回值的,它返回的是当前对象的地址)
如果类使用了public修饰,.它创建的默认构造器也会加上public
默认的构造器是没有参数的
自定义构造器
自己写的构造器,它就是属于自定义构造器
自定义了构造器编译器就不会帮你再去生成构造器
构造器重载
方法重载:方法名相同,参数不一样
构造器重载与方法重载一样,可以定义多个构造器,根据不同的参数调用不同的构造器
static
如果在字段和方法前加上了static,那么他就属于类,不属于对象
特点
static修饰的内容是随着类的加载而加载的
当jvm把字节码加载到虚拟机中,static他秀智的成员会自动的加载到内存当中(方法区)
static修饰的内容优先于对象存在
static修饰的内容,被所有对象共享
类成员和实例成员
类成员:使用static修饰的成员
实例成员:没有被static修饰的成员
在static方法中只能调用static成员
非static方法,可以访问静态成员,也可以访问非静态成员
可以用过对象调用静态成员,本质还是通过类名调用(编译成字节码时,会自动转换)
变量
成员变量:
直接定义在类当中的变量
类成员变量 在成员变量之前加static,就是类成员变量
实例变量没加static就是实例变量
在方法当中不能定义static的变量
成员变量有初始值,可以直接使用
局部变量:
定义在方法当中的变量(参数,和内部定义的变量,代码块)
必须要初始化之后才能使用
包
在开发中,存在几百上千个java文件,不可能都放在一个目录中,java可以创建一个类似文件夹的东西,我们称这个文件夹为包.
作用
把狗能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
如同文件夹一样,包采用了属性目录的存储方式,同一个包的类名是不同的,不同的包中的类的名字是可以相同的,当同事调用俩个不同包中相同类名的类时,应该家还是那个包名加以区别,因此包名可以避免冲突
包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类
语法package 包名.子包名.子子包名
包名定义
包名必须遵循标识符规范 全部小写
企业开发中,包名用公司 域名倒写
类的名称
类的简单名称:直接类名
全限定名称:包名.类名
import
可以用import来导包,也可以导入系统当中的包
静态导入:
把其它包里面的内容在本类当中使用,不需要使用类名调用,直接使用别的包里的方法import static类的全限定名称.改类中的static成员名在实际开发中,我们不建议使用静态导入,因为如此,分不清某一个静态方法或字段来源于哪个类