Java疑点复习

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值