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成员名在实际开发中,我们不建议使用静态导入,因为如此,分不清某一个静态方法或字段来源于哪个类

Last modification:February 25, 2020
如果觉得我的文章对你有用,请随意赞赏