1. java中普通类和抽象类有哪些区别
Java中普通类(也就是非抽象类)和抽象类有以下几个区别:
实例化:普通类可以直接被实例化为对象,而抽象类不能直接被实例化。抽象类需要被继承后,由其子类来实现其中定义的抽象方法。
抽象方法:普通类不能包含抽象方法,而抽象类必须至少包含一个抽象方法。抽象方法是一种没有具体实现的方法,它只有声明而没有方法体。抽象方法必须在抽象类的子类中被实现。
成员变量:普通类和抽象类都可以定义成员变量,并可进行初始化赋值。但是,抽象类中的成员变量不能强制要求其子类进行初始化或赋值,因为抽象类并不强制要求其子类实现所有的方法。
扩展性:普通类和抽象类都可以被其他类继承,从而获得这些类的属性和方法。但是,由于普通类已经对所有方法进行了实现,所以它的子类只能继承它的方法。而抽象类中的抽象方法要求子类必须先实现这些抽象方法,这样可以确保子类在继承抽象类的基础上完成具体的功能实现,扩展性更强。
使用场景:由于抽象类本身不能被实例化和使用,它通常用来定义一些基础的类或方法,以供其他的普通类或子类继承和实现。而对于那些可以直接被实例化的类,我们通常会把它们定义成普通类。
综上:抽象类是一种含有抽象方法的类,需要被继承后在其子类中实现,而普通类则没有这个限制。抽象类通常用于定义一些基础类或方法,而普通类适用于所有的其他情况。
2. 接口和抽象类有什么区别
Java中的接口和抽象类是两种常见的抽象类型,它们有以下几个区别:
实现方式:抽象类是通过关键字abstract来定义的,而接口是通过interface来定义的。
可继承性:抽象类可以被其他类继承,以获得它的属性和方法,然后在子类中进行具体实现。而接口只能被其他类实现,并且一个类可以同时实现多个接口,这样就可以在其中定义不同的行为。
抽象方法:抽象类可以包含抽象方法和非抽象方法,而接口中只能包含抽象方法。另外,抽象方法是一种没有实现的方法,需要由子类在继承时进行实现;而接口的所有方法都是抽象的,需要被实现类进行具体实现。
方法默认实现:Java8开始,接口可以包含默认方法,可以提供默认的方法实现,而抽象类不能直接提供默认方法实现。这也使得接口比以前更加灵活和易用。
程序设计方向:抽象类通常用于表示某个类或接口的基础层次结构,而接口则通常用于定义不同类之间的共同行为。简单来说,抽象类是从类的角度考虑问题,而接口则是从行为的角度考虑问题。
抽象类和接口都可以用于定义抽象类型,但两者有不同的使用场景。你可以根据实际需求来选择使用哪一种或哪些。
3. java中的IO流分为几种
Java中的IO流可以分为四类:
字节流(InputStream和OutputStream):用于读写一个字节或一组字节。InputStream是输入字节流的抽象基类,OutputStream是输出字节流的抽象基类。
字符流(Reader和Writer):用于读写一个字符或一组字符。Reader是输入字符流的抽象基类,Writer是输出字符流的抽象基类。
字节缓冲流(BufferedInputStream和BufferedOutputStream):它们是字节流和字符流的缓冲流,可以提高性能,减少系统的 read() 和 write() 的调用次数。
对象流(ObjectInputStream和ObjectOutputStream):用于将对象序列化和反序列化过程写入和读取到流中。
以上称为“节点流”,而由这些节点流得到的称为“处理流”或“过滤流”。处理流包括:BufferedInputStream、BufferedOutputStream、DataInputStream、DataOutputStream、ObjectInputStream、ObjectOutputStream、PrintStream、PrintWriter等。
这些IO流可以按照不同的数据类型进行分类,方便读取和处理数据,同时也有助于程序的性能优化。在实际开发中,我们需要根据具体的需求来选择使用哪种类型的IO流。
4. BIO、NIO、AIO 有谁没区别
BIO(Blocking I/O):同步阻塞I/O模型,它采用传统的InputStream/OutputStream进行读写操作。当一个线程在进行输入/输出时,其他线程必须等待。因此BIO通常无法支持高并发的场景。
NIO(Non-Blocking I/O):同步非阻塞I/O模型,它引入了Channel、Buffer、Selector等新的抽象概念,使用读写缓冲区(Buffer)完成对数据的读写操作。因为NIO利用单独的线程处理事件通知,所以可以支持更高的并发量。
AIO(Asynchronous I/O):异步非阻塞I/O模型,一般通过回调来实现异步处理。与NIO的主要区别在于, 读写操作完成后,内核会自动将数据写到应用的缓冲区中,不需要用户再次调用read/write处理。这使得AIO适合大量文件的处理以及高负载的服务器应用开发。
BIO适用于客户端连接比较小的情况;NIO适合处理较少的连接,但每个连接要处理大量任务或面临高并发;AIO则适用于同时有很多连接的高并发网络应用。根据实际需求选择不同的I/O模型,可以有效提高应用程序的性能。
5. Files 的常用方法有哪些
创建、删除文件或目录:createDirectory(Path path)、createDirectories(Path path)、createFile(Path path)、delete(Path path)、deleteIfExists(Path path)。
文件或目录复制、移动:copy(Path source, Path target, CopyOption… options)、move(Path source, Path target, CopyOption… options)。
获取文件属性:isDirectory(Path path)、isRegularFile(Path path)、isHidden(Path path)、size(Path path)、getLastModifiedTime(Path path)、isReadable(Path path)、isWritable(Path path)、isExecutable(Path path) 等。
获取目录或文件下的所有文件名列表:list(Path dir)、walk(Path path)、newDirectoryStream(Path dir)等。
读取或写入文件内容:readAllBytes(Path path)、readAllLines(Path path), write(Path path, byte[] bytes, OpenOption… options)、writeString(Path path, CharSequence charSequence, Charset cs, OpenOption… options) 等。
文件或目录比较:isEqual(Path path1, Path path2)。
更改文件权限:setOwner(Path path, UserPrincipal owner)、setPosixFilePermissions(Path path, Set perms)等