目录
1:垃圾回收机制
垃圾回收的原理和算法
1.内存管理,Java内存管理很大程度上是指的就是堆中对象的管理,期中包括对象空间的分配和释放
对象空间的分配:通过new关键字创建对象即可
对象空间的释放:将对象赋值为null即可。垃圾回收器负责回收所有”不可达“(没有变量引用)的对象的内存空间
2:垃圾回收过程
发现无用的对象
回收无用对象所占的内存空间
垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的就是没有任何变量 引 用该对象。Java 的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。
3:垃圾回收相关算法
1:引用计数法(引用是变量的别名)
堆中的每个对象都对应着一个引用计数器,当有引用指向它的时候,引用计数器+1,当指向该对象的引用失效的时候(引用变为null),计数器-1,当计数器为零的时候,垃圾回收器会认为该对象是无用对象,会对其进行回收。优点是算法简单,缺点是不能够识别循环引用的无用对象
public class Gc {
String name;
Gc time;
public static void main(String[] args){
Gc p=new Gc();
Gc p2=new Gc();
p.time=p2;
p2.time=p;
p=null;
p2=null;
}
}
2:引用可达法
比较复杂,这里不说
2:this关键字
this 的本质指的是当前对象的地址,在执行构造方法前对象就已经创建好了,所以在构造方法中,this也可也指当前对象
看下面的代码和运行结果
在第二个重载的构造器中,用this(id,name)调用了第一个构造器中的内容
且必须放在重载构造器的第一行
public class User {
int id;
String name;
String pwd;
public User(int id,String name){
System.out.println("正在初始化已经创建好的对象"+this);
this.id=id;
this.name=name;
}
public User(int id,String name,String pwd) {
//一个构造器调用另外一个构造器的时候用this关键字,并且只能放在第一行
this(id,name);
this.pwd = pwd;
}
void test(){
System.out.println("id是:"+id+" 名字是:"+name+" 密码是:"+pwd);
}
public static void main(String[] args){
User u1=new User(101,"卢鑫宇");
User u2=new User(1010,"卢鑫宇","1234567");
u1.test();
u2.test();
}
}
this不能用于static 中,static叫做静态方法,或者叫做类方法,用它限定的东西在静态区,而对象在堆区,this指向的对象在堆中,而static域不在堆中,所以无法指向,也就无法在static中使用this
详细看下面这一篇博客
(88条消息) Java 中为什么static方法中不能使用this关键字_Chain的博客-优快云博客
3:static 关键字
在类中用static修饰的成员变量为静态成员变量,也称为类变量,类变量的生命周期和类相同 ,它有如下特点:
1.从属于类,它被类的所有对象所共享,在类被载入时显式初始化
2.对于类的所有对象来说,该static成员变量只有一份,被所有的对象所共享
3.一般用类名.类属性/方法来调用
4.在static方法中不能访问非static成员
public class TestStatic {
int num;
String name;
static String company;
public void login(){
System.out.println(name+ "要登陆");
}
public static void printCompany(){
//在static方法中,不能访问非static成员
//login();
System.out.println(company);
}
public TestStatic(){
}
public TestStatic(int num,String name) {
this.num=num;
this.name = name;
}
public static void main(String[] args){
TestStatic t1=new TestStatic(101,"卢鑫宇");
t1.login();
//访问static成员
TestStatic.company="字节跳动";//通过类名来调用静态属性和方法
TestStatic.printCompany();
}
}
3:静态初始化块
构造方法用于对象的初始化,静态初始化块用于类的初始化。在静态初始化块中不能访问非static成员
4:变量的分类
变量分为局部变量,成员变量(实列变量),静态变量(类变量)
局部变量位于方法中或者语句块中,位于栈中,从属于方法或者语句块
成员变量位于堆中,从属于对象
静态变量位于方法区中,从属于类
public class TestStatic {
//成员变量
int num;
String name;
//静态变量
static String company;
static{
company="字节跳动";
printCompany();
}
public void login1(/*局部变量*/int num,String name){
//局部变量
this.num=num;
this.name=name;
System.out.println("id="+num+" name"+name);
}
public void login(){
System.out.println(name+ "要登陆");
}
public static void printCompany(){
//在static方法中,不能访问非static成员
//login();
System.out.println(company);
}
public TestStatic(){
}
public TestStatic(int num,String name) {
this.num=num;
this.name = name;
}
public static void main(String[] args){
TestStatic t1=new TestStatic(101,"卢鑫宇");
t1.login1(11,"古倪啷虚宇");
t1.login();
//访问static成员
TestStatic.company="字节跳动";
TestStatic.printCompany();
}
}
5:package,import关键字
package:我们通过package来实现对包的管理,package的使用有两个特点
1:通常是类的第一句非注释语句
2:包名是域名反过来写即可 如com.core ,再加上模块名(模块名是文件名去掉后缀)便于管理内部类
import:导入其他包中的类
如想使用输入的方法,应该导入Scanner这个类
import java .util.Scanner;
如果想导入util包下的所有类可以这样写,import java.util.*;但是编译的速度会慢