JDK,JRE,JVM的区别与联系
JDK (Java Development Kit) 包含JRE (Java Runtime Environment )和一些开发工具包,JRE包含JVM (Java Virtual Machine) 和一些核心类库
字节码,编译器,解释器,字节码
- Java源代码经过编译器编译后成为字节码
- 字节码经过JVM中的解释器解释之后成为机器码
- 源代码和字节码是平台无关的,机器码和JVM是平台有关
基本数据类型以及范围
- float单精度类型,精度是8位有效数字;double是双精度类型,默认为17位有效数字
- 小数默认为double类型,除非在后面注明F
- 无法直接将double类型的小数赋予Float,这是窄化转换
- Math.round四舍五入的原理是在参数上加 0.5 然后进行向下取整
- Long型无法使用在switch上
- 基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面。
引用数据类型
-
数组
-
接口
-
类
-
枚举
-
注解
-
这里特别对String进行一下详解
- String有两种创建方式:直接=“xxx”,以及new String(“xxx”)
- 由于有字符串常量池的存在,以及不同的创建方式造成的差异,所以对于String的相等判断,请使用equals方法
Java的默认编码类型为Unicode
内部类
详细教程
在Java中,将一个类定义在另一个类或者一个方法里,这样的类叫做内部类
分类 | 含义 |
---|---|
成员内部类 | 看起来像是外部类的一个成员,所可以拥有private、public等访问权限修饰 |
静态成员内部类 | 看起来像是外部类的一个成员,可以拥有private、public等访问权限修饰,并且使用static进行修饰 |
局部内部类 | 定义在一个方法或者一个作用域里面的类,访问仅限于方法内或者该作用域内 |
匿名内部类 | 唯一一种没有构造器的类,大部分匿名内部类用于接口回调 |
- 成员内部类
- 编译完成后会隐含保存一个指向创建它的外围类的对象
- 因为有第一点存在,所以它可以无条件访问外部类的所有成员属性和成员方法(包含private成员和静态成员)
- 当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以特定的形式进行访问
- 外部类也可以访问内部类的所有成员变量和方法(包括private),但外部类想访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
- 成员内部内并不是完全不能出现static字段的,因为非静态成员内部类要依赖外部类,对于final static的变量是存放在常量池中的,不涉及到类的加载
- 静态成员内部类
- 创建是不需要依赖于外围类的对象
- 不能使用任何外围类的非static成员变量和方法
- 允许有static属性、方法
- 局部内部类
- 就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
- 一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
- 使用到外部类方法中的局部变量时需要是final类型
- 匿名内部类
- 一种没有构造器的类
- 使用到外部类方法中的局部变量时需要是final类型
修饰符
访问权限修饰符
- public
- protected
- default
- private
状态修饰符
- static
- final
抽象修饰符
- abstract
注意点
类:
权限修饰符:默认修饰符,public
状态修饰符:final
抽象修饰符:abstract
成员变量:
权限修饰符:private,默认的,protected,public
状态修饰符:static,final
构造方法:
权限修饰符:private,默认的,protected,public
成员方法:
权限修饰符:private,默认的,protected,public
状态修饰符:static,final
抽象修饰符:abstract
本类 | 同一个包下的所有类 | 其他包下的子类 | 其他包下的无关类 | |
---|---|---|---|---|
pulic | Y | Y | Y | Y |
protected | Y | Y | Y | |
default | Y | Y | ||
private | Y |
Java for 循环的执行判断顺序
for (表达式 1 ;表达式 2 ;表达式 3 )
{
//循环体
}
先执行“表达式1”,再进行“表达式2”的判断,判断为真则执行 “循环体”,循环体执行完以后执行表达式3.
this与super的区别
- super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
- this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
- super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
super()和this()均需放在构造方法内第一行。
尽管可以用this调用一个构造器,但却不能调用两个。
this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。 - this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方
法,static语句块。 - 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
static
- 被static修饰的变量或者方法是独立于该类的任何对象,即使没有创建对象,也能使用属性和调用方法
- 用来形成静态代码块以优化程序性能,在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
- 修饰成员变量;修饰成员方法;静态代码块;静态代码块;静态代码块
- 静态只能访问静态,非静态可以访问非静态也可以访问静态
String,StringBuilder,StringBuffer
- String是不可变的,因为底层是 private final char value[];
- StringBuilder和StringBuffer可变,其中StringBuffer是线程安全的
- new 一个String对象,是需要先在字符串常量中查找相同值或创建一个字符串常量,然后再在内存中创建一个String对象,所以 String str = new String(“xyz”); 会创建两个对象。
重载(OverLoad)和重写(OverRide)
重载发生在同一个类当中(编译时的多态性),重写发生在父子类当中(运行时的多态性)
- 重载 方法名相同 但是 参数列表不同,与访问修饰符无关
- 重写 子类中方法名,参数列表与父类相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于
父类,如果父类方法啊访问修饰符为private,则子类中就不是重写
== 和 equals
- == 对于引用类型,比较的是内存地址,对于基本数据类型,比较的是值
- equals: 如果类有覆盖equals方法,则按照覆盖的逻辑,如果类没有覆盖,等价于==
Class
- getResource()
getResource接受一个字符串参数,如果以”/”开头,就在classpath根目录下找(不会递归查找子目录),如果不以”/”开头,就在调用getResource的字节码对象所在目录下找(同样不会递归查找子目录)。
概念理解:classpath,指的是编译后的class文件、xml、properties等配置文件所在的目录。比如,如果是maven项目,classpath为“项目名/target/classes”,如果是普通项目,可能是”项目名/bin”,或者”项目名/build/classes”等等。
Class.getResource和ClassLoader.getResource的区别