Day22

今天有些屁事影响了下学习效率,明天后天图书馆闭馆,我明早起得来的话,就把今天还剩下的三道小问题,明天早上自己解决下,复习巩固下今天学习的内容,day22了,加油,当day100的时候,我肯定会掌握一定的技术的。加油OVO

Day22

 

泛型

  1. 泛型不同的引用不能相互赋值。

  2. 泛型结构式一个接口或抽象类,则不可创建泛型类的对象

  3. 泛型要使用的话就一路都要用,不用的话,就一路都别用,别上面用了,下面写的时候没用。

  4. 异常类不能是泛型的。

  5. 静态方法中不能使用类的泛型。

    愿意:实例化的时候才定义泛型,静态方法随着类的加载而加载,此时还没有指明泛型类型,所以不行。

 

子类继承父类的泛型的情况

简单一点的。

class Father<T1,T2>{
}
//子类不保留父类的泛型
//1.没有类型 擦除
//等价于class Son extends Father<Object,Object>
class Son1 extends Father{}

//2.具体类型。
class Son2 extends Father<Integer,String>{}

//子类保留父类的泛型
//1.全部保留
class Son3<T1,T2>extends Father<T1,T2>{}

//部分保留
class Son4<T2> extends Father<Integer,T2>{}

复杂一点的。

class Father<T1,T2>{
}
//子类不保留父类的泛型
//1.没有类型 擦除
//等价于class Son extends Father<Object,Object>
class Son1<A,B> extends Father{}

//2.具体类型。
class Son2<A,B> extends Father<Integer,String>{}

//子类保留父类的泛型
//1.全部保留
class Son3<T1,T2,A,B>extends Father<T1,T2>{}

//部分保留
class Son4<T2,A,B> extends Father<Integer,T2>{}

 

泛型方法和泛型类不一样。泛型方法可以加static,因为只有在调用方法的时候才确定泛型。

    //泛型方法,在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
   //换句话说,泛型方法所属的类是不是泛型类都没有关系。
   //泛型方法;可以声明为静态的。原因:泛型参数是在调用方法时确定的,并非在实例化类时确定。
   public <E> List<E> copyFromArrayToList(E[] arr){
       ArrayList<E> list =new ArrayList<>();
       for(E e:arr){
          list.add(e);
      }
       return list;
  }
}

 

泛型在继承方面的体现

类A是类B的父类,G<A>和G<B>二者不具备父类关系,二者是并列关系。

类A是类B的父类,A<G> 是B<G>的父类。

类A是类B的父类,G<A>和G<B>是没有关系的,二者共同的父类是:G<?>

 

通配符的使用

通配符:?, 👆这里使用了通配符的情况

 

读取看上界,写入看下界,没下界就只能写null

 

泛型的一些小练习

package com.sorrymaker.Generics;

import java.util.*;

public class DAO1<T> {
   private Map<String, T> map = new HashMap<>();

   //保存T类型的对象到Map成员变量中。
   public void save(String id, T entity) {
       map.put(id, entity);
  }

   //从map中获取id对应的对象。
   public T get(String id) {
       return map.get(id);
  }

   //替换map中key为id的内容,改为entity对象。
   public void update(String id, T entity) {
       if (map.containsKey(id)) {
           map.put(id, entity);
      }
  }

   //返回map中存放的所有T对象
   public List<T> list() {
       //values是无序的,不可重复的。
       ArrayList<T> list = new ArrayList<>();
       Collection<T> values = map.values();
       for (T t : values) {
           list.add(t);
      }
       return list;
  }
   //删除指定id对象
   public void delete(String id){
       map.remove(id);
  }
}

 

IO流

I:input,输入

O:output,输出

 

File类的使用

File类的常用方法

package com.sorrymaker.IO;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
* 流都是放在java.io包里的。
* File类的使用,
*
* 以下方法,都是在内存里面操作,并未使用到流。
*
* 1. File类的一个对象,代表一个文件或一个文件目录(文件夹)
* 2. File类声明在java.io包下。
* 3. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法。
*   并未涉及到写入或读取文件内容的操作,如果需要读取或写入文件内容,必须使用IO流来完成
* 4. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的 "终点" 。
*/
public class FileTest {
   /**
    * 1。创建File类,实例化
    * File(String filePath)
    *
    * File(String parentPath,String childPath)
    *
    * File(File parentFile,String childPath)
    *
    * 2. 相对路径:相较于某个路径下,指明的路径。
    * 绝对路径:包含盘符在内的文件或文件目录的路径。
    *
    * 3.路径分隔符:window:\\
    * unix:/
    */

   @Test
   public void test1() {
       //构造器1.
       //相对于当前IO包的路径下,相对路径
       File file1 = new File("hello.txt");
       //绝对路径
       File file2 = new File("D:\\java基础\\基础语法\\src\\com\\sorrymaker\\IO\\hello.txt");
       File file3 = new File("d:" + File.separator + "IO" + File.separator + "hello.txt");
       //三个不同的写法,第一个是相对路径,第二个和第三个是绝对路径,file2=file3
       System.out.println(file1);
       System.out.println(file2);

       //构造器2:
       File file4 = new File("D:\\java基础\\基础语法\\src\\com\\sorrymaker", "IO");
       System.out.println(file4);

       //构造器3:
       File file5 = new File(file4, "hello.txt");
       System.out.println(file5);
  }

   @Test
   public void test2() {
       File file1 = new File("hello.txt");
       File file2 = new File("d:\\IO\\hello.txt");

       System.out.println(file1.getAbsolutePath());
       System.out.println(file1.getPath());
       System.out.println(file1.getName());
       System.out.println(file1.getParent());
       System.out.println(file1.length());
       System.out.println(file1.lastModified());

       System.out.println("==========================");

       System.out.println(file2.getAbsolutePath());
       System.out.println(file2.getPath());
       System.out.println(file2.getName());
       System.out.println(file2.getParent());
       System.out.println(file2.length());
       System.out.println(new Date(file1.lastModified()));

  }

   @Test
   public void test3() {

       //遍历该文件里面的文件目录和文件。
       File file = new File("D:\\java\\java1.8");

       String[] list = file.list();
       for (String s : list) {
           System.out.println(s);
      }

       //完整的把路径写出来。
       //这里用了toString方法。
       File[] files = file.listFiles();
       for (File f : files) {
           System.out.println(f);
      }
  }

   //public boolean renameTo(File dest):把文件重命名为指定的文件路径.
   //比如:file1.renameTo(file2)为例。
   //     要想返回True,需要file1在硬盘中要存在,且file2不能存在。
   @Test
   public void test4() {
       File file1 = new File("D:\\IO\\hello.txt");
       File file2 = new File("D:\\平时的东西\\oo.txt");
       boolean renameTo = file1.renameTo(file2);
       System.out.println(renameTo);

  }

   @Test
   public void test5() {
       File file1 = new File("D:\\平时的东西\\oo.txt");
       //是否是个文件
       System.out.println(file1.isFile());
       //是否是文件目录
       System.out.println(file1.isDirectory());
       //是否隐藏
       System.out.println(file1.isHidden());
       //是否存在
       System.out.println(file1.exists());
       //是否可阅读
       System.out.println(file1.canRead());
       //是否可写
       System.out.println(file1.canWrite());
  }

   /**
    * public boolean createNewFile()创建文件。若文件存在,则不创建,返回false
    *
    * public boolean mkdir()创建文件目录,如果此文件目录存在,则不创建。如果此文件
    * 目录的上层目录不存在,也不创建。
    *
    * public boolean mkdirs()创建文件目录,如果上层文件不存在,一并创建。
    *
    * public boolean delete()删除文件或文件夹
    * 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
    */
   @Test
   public void test6() throws IOException {
       //文件创建
       File file = new File("hi.txt");
       if (!file.exists()) {
           file.createNewFile();
           System.out.println("创建成功");
      } else {
           //文件存在
           file.delete();
           System.out.println("删除成功");
      }
  }

   @Test
   public void test7() {
       //文件目录的创建
       File file1 = new File("D:\\IO\\io1\\io3");
       boolean mkdir = file1.mkdir();
       if (mkdir) {
           System.out.println("创建成功");
      }
       File file2 = new File("D:\\IO\\io1\\io4");

       boolean mkdirs = file2.mkdirs();
       if (mkdirs) {
           System.out.println("创建成功");
      }
  }
}

 

posted @ 2021-04-02 21:43  独眼龙  阅读(137)  评论(0)    收藏  举报