从头温习JAVA之路(二)-Java 8编程官方参考教程(第9版)(第一部分)

第一部分

1 JAVA历史和演变

applet 字节码

applet是服务器初始化客户端执行的java小程序 某种意义上讲上应该算是一种合法的植入“病毒”
java的安全性和可移植性依赖于字节码 java编译器输出字节码而不是可执行代码,字节码由java虚拟机解释执行–原来java运行也是需要“容器”的

版本演变

java1.1-applet
java1.2-Swing Collection thread
java1.3-对1.2增强升级
java1.4-assert io chained exception Collection
java5- 泛型 annotation 自动装箱拆箱 枚举 foreach 静态导入 可变长度参数 格式化IO current
java6- 增强java5的api runtime
java7-sun收购之后第一个版本 runtime 非java语言 例如scala? switch支撑String 二进制整型字面值 数字字面值中的下划线 try-with-resource
泛型类型推断<> multi-catch nio增加fork和join
java8-lambda-> stream api 函数式接口 function 接口默认实现 新date javaFx-Swing替代者

2 JAVA综述

面向对象编程即面向接口编程、抽象编程、抽象管理的过程
面向对象三原则:封装 继承 多态 encapsulation inheritance polymorphism
封装:类定义一组对象共享的结构和行为 包括数据和代码 数据可称为成员变量或者实例变量 代码即成员方法或方法
继承:对象获得另一个对象的属性的过程 它支撑了层次化分类的概念
多态:允许一个接口用于一类通用动作的特性,这个概念应该针对的是JAVA堆栈,方法定义之后在java堆栈有栈针,栈针允许存储不同的数据,因此可称为“一个接口 多种方法”
if for 代码块
java程序由 空白符 标识符 字面值 注释 运算符 分隔符 关键字 组合而成

3 数据类型 变量 数组

java基本数据类型:整型(byte short int long )字符型(char) 浮点型( double float) 布尔型( boolean)-由此可见 java没有无符号整型 0也可以是+0或-0 或+0.0 -0.0
byte 8 >short 16>int 32 >long 64
float 32>double 64
char 16-unicode-16
char可以做算术运算
变量 初始化 作用域 生存期 --变量离开作用域时被销毁 不能再保持原来的值
类型转换和强制转换:数值<-X-> 字符<-X-> boolean 不能自动互换
强制转换或自动转换会引起类型提升和缩小转换 例如 int-byte
java多维数组分配内存时可以指定不同长度
string是java对象 不是java的数据类型

4 运算符

%= 是求模并赋值 例如 a=a%2也可以表示为 a%=2
短路运算符&& ? 问号运算符的exp2 exp3需要返回相同或兼容的类型 不能是void
lambda运算符->

5 控制语句

if 嵌套if 符合condition的一组statement被执行
switch expression条件需要是 byte short int char或者enum枚举类型,java7开始也可以用String
case和default都需要break,遗漏break则会所有case执行一遍-从另外角度讲 增加处理效率可以把常用的case条件放在最上面。
switch相对if效率高些,可以嵌套,switch只进行相等性测试 if可以任意类型的布尔表达式
while dowhile至少执行一次
for(三元式/分号式) for-each(一元式/冒号式) 从头到尾遍历对象集合

6 类

this关键字 哪里都能用
new动态分配内存
当将一个对象引用变量 赋值 给另外一个对象引用变量时,不是创建对象的副本,而是创建引用的副本
方法 返回值 void
形参 实参:形参由方法定义。实参是运行时调用传递的值
垃圾回收 finalize 方法是protected

7 方法和类的深入分析

重载

参数传递 :传值调用、引用调用
当将 对象引用 传递给方法时引用本身是使用值调用传递的,但是,由于传递的值 引用一个对象,因此值的副本仍然引用相应实参指向同一个对象

递归

String:创建的字符串都是String对象、并且对象内容不可改变,:对象改变就是创建新字符串,sbuf和sbuilder可以构造字符串
可变参数可能会导致多态方法不可识别引起编译异常,注意 是编译报错 不是运行时
例如定义 methodA(int … a);methodA(boolean … a); 无参调用 methodA();,编译会因不可确认的调用导致编译异常

8 继承

通过继承可以创建层次化的分类
可以访问那些成员是由引用变量的类型来决定的,而不是由所引用对象的类型来决定;意思是父类不能直接访问子类中定义的变量,只能访问在超类定义的变量
构造函数可以重载 super可重载 super写在子类构造函数的第一句
多重继承中 super总是先调用最近的超类构造方法,具有向上传递的机制,因此 构造函数无论是否写了super调用,都会按照继承顺序调用。
子类在继承之后可以重写父类的方法(即覆盖 override),这个类似C++的虚函数,也是多态的本质
final三种用法:常量命令、阻止方法重写、阻止类继承 final 类 不允许被继承、同理 final方法不允许子类重写。
Object类是所有类的超类, hashcode+equals+toString 、 notify notifyallwait、 clone getclass、finalize

9 包和接口

一个类可以实现多个接口, 但只能继承一个超类或者抽象类
一系列的类可以组成一个包,此时依赖于路径才可以访问,同时也是访问保护的手段
可见程度 private<默认<protected< public ;不同包非子类<不同包子类<同包非子类<同包子类<类本身
简单讲就是public随处可见,private自己可见,默认则包内和子类可见 protected 仅子类可见
部分实现接口的类需要定义成abstract
class内嵌套接口也可以被实现,称为嵌套接口或成员接口
接口的默认方法前是default,实现类可重写也可以不重写,不影响调用,默认方法可以写多个。
类和接口的区别在于,类需要维护状态信息,接口不需要
默认方法遇到冲突时:
类实现优先级高于接口默认实现,
同时继承2个接口,必须实现默认方法,否则会导致无参调用类似的编译异常,
多重接口继承时,以最外层继承接口的实现优先级最高
接口中可以定义多个静态方法,不需要实现即可调用,实现类或者子接口不继承静态方法
默认方法和静态方法对设计模式有什么变化?个人感觉像是接口借鉴了模板方法模式

10 异常处理

5个关键字 try catch throw throws finally
异常类型 throwable的子类:
Error 不希望被捕获的异常,一般JVM使用此类型 例如OOM
Exception(runtime exception) 用户可捕获的异常或自定义异常
本章只讲Exception
multi-catch :嵌套或者多层 或者||分割多个
throw用于代码块抛出异常,throws用于方法定义时抛出异常
写try语句时用finally做结束操作是个好习惯
java7特性:try-with-resource、multi-catch final-rethrow

11 多线程编程

fork-join支撑并行编程
线程隐形监视器
创建线程的两种办法:实现Runnable接口 run方法 继承Thread类 start去调用Runnable 的run方法
Thread类的方法isalive priority name sleep run start join
synchronized:同步方法、同步语句块,一旦线程进入同步方法,所有其他线程都不能进入任何相同实例的同步方法
线程间通信 wait notify 最经典的是生产-消费者模型
挂起和恢复 suspend resume 可能导致锁不被释放引起新的问题,因此不建议使用 同理 stop也会导致锁释放,而引起的冲突问题,并且可能会破坏正在保存的数据结构
线程运行控制可用信号量

12 枚举 自动装箱与注解(元数据)

枚举

枚举有values和valueof两个方法 一个返回数组 一个返回查找的值
枚举继承自Enum类,所以说它是类对象 ordinal 位置 compareTo 顺序 equals

自动装箱

java 自动装箱拆箱在java5 开始是隐式使用
自动装箱指无论何时,只要是基本类型的对象,就自动的将基本类型自动封装(装箱)到与之等价的类型封装器中,而不需要显示的构造对象。
自动拆箱就是当需要时自动抽取(拆箱)已装箱对象的数值的过程。 特别有利于泛型的处理
Integer-int short long
Double -double
Float-float
Boolean-boolean
Character-char
Byte-bye

注解

注解是基于接口的机制创建的,注解只包含方法声明,不包含方法体 自动扩展annotation接口
注解的生命周期:RetentionPolicy SOURCE – CLAS S-- RUNTIME: 源文件保留 编译抛弃–编译保留 运行抛弃–运行保留 最长生命
@Retetion指定生命周期策略
运行时通过反射获得注解 getclass getmethod getannotation
允许默认值
标记注解 override、inherited、deprecated
单成员注解 :只有一个参数的
内置注解 document target inherited 等

类型注解 说明注解用途或范围 typeanno recommended Elementtype.TYPE_USE/TYPE_FIELD/TYPE_METHOD
重复注解 repeatable
注解不能被注解继承,所有声明方法不能带参数

13 IO、applet以及其他主题

I/O 分类

buffer、file、in/out、byte、data、object、pip、print----stream/reader-writer
关闭流可用close 或者try-resource模式自动关闭-java7增加

applet

transient 不会被永久保存,不可被序列化
volatile 可被多线程修改 修改优先于查询
instanceof 父子类之间的引用类型判断
strictfp 修饰符,可修饰类,也可修饰方法或接口,类修饰之后其方法自动使用此修饰 用于截断 统一精度 基本不会用

native本地方法 JNI接口 例如调用dll动态库
assert 断言 使用姿势:assert + condition 或 assert + condition:expr
静态导入 import static ***、import static ***.method/variable
this :调用重载构造函数 可优化代码结构:不能使用实例变量调用、super和this都是构造函数第一条语句,因此 super和this不能一起使用
紧凑API配置文件:compact1-2-3 三个层次 向前包含关系,编译时用到,指定jre,为java9模块化做准备

14 泛型

一般形式
泛型在java中指的就是参数化类型 标识符<> 常用 T K V ?-通配符
优点:提供了类型安全性-类型擦除;简化处理过程;不需要显示强制转换;
限制:泛型只使用引用类型 例如int char 不能使用 Integer Character
可以声明有界类型 、有界通配符类型 <? extends superclass>
T不能被实例化 也不能T数组实例化
泛型类或者接口不能有static的变量 T 或方法T
泛型不能继承throwable 即没有泛型异常类

泛型方法 <T (extends) > return-type method-name(param-list)
泛型接口 和泛型类声明一致 好处在于可以针对不同类型实现并且可以限制条件
JVM为了兼容 泛型 java8做了类型擦除 以及桥接

15 lambda表达式

-> lambda表达式本身是一个匿名方法,不能独立执行,而是用于实现函数式接口定义的另一个方法 因此 lambda会产生匿名类
函数式接口是指 只包含一个抽象方法的接口 例如Runnable接口,另外 函数式接口继承自Object也可以用equals
声明时 多个参数需要分别声明,–》意即这也是形参的一种 而不是成员变量
单个表达式-表达式体
块表达式-多条语句 语句块
lambda表达式自身不指定类型参数,因此不能是泛型,但是其依靠推断可匹配参数类型,因此其关联的函数式接口可以是泛型 即 -> 左边指定类型,右边的调用可以是泛型
lambda表达式作为参数传递
lambda可以访问外层作用域的方法和静态变量,但是不能修改外部变量,也可以抛出异常
方法中的使用分为静态引用和实例引用,前者写对象::方法名,后者写引用对象::方法名 引用对象即声明的对象。
构造函数中也可以使用T
JAVA8预定义lambda接口 java.util.function UnaryOperator BinaryOperator Comsumer Supplier Function Predicate 一元/操作/操作/返回/R/boolean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值