本文主要是介绍【JAVA学习】二.面向对象基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
二、面向对象基础
1.对象(object,instance):在内存中是一个内存块,用来表示相关联的数据,其中包括对象的属性和方法。
2.类(class):可以看作对象的模板,是对象的抽象。
3.一个类可以是另一个类的属性。
4.内存分析:
java虚拟机的内存可以分为三个区域:栈stack,堆heap,方法区method area。
栈:
- 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(局部变量,操作数,方法出口)。当一个方法被调用的时候该方法进栈,当该方法中又会调用其他方法时,再把其他方法进栈。其他方法执行完之后出栈,该方法继续执行。
- JVM会为每一个线程创建一个栈。线程执行完之后,这个栈就被关闭。
- 栈属于线程私有,不能实现线程间的共享。
- 先进后出,后进先出。
- 栈是系统自动分配,速度很快,是一个连续的内存空间。
堆 - JVM只有一个堆,被所有线程共享。
- 用于存储创建好的对象和数组(数组也是对象)。(new。。。就是放在堆里)
- 是一个不连续的空间,分配灵活但是速度慢。
方法区(静态区) - JVM只有一个方法堆,被所有线程共享。
- 实际上也是堆,只是用于存储类,常量相关的信息。
- 用来存放程序中永远不变或唯一的内容。(类信息,静态变量,字符串常量)
![在这里插入图片描述](/upload/202107/26/202107262206593411.png)
5.构造方法/构造器(constructor),用于对象的初始化。
- 构造方法和类名称一致,通过New关键调用。
- 虽然有返回值 ,但是不需要声明返回类型。
- 如果没有定义构造方法,编译器会添加一个无参构造器。如果已定义方法,则不会生成无参构造器!!!
6.构造方法重载
- 传入的参数和类中定义的属性名称一样,使用就近原则,表示的是传入的参数。如果这个时候想要表示类中的属性,需要在前面加this.。
- 构造方法的第一句总是super();
7.垃圾回收机制
有一个”服务员“GC,自动回收垃圾。
- 发现无用的对象。
- 回收无用对象占用的内存空间。
相关算法: - 引用计数法:每个对象有一个引用计数,被引用一次计数加一,被引用变量值变为null,计数减一。直至0变成无用对象。缺点是循环引用的无用对象无法识别。
- 引用可达法:把程序所有的引用关系看成一张图。
8.分代垃圾回收机制
将对象分为三种状态:年轻代,年老代,持久代。虚拟机将内存划为Eden,Survivor和Tenured
- 年轻代
所有新生成的对象首先放在Eden区,目的是尽可能快的手机掉生命周期短的对象,对应的是Minor GC。 - 年老代
在年轻代中经历了N(15)次垃圾回收后仍然存活的对象就会被放到年老代中。当年老代对象过多,就要启动Major GC和Full GC来一次大扫除,全面清理年轻代和年老代的区域。 - 持久代
用于存放静态文件,如Java类,方法等。
垃圾回收过程
- 新建的对象,大部分放在Eden中。
- 当Eden满了,触发垃圾回收机制(GC),将无用对象清理掉,然后剩余对象复制到某个Survivor中(S1),清空Eden区。
- 当Eden再次满了之后,将S1中不能清空的对象放在另一个Survivor中(S2),同时将Eden中不能清空的对象方在S1中保证Eden和S1均被清空。
- 重复多次Survivor中没有被清理的对象,放在年老代(Tenured)中
- 当年老代满了之后,触发一次完整的垃圾回收(Full GC),之前新生地的垃圾回收为(minor GC)
- 使用代码System.gc()可以建议启动GC,但是只是建议没有决定权
容易造成内存泄漏的操作
- 创建大量的无用对象
- 静态集合类的使用:HashMap,Vector等使用最容易造成内存泄漏,他们的生命周期和应用程序一致。
- 各种连接对象(IO流对象,数据库连接对象,网络连接对象)未关闭。
- 监听器的使用
9.对象创建的过程和this的本质
- 分配对象空间,并将对象成员变量初始化为0或空
- 执行属性值的显式初始化
- 执行构造方法
- 返回对象的地址给相关变量
this的本质就是创建好的对象的地址,在构造方法调用前,对象已经创建,所以在构造方法中可以使用this代表当前对象。
this不能用于static方法中,因为this指当前对象而static方法在方法区中。
10.static关键字(静态)
它声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同, 在整个应用程序执行期间都有效。static修饰的成员变量和方法从属于类,普通变量和方法从属于对象。
11.静态初始化块
构造方法用于对象初始化,静态初始化块用于类的初始化。在静态初始化块中不能直接访问非static成员。
初始化快的执行顺序和继承有关,上溯到Object类,先执行父类的静态初始化块。
static{
这里面不能调用非静态的方法和属性
}
静态快在类加载的时候执行,也就是在构造器之前执行。
这篇关于【JAVA学习】二.面向对象基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!