你在学Java
Java语言的特性
- 面向对象
- 平台无关性
- 可靠性
- 安全性
- 支持多线性
- 支持网络编程
- 编辑与解释并存
面向对象
面向(oriented)
定义 | 优点 | 缺点 | |
---|---|---|---|
面向对象(Object Oriented) | 找到需解决的问题中涉及的对象,然后给对象赋一些属性和方法,让每个对象去执行自己的方法 | 易维护,易复用,易扩展 | 类调用需要实例化,开销比较大,耗费资源 |
面向过程(Procedure Object) | 把事情拆分成一个个过程(没有返回值的函数)/函数和数据。然后按照一定的顺序,执行完这些方法 | 性能高 | 不易维护,易复用,易扩展 |
Java性能差的主要原因:Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。
Java与C++的区别
Java | C++ | |
---|---|---|
面向对象 | 是 | 是 |
继承方式 | 支持单继承 | 支持单继承,多继承 |
接口方式 | 有接口 | 无接口,但有虚类 |
内存访问 | 不提供指针直接访问内存 | 提供指针直接访问内存 |
内存管理机制 | 自动内存管理机制 | 需手动释放无用内存 |
基本类型所占存储空间 | 大小不变性 | 随机器硬件结构变化而变化 |
Override(覆盖)与Overload(重载)
Override | Overload | |
---|---|---|
定义 | 当子类继承父类的相同方法,输入数据一样,但要做出有别于父类的响应 | 一个方法根据输入数据的不同,做出不同的处理 |
发生范围 | 子类 | 同一个类 |
方法名 | 相同 | 相同 |
参数列表 | 不能修改 | 必须修改 |
返回类型 | 子类返回值类型比父类方法返回值类型更小或相等(例如返回引用类型的子类) | 可修改 |
异常 | 子类方法声明抛出的异常比父类方法声明抛出的异常更小或相等 | 可修改 |
访问修饰符 | 可降低限制(static修饰的方法可再次声明) | 可修改 |
发生阶段 | 运行期 | 编译器 |
封装,继承与多态
封装:把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。
继承:使用已存在的类的定义作为基础建立新类的技术。
- 子类可以增加新的数据或新的功能,也可以用父类的功能。
- 子类不能选择性的继承父类。
- 子类不能访问父类中的私有属性和方法。‘
- 子类可以用自己的方式实现父类的方法。
多态:程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。
实现方式:
- 继承—多个子类对同一方法的重写
- 接口—实现接口并覆盖接口中的同一方法
编码的小细节
成员变量和局部变量
成员变量 | 局部变量 | |
---|---|---|
所有权 | 属于类 | 属于方法 |
访问修饰符 | 无限制 | 无或者final |
在内存中的生存时间 | 随着对象的创建而存在 | 随着方法的调用而自动消失 |
赋值 | 无赋值则默认 | 不会自动赋值 |
静态方法和实例方法
静态方法 | 实例方法 | |
---|---|---|
外部调用 | 类名.方法名/对象名.方法名 | 对象名.方法名 |
访问本类成员 | 只允许访问静态成员 | 无限制 |
接口类和抽象类
接口类(行为规范) | 抽象类(模板设计) | |
---|---|---|
方法 | 修饰符为public(jdk9中引入私有方法和私有静态方法),方法不能实现 | 可以由非抽象的方法,不能用private修饰 |
变量 | 只能为static,final变量 | 无特殊规定 |
类 | 一个类可以由多个接口 | 一个类只能实现一个抽象类 |
自动拆箱与装箱
装箱:自动将基本数据类型转换为包装器类型。
拆箱:自动将包装类型转换为基本数据类型。
备注:int对应的包装器类型为Integer,其他基本数据类型对应的包装器类型为首字母大写。
super()
super()用于调用父类特定的构造方法,如果没有的话,则会调用父类中没有参数的构造方法。如果父类中没有无参方法,则会出错。
final关键字
修饰对象 | final |
---|---|
基本数据类型的变量 | 数值一旦在初始化之后便不能再修改 |
引用类型的变量 | 初始化之后不能再让其指向另一个对象 |
类 | 该类不能再被继承 |
按值传递
- 按值传递的优点:方法得到是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。
浅拷贝与深拷贝
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递。
- 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
线程
- 定义:进程划分的更小的运行单位。
- 同类的多个线程共享同一块内存空间和一组系统资源。所以同类线程在切换的时候,资源耗费小,也被称为轻量级线程。
线程的六种状态
初始(new) | 运行(runnable) | 阻塞(blockded) | 等待(waitting) | 超时等待(timed_waitting) | 终止(terminated) | |
---|---|---|---|---|---|---|
初始(new) | 线程实例化 | Thread.start() | ||||
运行(runnable) | 等待进入到synchronized方法/块 | Thread.wait() | Thread.sleep() | 线程执行完成 | ||
阻塞(blockded) | 获取到锁 | |||||
等待(waitting) | 线程唤醒Thread.notify() | 增加了时间限制 | ||||
超时等待(timed_waitting) | 线程唤醒Thread.notify() | |||||
终止(terminated) |
IO流
- 按照流的流向划分
- 输入流:把数据从其他设备上读取到内存中的流
- 输出流:把数据从内存上读取到其他设备中的流
- 按照操作单元划分
- 字节流:以字节为单位,读写数据的流。
- 字符流:字符流是由Java虚拟机将字节转换得到的,如果不知道编码类型很容易出现问题,所以对字符进行直接操作。
- 按照流的角色划分
- 节点流;从一个特定的数据源(节点)读写数据(如:文件、内存)的类叫做节点流类
- 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。
IO模式
B(Blocking)IO | N(Non-Blocking)IO | A(Asynchronous)IO | |
---|---|---|---|
中文名 | 同步阻塞IO模式 | 同步非阻塞IO模式 | 异步非阻塞的IO模式 |
特点 | 数据的读写必须阻塞在一个线程内等待其完成 |
注解(Annotation)
格式:
- 注解是以“@注释名”在代码中存在的,还可以添加一些参数值。
特点:
- 不是程序本身,但可以对程序做出注释
- 可以被其他程序读取
元注解
作用:负责注解其他的注解
Java的反射机制
定义:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
总结:动态获取信息以及动态调用对象的方法的功能。
优点 | 运行期类型的判断,动态加载类,提高代码灵活度。 |
---|---|
缺点 | 性能瓶颈:反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的javada |
类加载
作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区运行时数据结构,然后在堆中生成一个表达这个类的java.lang.Class对象,作为方法区中类数据的访问入口。
类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些class对象。
静态编译和动态编译
- 静态编译:在编译时确定类型,绑定对象。
- 动态编译:运行时确定类型,绑定对象。
泛型
泛型:JDK5引入的新特性,其本质是参数化类型,这种类型可以用在类,接口和方法的创建中,分别称为泛型类,泛型接口,泛型方法。该类型提供了编译时类型安全检测机制,该机制允许我们再编译时检测到非法的数据类型结构。
泛型优点
- 编译器检查类型,类型安全。
- 减少了数据类型转换。
泛型类
语法形式
- 泛型类的定义
class 类名称<泛型标识,泛型标识,…>{
private 泛型标识 变量名;
……
}
常用的泛型标识:T,E,K,V
- 泛型使用的语法
不支持基本数据类型
若没有指定具体类型,用Object来操作
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();
同一泛型类,根据不同的数据类型创建的对象,本质上是同一类型
泛型类派生子类
- 子类也是泛型类,子类和父类的泛型类型(T,E,K,V)要一致
- 子类不是泛型类,父类要明确泛型的数据类型
泛型接口
语法形式
interface 接口名称<泛型标识,泛型标识…>
{
泛型标识 方法名();
…
}
- 其他特性与泛型类基本保持一致
泛型方法
语法形式
修饰符 <T,E,…> 返回值类型(为泛型) 方法名(形参列表){
方法体…
}
- 泛型方法能使方法独立于类而产生变化
- 如果static方法要使用泛型能力,就必须使其成为泛型方法
泛型通配符
- ?为泛型通配符,目的代表具体的实参;泛型标识用Object
- 通配符的上限:?extends 上限实参类型(传递的类型只能为该类或其子类)
- 通配符的下限:?super 下限实参类型(传递的类型只能为该类或其父类
类型擦除
- 能够擦除的原因:泛型代码只存在于代码的编译阶段,再进入JVM之前,与泛型相关的信息会被擦掉。
- 擦出方式:
无限制类型擦除:类型转换为Object
有限制类型擦除:类型转换为上限类型
泛型与数组
- 泛型数组
可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
泛型与反射
- Class< T >
- Constructor< T >