欢迎您光临本小站。希望您在这里可以找到自己想要的信息。。。

java8学习笔记总结(四)

java water 2244℃ 0评论

I/O 、applet以及其他主题

Java 程序通过流执行I/O。流是一种抽象,要么产生信息,要么使用信息 。流通过Java的I/O系统链接到物理设备。所有流的行为方式是相同的,尽管与它们链接的物理设备是不同的。这意味着可以将许多不同类型的输入-磁盘文件、键盘或网络socket,抽象为输入流。与之对应,输出流可以使用控制台、磁盘文件或网络连接。流是处理输入\输出的一种清晰方式。

除了在java.io包中定义的基于流的I/O外,Java还提供了基于缓冲和基于通道的I/O,它们是在java.nio及其子包中定义

Java定义了两种类型的流:字节流和字符流。字节流为处理字节的输入和输出提供了方法。例如,当读取和写入二进制数据时,使用的就是字节流。字符流为处理字符的输入和输出提供了方便的方法。它们使用Unicode编码,所以可以被国际化。此外,在某些情况下,字符流比字节流高效

在底层,所有的I/O仍然是面向对象的,基于字符的流只是为处理字符提供一种方便和高效的方法

字节流是通过两个类层次定义的。在顶级有两个抽象类:InputStream和OutputStream。每个抽象类都有几个处理各种不同设备的具体子类。

字符流类是通过两个类层次定义的。在顶层是两个抽象类:Reader和Writer。这两个抽象类处理Unicode字符流。

只有对于那些实现了AntoCloseable接口的资源,才能使用带资源的try语句。Java.io包中的Closeable接口继承自AutoCloseable接口。

try语句中声明的资源被隐式声明为final,此外,资源的作用域局限于带资源的try语句

可以在一条try语句中管理多个资源。

对于带资源的try语句来说,异常不会丢失

流线化源代码的能力是自动资源管理有点的一个方面

如果将实例变量声明为transient,那么当存储对象时,实例变量的值将不需要永久保存

修饰符volatile告诉编译器,由volatile修饰的变量可以被程序的其他部分随意修改,这会告诉编译器必须总是使用volatile变量的主副本。

将C代码集成到Java程序中的机制称为Java本地接口(JNI)

断言经常用于正是在测试期间实际遇到了某些期望的条件。assert condition,如果结果为true,那么断言为真,不会发生其他动作。如果条件为false,那么断言失败并抛出默认的AssertionError对象。

为了在运行时启用断言检查,必须指定-ea

assert n > 0 : “n is negative!”;

关于断言需要理解重要一点:不能依赖它们执行程序实际需要的任何动作。因为在正常情况下,发布代码在运行时会禁用断言

可以使用-da选项禁用所有断言。通过在-ea或-da选项后面指定包的名称,并在后面跟上三个点,可以启用或禁用指定包(及其所有子包)的断言

静态导入扩展了import关键字的功能。通过在import后面添加static关键字,可以使用import语句导入类或接口的静态成员。当使用静态导入时,可以直接通过名称引用静态成员,不需要类名进行限定。

如果在程序中只使用静态成员一两次,最好不要导入它们,Java将类库组织到包中的目的就是避免名称空间发生冲突,不要滥用静态导入

通过this()调用重载的构造函数的一个原因是:对于阻止不必要的重复代码可能是有用的。在许多情况下,减少重复代码可以降低加载类所需要的时间。当构造函数中包含大量重复代码时,使用this()还有助于结构化代码。

this()最适合用于包含大量初始化代码的构造函数,而不适合用于那些只简单设置少量域变量值的构造函数

调用this()不能使用当前类的任何实例变量。一个构造函数中不能同时使用supder()和this(),因为它们都必须是构造函数中的第一条语句

紧凑API配置文件 javac  -profile

泛型

许多算法虽然操作的数据类型不同,但是算法逻辑是相同的。使用泛型,可以只定义算法一次,使其独立于特定的数据类型。然后将算法应用于各种数据类型而不需要做任何额外的工作。受影响最大的是集合框架。

因为增加了泛型特性。所以现在可以采用类型绝对安全的方式使用集合。

泛型:意思是参数化类型,参数化类型很重要,因为使用该特性创建的类、接口以及方法,可以作为参数指定所操作的数据的类型。

通过操作Object类型的引用,Java总是可以创建一般化的类、接口以及方法

移除泛型类型信息的过程被称为擦除

泛型类型必须是引用类型,不能是基本类型

Java提供了有界类型。在指定类型参数时,可以创建声明超类的上界,所有类型参数都必须派生自超类。除了使用类作为边界之外,也可以使用接口,边界可以包含一个类和一个或多个接口,使用&运算符连接它们。

Java泛型的另一个特性:通配符参数?

通配符不会影响能够创建什么类型的Stats对象

有界的通配符为类型参数指定上界或下界

<? extends superclass>

<? supder subclass>

可以声明本身使用一个或多个类型参数的泛型方法,此外,可以在非泛型类中创建泛型方法

除了可以定义泛型类和泛型方法外,还可以定义泛型接口

Interface MinMax<T extends Comparable<>>

class Myclass<T extends Comparable<T>> implements MinMax<T>{}

如果类实现了泛型接口,那么类也必须是泛型化的,至少需要带有将被传递给接口的类型参数

泛型类可以是类层次的一部分,就像非泛型类那样。因此,泛型类可以作为超类或子类。泛型和非泛型层次之间的区别是:在泛型层次中,类层次中的所有子类都必须向上传递超类所需要的所有类型参数。

如果需要的话,子类可以自由添加自己的类型参数

非泛型类可以作为泛型子类的超类。

在运行时不能使用泛型类型信息instanceof Gen2<Integer>是错误的,应该是instanceof Gen2<?>

只有当两个泛型类型实例的类型相互兼容并且它们的类型参数也相同时,才能进行强制转换

可以像重写其他任何方法那样重写泛型类的方法

JDK7之前

MyClass<Integer, String> mcOb = new MyClass<Integer, String>(98, “A String”)

类型推断

MyClass<Integer, String> mcOb = new MyClass<>(98, “A String”)

简单创建部分简单的使用<>,这是一个空的类型参数列表,这被称为菱形运算符,它告诉编译器,需要推断new表达式中构造函数所需要的类型参数。

实现泛型的工作原理:编译时,把所有泛型信息移除(擦除),这意味着使用它们的界定类型替换类型参数,如果没有指定界定类型,就使用Object,然后应用适当的类型转换(根据类型参数而定),以保持与类型参数所指定类型的兼容性。编译器也会强制实现这种类型兼容。意味着在运行时没有类型参数,它们只是一种源代码机制

桥接方法:子类找那个重写方法的类型擦除不能产生与超类中方法相同的擦除,会生成使用超类类型擦除的方法,并且调用具有子类指定的类型擦除的方法,只在字节码级别发生

泛型引入,增加了模糊性错误的可能

泛型的一些限制:

不能实例化类型参数

静态成员不能使用在类中声明的类型参数

不能实例化元素类型为类型参数的数组,不能创建特定类型的泛型引用数组,如果使用通配符的话,可以创建指向泛型类型的引用的数组

泛型不能扩展Throwable,不能创建泛型异常类

转载请注明:学时网 » java8学习笔记总结(四)

喜欢 (0)or分享 (0)

您必须 登录 才能发表评论!