JVM是运行Java字节码的虚拟机,针对不同系统有特定的实现(Windows,Linux,MacOs)。
JDK是功能齐全的Java SDK,包括JRE和编译器(javac)和工具(如javadoc和jdb)。能够创建和编译程序。
Jre是Java运行环境,他是运行已编译Java程序所需要的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构建。但是不能用于创建新程序。
在Java中,JVM可以理解的代码就叫字节码(即扩展名为.class的文件),它面向虚拟机,而不是特定的处理器。因此,Java程序无须编译便可在多种不同的 *** 作系统的计算机上运行。
.java --> javac编译 --> .class文件 --> 解释器 & JIT --> 机器可理解的代码 --> 系统OS
- 需要注意的是,
.class->机器码
这一步,是JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行。所以说Java是解释与编译共存的语言。
共同点:
- Java和C++都是面向对象的语言,都支持封装、继承、多态。
不同点:
- Java不提供指针来直接访问内存,更加安全
- Java的类是单继承,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承
- Java有自动内存管理垃圾回收机制(GC),不需要程序员手动释放内存
- C++同时支持方法重载和 *** 作符重载,但是Java只支持方法重载( *** 作符重载增加了复杂性,这与Java最初的设计思想不符)
- 形式:字符常量是单引号引起的一个字符,字符串常量是双引号引起的0个或若干个字符
- 含义:字符常量是一个整型值(ASCII值),可以参见表达式运算;字符串常量代表一个地址(该字符串在内存中的存放位置)
- 占内存大小:字符常量只占两个字节;字符串常量占若干个字节
标识符是名字,关键字是被赋予特殊含义的标识符
静态方法为什么不能调用非静态成员?- 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才会存在,需要通过类的实例对象去访问。
- 在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法 *** 作。
- 调用方式:在外部调用静态方法时,可以使用
类名.方法名
的方式,也可以使用对象.方法名
的方式,而实例方法只有后面这种方式。也就是说,调用静态方法无需创建对象。但是,一般不用对象.方法名
的方式调用,因为静态方法不属于类的某个对象而是属于这个类。 - 访问类成员是否存在限制:静态方法在访问本类成员时,只能访问静态成员(即静态变量和静态方法),不允许访问实例成员(即实例成员和实例方法),而实例方法不存在这个限制。
重载是同样的一个方法能够根据输入数据的不同,做出不同的处理
重写就是当前子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆
盖父类方法
重载:
- 同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。
重写:重写发生在运行期,是子类对父类允许访问的方法的实现过程进行重新编写。
- 方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或者相等,抛出的异常范围小于等于父类,访问修饰符大于等于父类。(两同两小两大)
- 如果父类方法访问修饰符为
private/final/static
则子类就不能重写该方法,但是被static
修饰的方法能够再次被声明 - 构造方法无法被重写
综上:重写就是子类对父类方法的重新改造,外部样子不变,内部逻辑可以改变。
区别 | 重载方法 | 重写方法 |
---|---|---|
发生范围 | 同一个类 | 子类 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可修改 | 子类方法返回值类型小于等于父类方法返回值类型 |
异常 | 可修改 | 子类异常类小于等于父类异常类 |
访问修饰符 | 可修改 | 一定不能做更严格的限制(可以降低限制) |
发生阶段 | 编译器 | 运行期 |
从Java5开始,Java支持定义可变长参数。可变长参数只能作为函数的最后一个参数,但其前面可以有也可以没有其他参数,可变长的范围指的是0个或者多个。
8种基本数据类型基本类型 | 位数 | 字节 | 默认值 | 取值范围 |
---|---|---|---|---|
byte | 8 | 1 | 0 | |
short | 16 | 2 | 0 | |
int | 32 | 4 | 0 | |
long | 64 | 8 | 0L | |
char | 16 | 2 | ‘u0000’ | |
float | 32 | 4 | 0f | |
doule | 64 | 8 | 0d | |
boolean | 1 | false |
注意:
- Java里使用long类型的数据一定要在数值后面加上L,否则将作为整型解析。
char a = 'h'
char:单引号,String a = "Hello"
String:双引号。String不是基本数据类型
- 包装类型不赋值就是
null
,而基本类型有默认值且不是null
- 包装类型可用于泛型,而基本类型不可以
- 基本数据类型的局部变量存放在Java虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被
static
修饰)存放在Java虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有的对象实例都存在于堆中。 - 相比于对象数据类型,基本数据类型占用的空间非常小。
注意:基本数据类型放在栈中是一个常见的误区!基本数据类型的成员变量如果没有被static
修饰的话(不建议这么使用,应该使用基本数据类型对应的包装类型),就放在堆中。
equals
与 ==
所有包装类对象之间的比较,全部使用equals
方法比较
说明:对于
Integer var = ?
在-128至127之间的赋值,Integer
对象是在IntegerCache.cache
产生,会复用已有对象,这个区间内的Integer
值可以直接使用==
进行判断,但这个区间外的所有数据,都会在堆上产生,并不会复用已有对象,所以,推荐使用equals
进行判断。
举例:
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// 输出 true
Float i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// 输出 false
Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// 输出 false
- 两种浮点类型的包装类
Float
,Double
并没有实现常量池技术。
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2); //输出 false
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是常量池中的对象。而Integer i2 = new Integer(40)
会直接创建新的对象。
- 装箱:将基本数据类型用他们对应的引用类型包装起来
- 拆箱:将包装类型转换为基本数据类型
举例
Integer i = 10; //装箱
int n = i; //拆箱
参考:
https://javaguide.cn/java/basis/java-basic-questions-01.html
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre
https://www.educba.com/oracle-vs-openjdk/
https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)