Java C++ 区别
- Java解释型:程序经编译器变成成字节码,由JVM解释执行;C++编译型:源代码经编译与链接后生成可执行二进制代码。
- Java纯面向对象:除基本类型(int,float),所有类型都是类;C++兼具面向过程与面向对象。
- Java无指针概念,程序更安全,避免溢出
- Java不支持多重继承,引入了接口概念;C++多重继承。
- Java提供了垃圾回收器,调用对象的finalize方法;C++开发人员管理内存分配,包括申请与释放(析构)
- Java不支持运算符重载
- Java平台无关:int类型32位
Java初始化顺序
- 静态优于非静态
- 父类优于子类
- 成员变量按照顺序初始化
父类静态变量、代码块 ->
子类静态变量、代码块 ->
父类非静态变量、代码块 ->
父类构造函数 ->
子类非静态变量、代码块 ->
子类构造函数
Java作用域
- 成员变量:类被实例化,成员变量在内存分配空间并初始化,直至实例化对象生命周期结束
- 静态变量(static):类被加载时
- 局部变量:花括号内
| 当前类 | 本包 | 子类 | 其他包 | |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | |
| default | √ | √ | ||
| private | √ |
构造函数
没有编写构造器时,编译器提供一个无参数构造函数(默认值,数值类型-0,布尔-false,对象-null)
子类通过super显式调用父类的构造器
父类没有提供无参数的构造函数时,子类构造器函数必须显式调用父类的构造函数
clone
除基本数据按值传递,对象在函数调用与=赋值时采用引用传递
从已有对象A创建一个相同状态B,且对B修改不影响A,使用clone()
深复制:复制后的对象引用指向新的对象
浅复制:复制后的对象引用仍然指向原来的对象
反射机制
- 得到一个对象所属的类
- 获得一个类的所有成员变量和方法
- 运行时创建对象
- 运行时调用对象的方法
|
|
面向对象
继承、封装、多态
多态实现机制
- 方法重载:同一个类中多个同名方法,不同参数(不同参数个数,不同参数类型,不同参数顺序),编译时多态
- 方法覆盖:子类覆盖父类的方法(函数名参数相同,返回值相同,抛出异常一致,被覆盖方法不能是private),运行时多态
抽象类 extends
- 只要包含抽象方法的类必须声明为抽象类,被声明抽象的方法不能包含方法体。
- 抽象类使用中不能被实例化,但可以创建对象指向具体子类的一个实例。
- 抽象类子类为父类所有抽象方法提供具体实现,否则也是抽象类。
接口 implements
接口中所有方法都是抽象
this super
- this指向当前实例对象
- super访问父类方法和成员变量
- 子类构造函数显示调用父类构造函数时,super必须为构造函数中第一句语句
final
- final 修饰类 类不能被继承
- final 修饰方法 方法不能被重写
- final 修饰变量 值不可被修改 (引用不可变)
static
- static 成员变量:静态变量,为类的所有对象共享
- static 成员方法:不需要创建对象可以被调用
- static 代码块:静态代码块在类被加载时被被调用
volatile
volatile 修饰被不同线程访问和修改的变量,每次使用时从内存提取,而不利用缓存;不能保证原子性
基本数据类型
| 类型 | 位长 | 包装类 |
|---|---|---|
| int | 4 byte / 32 bit | Integer |
| short | 2 byte / 16 bit | Short |
| long | 8 byte / 64 bit | Long |
| byte | 1 byte / 8 bit | Byte |
| float | 4 byte / 32 bit | Float |
| double | 8 byte / 64 bit | Double |
| char | 2 byte / 16 bit | Character |
| boolean | 1 byte / 8 bit | Boolean |
不可变类
- 基本类型的包装类是不可变类;
- String是不可变类
字符串
String s1 = new String("abc");
String s2 = new String("abc");
内存地址不同
String s1 = "abc";String s2 = "abc";
JVM中字符串池,可以被共享使用。s1,s2引用同一个常量池中对象。
new String(“abc”) 创建了一个或者两个对象:常量池中有”abc”,一个;否则,两个。
== equals hashCode
- ==:比较基本类型数据或者两个引用变量是否相等
- equals:String检测两个字符串是否相等
- hashCode:内存中地址转换成int值
equals true -> hashCode 相同整数
equals false -> hashCode 可能相等,可能不相等
String StringBuilder StringBuffer
- String:不可变类,String对象一旦被创建,其值不能被改变
- StringBuilder:线程非安全的
- StringBuffer:线程安全的,同步
length length()
- length:获取数组的长度
- length():计算字符串的长度
try catch finally
try{ }中有return语句,但在return之前会运行finally块里的代码
finally块中有return语句时,会覆盖函数中其他return语句
Java 堆与栈
- 栈: 基本类型 int, short, long, byte, float, double, boolean, char 以及对象的引用变量
- 堆: new创建的对象和数组
Collections框架
List, Queue, Set, Stack继承自Collection接口
接口
- Set : HashSet, TreeSet(有序)
- List : LinkedList, ArrayList, Vector
- Map : HashMap(散列表,hashCode), TreeMap(红黑树)
List
- ArrayList 基于数组 随机访问get与set性能优,线程不安全
- LinkedList 基于双向列表 新增与删除add与remove性能优,线程不安全
- Vector 基于数组,线程安全
HashMap Hashtable
HashMap是Hashtable轻量级实现
- Hashtabl线程安全
- HashMap线程不安全,最多允许一条键值为null;
- 添加键值对,调用key的hashCode方法生成hash值,不存在直接添加;
- 存在,找到所有key,调用equals方法比较,true覆盖,false添加;
- 冲突,链地址法
- ConcurrentHashMap
Collection Collections
- Collection是一个集合接口
- Collections是针对集合类的一个包装类
|
|