Java基础

这一博客是在回顾之前学习的知识时,随手记的笔记,铁汁们可以提出建议一起来探讨哇!

Java语言中只有值传递

对于基本的数据类型和String类型的数据,Java在传值时,直接传递的是值本身,例如

int i = 1;
int j = i;

执行j = i时,直接将i的值1传递给j。

对于引用型的数据,在进行值传递时,传递的是对象的引用值。例如

Student stu1 = new Student();
stu1.id = 001;
stu1.age = 18;
Student stu2 = stu1;

在执行完stu2 = stu1;后,对象stu2的id和age值分别为001和18,但并非在传递时是将id和age的值直接传递给stu2,而是将stu1所指向的引用传递给stu2,stu1和stu2指向的是同一个引用值,因此在修改了stu2的值后,stu1的值也会改变。

Java的垃圾回收机制

垃圾回收线程是在程序运行开始就产生的,但是并不是一直执行,而是等待,知道调用了System.gc()方法时或感觉到JVM内存紧张时才会触发回收方法

要了解Java的垃圾回收机制,要首先了解Java的内存区域。Java的内存区域分为虚拟机栈、本地方法栈、程序计数器(寄存器)、方法区、堆,其中虚拟机栈(其中包含栈帧,栈帧是用于JVM中进行方法调用和方法执行的数据结构,栈帧中包含了局部变量表、操作数栈、动态连接和返回返回地址)、本地方法栈(本地方法栈和虚拟机栈最大的区别就是虚拟机栈是为非虚拟机执行Java方法服务的,而本地方法栈是为虚拟机执行Native方法服务的)、程序计数器都是伴随着线程的产生和销毁而产生和销毁,无需管理(常说的“栈内存”是指虚拟栈,或更准确的说是虚拟机栈中的局部变量表部分),因此垃圾回收集中在了方法区和堆中,这一部分是随着程序的运行而动态分配的。

在JVM中,垃圾回收主要有两种算法,引用计数法可达性分析法

引用计数法是给对象添加一个计数器, 当增加一个引用时,计数器加1,当有引用失效时,计数器减一,直到计数器减为0时,说明已没有实体指向了该引用,该引用失效,等待被回收。引用计数法简单高效且易于理解,但是引用计数器的缺点是无法检测对象之间的相互引用,当A对象和B对象之间有相互引用,其他的引用都消失后,A和B还有一个相互的引用,他们的计数器都为1,永远无法降为0,因此就无法被回收,造成了无法对内存彻底的清理,因此在JDK1.2之后,改用了可达性分析法。

可达性分析法是通过一个GC ROOTS的Set集合中,从其中的GC ROOT开始向下搜索(对象之间的关系可以理解为一张图),搜索走过的路径称为引用链,当一个对象待所有的GC ROOT都搜索完,仍没有被搜索到时,说明该引用已经失效,即为不可达的对象,将会被回收。这种方法成功的解决了对象之间的相互引用的问题。在Java语言中,可作为 GC Roots 的对象包括下面几种:
a. 虚拟机栈(栈帧中的本地变量表)中引用的对象。
b. 方法区中类静态属性引用的对象。
c. 方法区中常量引用的对象。
d. 本地方法栈中 JNI(Native方法)引用的对象

https://blog.csdn.net/w372426096/article/details/81360083

对象间的关系

依赖、关联、聚合、组合

依赖

依赖是类之间最若的相互关联的关系,是类和类之间的连接,一个类作为另一个类的局部变量,方法的参数,方法的返回值。如当A类的内部有方法的参数为B类,说明A依赖于B。

关联

关联关系是一个类拥有另一个类的关系,是一个类作为另一个类的成员变量。如当B类为A类的成员变量时,称A关联B

聚合

聚合是一种更强的关联关系,关联关系的两个类是同一等级的对象,但聚合关系是整体和个体的关系,例如汽车和引擎、轮胎就是类似于聚合的关系。聚合和关联关系的表现形式相同,都是一个类作为另一个类的成员变量,如B类为A类的成员变量,但聚合关系中,A是整体,B是整体中的部分。

聚合关系是一种不稳定的包含关系,聚合类不必对被聚合类负责。

组合

组合关系是一种比聚合关系更强的关联关系,组合关系中,组合类负责被组合类的生命周期,在某些特定的情况下,组合类需要将存活的被组合类湮灭,或者将被组合类对象传递给另一个对象,由后者来负责被组合类对象的生命周期,因此被组合类对象在同一时刻只能鱼一个类发生组合关系。

组合关系是一种强烈的包含关系,组合类负责被组合类的生命周期。

this关键字不能调用static关键字修饰的方法
this关键字所代表的其实是一个对象,而类方法不依附于对象,因此就无法使用this关键字访问static修饰的方法
内部类

成员内部类的成员变量和成员方法不能以static修饰

在成员内部类中需要注意的是,成员内部类中的成员变量和方法均不能以static修饰,因为在类进行加载时,static变量和方法就会被显示的初始化,因此内部类的static变量和方法在其外嵌类对象还未生成时就已经被初始化,这样的内部类就脱离了外嵌类,违背了内部类的定义。

有一种特殊的情况,成员变量可以由static修饰,当成员变量被定义为静态只读常量,如static final int i = 5;static final String s = "innerClass";,但是不能定义为static final String s2 = new String("");

局部内部类不能由权限访问符修饰,且局部内部类只能访问所在局部的变量,而不能修改,因为局部内部类在访问所在局部的变量时,会默认认为变量是由final修饰的。

Lambda表达式

lambda表达式是JDK8的新特性,是函数式接口实现的一种语法糖。函数式接口就是只含有一个函数的接口或者抽象类中只有一个未实现的抽象方法,可以使用lambda表达式实现。

Java线程

什么是线程?

线程是一个独立分派和调度的基本单位,是操作系统能够调度的最小单位。

进程和线程之间有什么关系?

进程是一个程序的执行过程,一个进程中包含多个线程。进程是资源分配的最小单位,线程是CPU能调度的最小单位。

线程的状态,状态之间的转换

线程有五种状态,开始、就绪、运行、阻塞、死亡,状态之间的转换如下图所示:
线程的状态
** 同一个进程中的线程共享的资源有哪些?线程独享的资源有哪些?**

共享的资源

堆:堆是在静态文件中开辟出来的,所以堆是被线程所共享的。堆中存放的都是new出来的对象,new出来的对象是线程共享的;

全局变量:全局变量是与函数无关的变量,它不局限于某个线程,因此也是线程无关的

静态变量:虽然有的静态变量是出于局部变量一样,但其性质不同于局部变量,其存放位置和全局变量是一样的,均存于堆中开辟的.bss和.data段,因此静态变量也是线程共享的。

文件等公共资源:使用文件等公共资源的线程之间必须同步,不然容易造成同时写入导致前者写入的内容被覆盖,因此这些理所应当是共享的。

独享的资源

栈:栈中主要保存的是基本数据类型和对象的引用,但对象的实体并没有保存在栈中。栈中还保存方法的局部变量,当进入一个方法,就会为该方法分配一个存储空间,即为栈,存储该方法的局部变量,随着方法的结束,这部分存储空间也会被释放。栈中的资源是线程独享的。

Java的特性

Java语言最重要的三大特性:封装、继承、多态

Java语言的优势:面向对象、平台无关性(可移植性)、多线程、高性能、分布式、安全性、健壮性、动态性 https://www.cnblogs.com/javaupup/p/14238646.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值