Java疑点复习
关键字
- 包、类、接口定义相关的。
- class,interface,package,extends,implements,import,abstract
- 基本数据类型
- int,float,double,char,long,enum,void,byte,short,boolean
- Java语句控制符
- if,while,else,for,break,case,continue,default,do,return,switch,synchronized
- 类型、变量、方法修饰符
- final,native,private,protected,public,static,volatile,strictfp,transient
- 异常处理相关的
- try,throws,catch,finally
- 类引用
- this,super
- 运算符
- new,assert,instance of
- 保留字
- goto,const
反序列化
反序列化的过程与序列化的过程正好相反,也是通过两步来完成:
使用一个节点流(一般是输入流,例如FileInputStream对象构建一个处理流Object-InputStream对象。
调用ObjectInputStream对象的readObject()方法读取流中的对象,该方法会返回一个Object类型的对象,可将该对象强制转化成其真实的类型。
下面通过实例来理解Java对象的反序列化:
public class DeserializableTest{
public class void main(String[] args){
SerialNumber a;
SerialNumber b;
ObjectInputStream ois=null;
try{
ois=new ObjectInputStream(new FileInputStream("a.txt"));
a=(SerialNumber)ois.readObject();
b=(SerialNumber)ois.readObject();
System.out.println(a.getSerial());
System.out.println(b.getSerial());
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(ois!=null){
ois.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
在上面这段测试代码中首先使用输入流FileInputStream对象创建一个ObjectInputStream类对象,该输入流关联磁盘当前目录的a.txt文件。然后通过调用ObjectInputStream类对象的readObject()方法将文件a.txt文件中的二进制码进行反序列化并将生成的对象读取出来。在测试程序中顺序调用了两次readObject()方法,因此可以按照序列化的顺序将对象二进制码逐一反序列化,并得到相应的对象实例。由于在前面的程序中将mSerialNumber为0的对象先进行序列化并保存到文件中,再将mSerialNumber为1的对象进行序列化并保存到文件中,所以按照对象序列化的先后次序,反序列化时最先读出的时mSerialNumber为0的对象(引用a指向对象),然后读出mSerialNumber为1的对象(引用b指向该对象)。这段程序会将对象a和b中的mSerialNumer成员输出。
编写程序实现判断D:\目录下(包括全部子目录)是否有后缀名为.jpg的文件,如果有则输出该文件的名称
分析:因为方法listFiles返回的时File类型的数组,其每个数组成员都是一个File类型的对象,而File类型的对象可以指代一个文件也可以指代一个目录,所以可以判断每个File对象是否是目录,如果是目录就调用listFiles方法在该子目录下查找。因为调用listFiles方法在子目录中查找.jpg文件的过程与在外层目录下查找.jpg文件的过程是一样的,所以可以设计一个递归算法来实现。
public class FileTest{
public static void main(String[] args){
//通过File类的构造方法生成D:\目录的File对象
File file =new File("D:\\");
//获取该目录下所有文件或者文件夹的File数组
File[] fileArray=file.listFiles();
FileTest ft=new FileTest();
//调用递归方法listJpgFiles查找D:\下的所有文件
ft.listJpgFiles(File[] fileArray){
if(fileArray == null)return;
for(File f:file Array){
//判断是否以.jpg结尾
if(f.getName().endsWith(".jpg")){
//输出该文件名称
System.out.println(f.getName());
}
}
if(f.isDiretory){
//如果f是目录,则递归调用listJpgFiles
//在f指代的目录下继续搜索
listJpgFiles(f.listFiles());
}
}
return;
}
}
在上面这段程序中,首先使用File.listFiles()获取D:\根目录下的所有文件或者目录的File对象,然后通过FileTest类的对象ft调用FileTest类中的方法,并以f.listFiles()的返回值(即File()对象)作为参数,继续在该子目录下查找jpg文件
面向对象和面向过程的区别
面向过程的程序设计方法是一种结构化的程序设计方法。它是以过程为中心,按照一定的顺序和步骤,自顶向下逐步求i纪念馆的一种程序设计方法。
面向对象的编程思想是一种以事物为中心的编程思想。这种编程思想模拟了客观世界事物的真实存在形式,用更加符合常规的办法来处理问题。
如何获取父类的类名如何获取当前运行类的类名?
可以通过Java的反射机制中的getSuperclass()方法来获取当前运行类的父类Class对象,再通过getName()方法得到类名。如下代码所示:
class Father{
}
public class Child extends Father{
void printClassName(){
System.out.println(this.getclass().getSuperclass().getName());
}
static public void main (String[] args){
Child a=new Child();
a.printClassName();
}
}
答案
通过this.getClass().getName()获取当前运行类的名字
通过this.getClass().getSuperclass(),getName()获取当前运行类的父亲的名字
引申提示
本题涉及到一个重要知识点:final修饰的方法不能被其子类方法覆盖。
- final修饰属性时表示该属性不可变
- final修饰方法时表示该方法不可被覆盖
- final修饰类时表示该类不可被继承
instanceof的作用
instanceof的作用是判断一个对象是否是某一个类(或者接口、抽象类、父类)的实例。它的使用方法是result =A instanceof B,其中A为某个对象的引用,B为某个类的类名(或者接口名、抽象类名、父类名)。其运算结果result为一个boolean型返回值,如果A是B的实例,则返回true;如果A不是B的一个实例,或者A为null,则返回false
public class insstanceofTest implements A{
public static void main(String[] args){
String str="This is a string";
instanceofTest obj=new instanceofTest();
System.out.println(str instanceof String);
System.out.println(str instanceof Object);
System.out.println(obj instanceof A);
}
}
interface A{
}
在这段程序中创建了两个对象,一个是str指向的字符串,另一个是instanceofTest类的一个实例obj。然后通过instanceof关键字对这两个对象的所属类进行判断。
因为str指向一个字符串,所以str instanceof String的返回值为true;
因为在Java中任何类都是Object类的子类,所以str instanceof Object的返回值为也为true
因为类instanceofTest实现了接口A(虽然A中什么也没有定义),所以obj instanceof A的返回值也为true