《JAVA300集》基础知识
目录
JAVA面向对象基础
(1)Java虚拟机(JVM)
实际上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。Java虚拟机是Java能够实现跨平台编译的重要原因。
Java虚拟机的内存分为三个区域:栈stack、堆heap、方法区method area。
栈的特点- 1.栈描述的是方法执行的内存模型。2.每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。3.栈的存储特性是“先进后出,后进先出”。 4.栈属于线程私有,不能实现线程间的共享。
堆的特点- 1.堆用于存储创建好的对象和数组(数组也是对象)。 2.堆是一个不连续的内存空间,分配灵活,速度慢。 3. JVM只有一个堆,被所有线程共享。
方法区的特点- 1.JVM只有一个方法区,被所有线程共享。 2.方法区实际也是堆,只是用于存储类、常量相关的信息(用来存放程序中不变或唯一的内容)。
(2)Java的垃圾回收机制
内存管理:1.对象空间的分配:使用new关键字创建对象即可; 2.对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有”不可达”对象的内存空间。
垃圾回收算法要点:1.发现无用的对象 2.回收无用对象占用的内存空间。
常用算法:引用可达法(根搜索算法)。
(3)分代垃圾回收机制
不同的对象的生命周期是不一样的,因此,不同生命周期的对象可以采取不同的回收算法。
对象被分为三种状态:年轻代、年老代、持久代。
年轻代:所有新生成的对象,都存放在堆内存中的Eden区。
年老代:超过15次(默认值)垃圾回收后仍然存活的对象,存放在堆内存中的Tenured/Old区。
(年轻代和年老代之间的过渡期,存放在堆内存中的survivor区)。
持久代:用于存放静态文件,如Java类、方法等。
垃圾回收机制(Garbage Collection)可以简称为GC。
Minor GC: 用于清理年轻代区域。当Eden区满就会触发一次Minor GC,清理无用对象,将有用对象复制到Survivor1或Survivor2区。(Survivor1和Survivor2大小空间相同,但是同一时刻只有一个在用,一个为空。)
Major GC:用于清理年老代区域。
Full GC:用于清理年轻代、年老代区域,成本较高。(当Tenured/Old区满了,则会触发一个一次完整地垃圾回收(FullGC))
(补充:为什么有两个survivor区?刚刚新建的对象在Eden区中,经历一次Minor GC,Eden区中的存活对象就会被移动到第一块survivor space S1,Eden区被清空;等Eden区再满了,就再触发一次Minor GC,Eden区和S1中的存活对象又会被复制送入第二块survivor space S2(这样保证了S2中来自S1和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生),然后S1和Eden被清空,然后下一轮S1与S2交换角色。)
(4)开发中容易造成内存泄露的操作
1. 创建大量无用对象。
2. 静态集合类的使用。
3. 各种连接对象未关闭。
4. 监听器没有删除。
(5)this关键字
this的用法:(1)消除二义性,this来指明当前对象。 (2)重载构造方法,但不能用于static方法。
public class Test1{
int a,b,c;
Test1(int a, int b){
this.a = a; // 错误写法 a = a
this.b = b;
}
Test1(int a, int b, int c){
this(a,b); // 必须第一句,调用上一个Test1构造方法
this.c = c;
}
public static void main(String[] args){
Test1 number = new Test1(2,3);
Test1 number2 = new Test1(2,3,4);
System.out.println(number.a);
System.out.println(number2.a);
}
}
(6)static关键字
在类中,用static声明的成员变量为静态成员变量,也称为类变量,生命周期和类一样长。而普通变量和方法是属于对象的。
特点:(1)对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享。 (2)在static方法中不可直接访问非static的成员。 (3)一般用“类名.类属性/方法”来调用。
静态初始化块-用于类的初始化操作,注意在静态初始化块中不能直接访问非static成员。
public class User {
int id;
String name;
static String company; //公司名称
static {
System.out.println("执行类的初始化工作");
company = "北京尚学堂";
printCompany();
}
public static void printCompany(){
System.out.println(company);
}
public static void main(String[] args) {
User u1 = new User();
}
}
(7)包机制(package)
包是Java中用来管理大量同名的类。
包的两个要点:(1)通常是类的第一句非注释性语句。 (2)包名:域名倒着写,再加模块名。
package com.jd.test;
public class Test {
public static void main(String[] args) {
System.out.println("京东的域名");
}
}
//注: com.jd.test和com.jd没有任何关系
(8)导入类import
1. Java会默认导入java.lang包下所有的类。
2.如果导入两个同名的类,只能用包名+类名来显示调用相关类
import com.jd.test.Test // 导入com.jd.test包里的Test类
import com.jd.test.* // 导入com.jd.test包里所有的类
3. 静态导入(static import)的作用是用于导入指定类的静态属性,这样可以直接使用静态属性。
本文地址:https://blog.csdn.net/Amigo_1997/article/details/110501023