数据类型
1.基本数据类型:
boolean/1
byte/8
char/16
short/16
int/32
float/32
long/64
double/64
每个类型都有它对应的包装类。自动装箱和拆箱操作
2.缓存池
valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);
a和b是同一个对象
Integer 缓存池的大小默认为 -128~127。超过改范围之后,对象就不是同一个了
3.String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
char数组被final修饰,不可变
不可变的好处
- 可以缓存 hash 值 因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
- String Pool 的需要 如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
- 安全性 String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。
- 线程安全 String 不可变性天生具备线程安全,可以在多个线程中安全地使用。
4.String, StringBuffer and StringBuilder
- 可变性 String 不可变 StringBuffer 和 StringBuilder 可变
- 线程安全 String 不可变,因此是线程安全的 StringBuilder 不是线程安全的 StringBuffer 是线程安全的,内部使用 synchronized 进行同步
5 HotSpot虚拟机中字符串常量池保存
运行时常量池(Runtime Constant Pool)是虚拟机规范中是方法区的一部分,在加载类和结构到虚拟机后,就会创建对应的运行时常量池;而字符串常量池是这个过程中常量字符串的存放位置。所以从这个角度,字符串常量池属于虚拟机规范中的方法区,它是一个逻辑上的概念;而堆区,永久代以及元空间是实际的存放位置。 不同的虚拟机对虚拟机的规范(比如方法区)是不一样的,只有 HotSpot 才有永久代的概念。
6 java是值传递的形式传入方法中,而不是引用传递;但是对象类似于一个指针,存储的是对象的地址
继承
访问权限
1.public ,protected,privaid区别:
| 区别 | public | protected | [default] | private |
| :----------------: | :----------- | :-----------: | :------------ | :----------: |
| 同一个类中 | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
| 同一个包中 | 可以访问 | 可以访问 | 可以访问 | 不可以 |
| 不同包的子类 | 可以访问 | 可以访问 | 不可以 | 不可以 |
| 不同包的非子类 | 可以访问 | 不可以 | 不可以 | 不可以 |
设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。
抽象类
抽象类和抽象方法都使用 abstract 关键字进行声明。抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。
抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类
接口
接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。 从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。
在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。
接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。
接口的字段默认都是 static 和 final 的。
Object类
1.eaquals方法
equals() 与 ==
基本类型:==判断两个值是否相等,基本类型没有equals方法
引用类型:
== 判断两个变量是否引用同一个对象,而 equals() 判断引用的对象是否等价。
2.hashCode方法
等价的对象hashcode一致,但是hashCode一致的情况下,对象不一定等价
3.浅拷贝和深拷贝
浅拷贝:拷贝对象和原始对象引用类型引用同一个对象
深拷贝:拷贝对象和原始对象的引用类型引用不同对象。
关键字
final
对于数据
1.对于基本类型,final 使数值不变;
2.对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
对于方法
声明方法不能被子类重写。 private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。
对于类
声明类不允许被继承。
static
- 静态变量 静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。
- 实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。
静态方法:静态方法在类加载的时候就实现了,它不需要依赖任何的示例;静态方法必须有实现,不能是抽象方法
静态方法中只能访问属于类的静态字段或者静态方法,方法中不能有this和super关键字
静态语句块:
在类初始话的时候运行一次
静态内部类:
非静态内部类依赖于外部类的实例,但是静态内部类不需要
反射
类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName(“com.mysql.jdbc.Driver”) 这种方式来控制类的加载,该方法会返回一个 Class 对象。
java.lang.reflect 类库主要包含了以下三个类:
Field : 可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段;
Method : 可以使用 invoke() 方法调用与 Method 对象关联的方法;
Constructor : 可以用 Constructor 创建新的对象。
Java 与 C++ 的区别
Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object
C++ 为了兼容 C 即支持面向对象也支持面向过程。
Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
Java 支持自动垃圾回收,而 C++ 需要手动回收。
Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
Java 不支持操作符重载,虽然可以对两个 String 对象支持加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。
Java 不支持条件编译,C++ 通过 #ifdef #ifndef 等预处理命令从而实现条件编译。