- Java语言特性
简单性
解释性
面向对象
高性能
分布式
多线程
健壮性
动态性
安全性
跨平台
移植性
以上,加粗的是Java里比较重要的几个特性。
-
跨平台原理
跨平台:开发的软件在任何操作系统上都能安装并运行
Java虚拟机JVM,由JVM来负责Java程序在该系统中的运行。 -
JRE和JDK的概述
JRE包括JVM和Java程序所需的核心类库,如果想要运行一个开发好的Java程序,只要安装JRE即可。
JDK是提供给开发人员使用的,其中包含了Java的开发工具,也包括了JRE。
java的开发工具有:编译工具javac、打包工具jar等
JDK = JRE + JAVA的开发工具
JDK = JVM + 核心类库 + Java开发工具(javac,jar……)
JDK是用于java程序的开发,而JRE是只能运行class而没有编译的功能。
- Java程序运行流程
- 编写.java文件
- 编译.java文件,获得.class文件
- 运行.class文件 看到效果
- Java中常量的分类
- 字面值常量
字符串常量 用双引号括起来的内容
整数常量 所有整数
小数常量 所有小数
字符常量 用单引号括起来的内容,里面只能放单个字符
布尔常量 true和false
空常量 null - 自定义常量
- Java的垃圾回收机制
Java会自动回收无用对象占用的内存空间,使该空间可被程序再次使用。
变量名(存一个地址,堆里的地址) 栈
对象 堆
无用:栈里面没有一条线指向堆里面了,堆里面的对象没有被引用了,就无用了。
变量名指向一个对象。
变量不要了,这个指向就不存在了,堆里的对象会被系统自动回收。
- 一个对象内存图分析
示例代码:
/**1. 在同一个文件内,不能有2个public的class
**2. 同一个包内,不能有相同的类
**/
public class Demo{
public static void main(String[] args){
Person p = new Person();
p.name = "Cynthia";
}
}
class Person{
String name;
public void speak(){
System.out.println("I am" + name);
}
}
栈区、堆区、方法区
首先main方法进栈
main方法里面有一个p变量,此时需要new一个person,在下面的堆区⬇️,之后把p变量指向这个new出来的对象。
接下来执行speak方法,方法进栈。
栈区:
main方法
p变量
speak方法
在执行main方法的时候,因为main方法属于Demo类,所以要用到这个类,所以要先把Demo类加载到方法区里面。
把这个Demo类的字节码(Demo.class)加载到方法区。这个字节码里面就有main方法,所以main方法也加载了。
main方法接下来用到了Person这个类,所以把Person的字节码加载进来。
此时的方法区:
Demo.class{
main方法
}
Person.class{
name属性
speak方法
}
堆区:
new Person{
name = null 刚new出来的,name属性为空
}
speak执行完,弹出栈。此时main也执行完了,所以main方法出栈。
此时堆的对象什么时候释放,不用管,java在某一个时刻,会自动回收。
- 两个对象内存图分析
示例代码:
public class Demo{
public static void main(String[] args){
Person p1 = new Person();
p1.name = "Cynthia";
Person p2 = new Person();
p2.name = "myname";
}
}
class Person{
String name;
public void speak(){
System.out.println("I am" + name);
}
}
栈区、堆区、方法区
说一下和上面一个对象时,不一样的地方:
main方法里面有一个p1变量,此时需要new一个person,在下面的堆区⬇️,之后把p1变量指向这个new出来的对象。
然后speak方法进栈,执行speak方法,执行完毕弹栈。
再往下执行,又有一个p2变量,同样new出来一个person,在堆区,p2指向对象。
然后又遇到speak方法,进栈、执行、弹栈。
然后main方法执行完了,先弹出p2,再弹出p1,之后弹出main方法。
- 匿名对象
直接new一个对象并使用,并没有把它赋值给一个变量,这样的对象叫做匿名对象。
使用场景:只需要使用一次该对象的场合。
网友评论