Java学习(五)
Java学习(五)
标签(空格分隔): Java
final的用法
final在java中并不常用,然而它却为我们提供了诸如在c语言中定义常量的功能,不仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被重写或继承等功能,这些特点使final在java中拥有了一个不可或缺的地位,也是学习java时必须要知道和掌握的关键字之一。
final成员:当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说是其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中,注意,这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句。然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
final方法:将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而影响效率,所以你要慎用final进行方法定义。
final类:当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
JavaI/O部分之File类的用法
在java中,I/O(输入/输出)是比较乏味的事情,因为看不到明显的运行效果,但输入/输出是所有程序都必需的部分——使用输入机制,允许程序读取外部数据(包括来自磁盘、光盘等存储设备的数据)、用户输入数据;使用输出机制,允许程序记录运行状态,将程序数据输出到磁盘、光盘等存储设备中。
Java的I/O通过java.io包下的类和接口来支持,在java.io包下主要包括输入、输出两种IO流,每种输入、输出流又可分为字节流和字符流两大类。其中字节流以字节为单位来处理输入、输出操作,而字符流则以字符来处理输入、输出操作。
Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流,其中节点流用于和底层的物理存储节点直接关联——不同的物理节点获取节点流的方式可能存在一定的差异,但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入。输出代码来读取不同的物理存储节点的资源。
下面主要通过一个类来记录此部分知识点,具体代码如下:
import java.io.File;
import java.util.Date;
/**
*
* @author Android将军
*
*/
/*
* File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File
*类来完成。值得指出的是,不管是文件还是目录都是使用File来操作的,File能新建、删除、重命名文件和目录,File
*不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
* 一旦创建了File对象后,就可以调用File对象的方法来访问,File类提供了很多方法来操作文件和目录。
*/
public class FileStudy {
private static File file;
/**
* 传入指定目录的文件或目录,获取该对象的详细信息
* @param uri 传入的文件路径或文件目录
*/
public static void createSysout(String uri)
{
file=new File(uri);
if(file.isFile())//判断File对象所对应的是否是文件,而不是目录
{
//返回此File对象所表示的文件名
System.out.println("文件名:"+file.getName());
//返回此File对象所对应的路径名
System.out.println("文件路径:"+file.getPath());
//返回此File对象所对应的绝对路径所对应的File对象
System.out.println("该文件所对应的绝对路径所对的File的名字:"+file.getAbsoluteFile().getName());
//返回此File对象所对应的绝对路径名。
System.out.println(file.getAbsolutePath());
//返回此File对象所对应目录(最后一级子目录)的父目录名.
System.out.println(file.getParent());
//重命名此File对象所对应的文件或目录,如果重命名成功,则返回true,否则返回false
// System.out.println(file.renameTo(new File("TestNewName.txt")));//重命名之后,该file所对应的文件就没有了。
//判断File对象所对应的文件或目录是否存在
System.out.println("文件是否存在:"+file.exists());
//判断File对象所对应的文件和目录是否可写
System.out.println("文件是否可写:"+file.canWrite());
//判断File对象所对应的文件和目录是否可读
System.out.println("文件是否可读:"+file.canRead());
//判断File对象所对应的是否是目录,而不是文件
System.out.println("该对象是否为目录:"+file.isDirectory());
//判断File对象所对应的文件或目录是否是绝对路径。该方法消除了不同平台的差异,可以直接判断File对象是否为绝对路径。
//在Unix/Linux/BSD等系统上,如果路径名开头是一条斜线(/),则表明该File对象对应一个绝对路径;在Windows等系统上,如果路径开头
//是盘符,则说明它是一个绝对路径。
System.out.println("是否为绝对路径:"+file.isAbsolute());
System.out.println("文件的最后修改时间:"+new Date(file.lastModified()).toString());
System.out.println("文件内容的长度:"+file.length());
}
}
}
http://blog.csdn.net/android_jiangjun/article/details/41683915