JVM、JRE、JDK三者的关系
jvm(java virtual machine):Java虚拟机,负责解释运行Java字节码,边解 释边运行。
jre(java runtime environment):运行Java程序所必须的环境集合,包含jvm标准实现及Java核心类库。
jdk(java development kit):Java的开发工具,包括了Java运行环境jre、Java工具和Java基础类库。
Java语言的特点
- Java是一种面向对象的语言
- Java通过Java虚拟机实现了平台无关性,一次编译,到处运行
- 支持多线程
- 支持网络编程
- 具有较高的安全性和可靠性
Java和C++的区别
- Java通过Java虚拟机实现跨平台特性,而C++依赖于特定的平台
- Java没有指针,它的引用可以理解为安全指针,C++具有和C一样的指针
- Java支持自动垃圾回收,而C++需要手动回收
- Java不支持多重继承,只能通过实现多个接口来达到相同的目的,而C++支持多重继承
Java的基本数据类型
自动装箱与拆箱
自动装箱:调用valueOf()来实现将基本数据类型转化为包装类
Integer i = 100;
Integer i = Integer.valueOf(100);
自动拆箱:调用xxxValue()实现将包装类转化为基本数据类型
Integer i = 100;
int j = i;
int j = i.intValue();
String(不是基本数据类型)
String的不可变性:在Java8中,String内部使用char数组存储数据。并且被声明为final,因此它不可被继承。
为什么将String设计为不可变性:
- 可以缓存hash值
- 常量池优化
- 线程安全
3. String和StringBuffer、StringBuilder的区别?
String:String的值被创建后不能修改,任何对String的修改都会引发新的String对象生成。
StringBuffer:跟String类似,但是值可以被修改,使用synchronized来保证线程安全。
StringBuilder:StringBuffer的非线程安全的版本,没有使用synchronized,具有更高的性能,推荐优先使用。
性能:StringBuilder>StringBuffer>String
static关键字
static关键字的主要用途就是方便在没有创建对象是调用方法和变量和优化程序性能
1.static变量(静态变量)
用static修饰的变量被称为静态变量,也被称为类变量,可以直接通过类名来访问它。静态变量被所有的对象共享,在内存中只有一个副本,仅当在类初次加载时会被初始化,而非静态变量在创建对象的时候被初始化,并且存在多个副本,各个对象拥有的副本互不影响。
2.static方法(静态方法)
static方法不依赖于任何对象就可以进行访问,在static方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用,但是在非静态成员方法中是可以访问静态成员方法/变量的。
public class Main {
public static string s1 = "s1";//静态变量
string s2 = "s2";
public void fun1(){
system.out.print1n(s1);system.out.print1n(s2) ;
}
public static void fun2(){
system.out.print1n(s1);
system.out.print1n(s2);//此处报错,静态方法不能调用非静态变量
}
}
3.static代码块(静态代码块)
静态代码块的主要用途是可以用来优化程序的性能,因为它只会在类加载时加载一次,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。如果程序中有多个static块,在类初次被加载的时候,会按照static块的顺序来执行每个static块。
重载和重写的区别
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则)﹔如果父类方法访问修饰符为private则子类中就不是重写。