Java 基础
J2EE-J2SE-J2ME区别
J2EE(Java 2 Platform Enterprise Edition)企业版
是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如 Servlet Jsp等,主要针对于Web应用程序开发。
J2SE(Java 2 Platform Standard Edition)标准版
是为开发普通桌面和商务应用程序提供的解决方案。该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。
J2ME(Java 2 Platform Micro Edition)小型版
是为开发电子消费产品和嵌入式设备提供的解决方案。该技术体系主要应用于小型电子消费类产品,如手机中的应用程序等。
JDK-JRE-JVM的区别
JVM(Java Virtual Machine Java虚拟机)
可以理解为是一个虚拟出来的计算机,具备着计算机的基本运算方式,
它主要负责将java程序生成的字节码文件解释成具体系统平台上的机器指令。
让具体平台如window运行这些Java程序。
JRE(Java Runtime Environment Java运行环境)
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,
如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK(Java Development Kit Java开发工具包)
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,
也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。
其中的开发工具包括编译工具(javac.exe) 打包工具(jar.exe)等
简单而言:使用JDK开发完成的java程序,交给JRE去运行。
三者关系:
JVM:将字节码文件转成具体系统平台的机器指令。
JRE:JVM+Java语言的核心类库。
JDK:JRE+Java的开发工具。
equal和“==”的区别
==:在直接值比较是比较值的大小,在引用值比较时比较值的地址是否相同
equal :比较值是否相等
windows和linux文件路径问题
windows平台:用\或\
linux平台:用/
main方法
1 |
|
public:表示此方法可以被外部所调用
static:表示此方法可以由类名称直接调用
void:主方法是程序的起点,所以不需要任何返回值
main:系统规定好默认调用的方法名称,执行的时候,默认找到main方法名称
String args [] :表示的是运行时的参数,参数传递的形式:java类名称 参数1 参数2 参数3..
常见的关键字
java注释
- 单行注释(line comment)用//表示
- 多行注释(block comment)用/**/表示
- 文档注释用/*/表示,是java特有的注释
java数据类型
基本数据类型
- byte/8
- char/16
- short/16
- int/32
- float/32
- long/64
- double/64
- boolean/~ boolean 只有true 和 false 用 1 bit 来存储
包装类型
基本类型都有对应的包装类,基本类型和其对应的包装类型之间的赋值使用自动装箱和拆箱完成,Java中的基本类型功能简单,不具备对象的特性,为了使基本类型具备对象的特性,所以出现了包装类,就可以像操作对象一样操作基本类型数据。
1
2Integer x = 2; // 装箱
int y = x; // 拆箱基本数据类型 对应的包装类 byte Byte short Short int Integer long Long char Character float Float double ouble boolean Boolean
缓存池
new Integer(123) 与 Integer.valueOf(123) 的区别在于:
new Integer(123) 每次都会新建一个对象;
Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
例如:Integer a = 10;
调用的就是Integer.valueof()方法(自动装箱调用这个方法)
默认的缓冲池的大小是-128到+127(可以在JVM的启动参数中修改)
valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。1
2
3
4
5public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}所有整数类型的类都有类似的缓存机制,基本类型对应的缓冲池如下:
boolean values true and false
all byte values
short values between -128 and 127
int values between -128 and 127
char in the range \u0000 to \u007F
String
1. 数字转字符串
- 使用string 类的valueof方法
- 将数字装箱为基本类型,调用tostring方法
1 |
|
2. 数字转字符串
调用Integer的静态方法parseInt
1 |
|
String Intern方法
仅考虑jdk1.8
如果字符串常量池不存在对应的常量,则将
修饰符访问权限
访问权限控制:
public > protected > default > private
所有->其他包的非子类无法访问->子类无法访问->仅限本类
类修饰符:
public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。
abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。
final,将一个类生命为最终(即非继承类),表示他不能被其他类继承。
friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类。
成员变量修饰符:
public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。
private(私有访问控制符)指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。
protected(保护访问控制符)指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量。
friendly ,在同一个包中的类可以访问,其他包中的类不能访问。
final,最终修饰符,指定此变量的值不能变。
static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。
transient(过度修饰符)指定该变量是系统保留,暂无特别作用的临时性变量。
volatile(易失修饰符)指定该变量可以同时被几个线程控制和修改。
方法修饰符:
public(公共控制符)
private(私有控制符)指定此方法只能有自己类等方法访问,其他的类不能访问(包括子类)
protected(保护访问控制符)指定该方法可以被它的类和子类进行访问。
final,指定该方法不能被重载。
static,指定不需要实例化就可以激活的一个方法。
synchronize,同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁。
native,本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的。
访问权限控制
访问权限控制: 指的是本类及本类内部的成员(成员变量、成员方法、内部类)对其他类的可见性,即这些内容是否允许其他类访问。
Class和Object类
Class类
Class类也是类的一种,内容是创建的类的类型信息,Class只能由JVM去创建,没有public构造函数。
获取Class对象的方法
1 |
|
Objetc类
1 |
|
编码
字符集和编码规范:
字符集: Unicode,为每个字符分配一个唯一的id(码点)
编码规范: UTF-8,将码点转换成字节序列的规则
多态和多态绑定
一个对象变量可以指示多种实际类型的现象称为多态,在运行时能够自动选择适当的方法称为动态绑定
理解方法调用
假设调用x.f(args),x声明为类C的一个对象,则调用方法的详细过程为:
- 编译器查看对象的声明类型和方法名,列举所有名为f的方法和父类中所有名为f的方法
- 确定方法调用中的参数类型,如果存在与提供类型完全匹配的方法,则选择这个方法,这个过程称为重载解析
为什么要重写hashcode和equals方法
- 重写equals方法是为了比较两个不同对象的值是否相等
- 重写hashCode是为了让同一个Class对象的两个具有相同值的对象的Hash值相等。
- 同时重写hashCode()与equals()是为了满足HashSet、HashMap等此类集合的相同对象的不重复存储。
java类加载器加载顺序
BootstrapClassLoader 启动类加载器,加载$JAVA_HOME中jre/lib/rt.jar
ExtensionClassLoader 标准扩展类加载器
AppClassLoader 系统类加载器 加载classPath下面的指定的jar包和class
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!