我是靠谱客的博主 苗条酸奶,最近开发中收集的这篇文章主要介绍Day 7 2021.3.8Final-权限修饰符-部分常用类-集合-泛型Day 7 2020.3.8,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Day 7 2020.3.8

Final关键字

package com.hong.Day007.Demo01;
/*
final关键字代表最终的、不可改变的
常见四种用法:
1.可以用来修饰一个类
格式:public fianl classs 类名称{}
含义:当前这个类不能有任何子类(太监类)(可以有父类,不能有子类)
2.可以用来修饰一个方法
格式:修饰符 final 返回值类型 方法名称(参数列表){方法体}
含义:当用fianl来修饰方法时,这个方法就是最终方法不能修改
3.还可以用来修饰一个局部变量
格式:修饰符 final 返回值类型 变量名 = 变量值
含义:当用fianl来修饰局部变量时,这个变量就是最终变量不能修改
(对于基本类型来说,不可变说的是变量当中的数据不可变
对于引用类型来说,不可变说的是变量当中的地址值不可变(数据值可以改变))
4.还可以用来修饰一个成员变量
含义:当用fianl来修饰成员变量时,这个变量就是最终变量不能修改
1.由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了
2.对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值
3.必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值
 */
public class Demo01 {
}

四种权限修饰符

package com.hong.Day007.Demo01;
/*
java中有四种权限修饰符:
           public > protected > (default) > private
同一个类       Yes       Yes         Yes        Yes
同一个包       Yes       Yes         Yes         No
不同包子类     Yes       Yes          No         No
不同包非子类   Yes        No          No         No

注意事项:(default)并不是关键字“default”,而是根本不写
 */
public class Demo02 {
}

内部类

package com.hong.Day007.Demo01;
/*
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。
分类:
1.成员内部类
定义格式:外部类名称$内部类名称
修饰符 class 类名称{
    修饰符 class 类名称{...}
      }
注意:内用外,随意访问;外用内,需要内部类对象
使用方法:
1.间接方法:在外部类的方法当中,使用内部类;然后main只是请用外部类的方法
2.直接方法:公式:
类名称 对象名 = new 类名称();
【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称;】
3.如果出现了重名现象,那么格式是: 外部类名称.this.外部类成员变量名
==========================================================
2.局部内部类(包含匿名内部类)
定义格式:
修饰符 class 外部类名称{
    修饰符 返回值类型 外部类方法名称(参数列表){
        class 局部内部类名称{
        }
    }
}
注意:
1.如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
2.定义一个类的时候,权限修饰符规则
  1.外部类:   public / (defualt)
  2.成员内部类:   public / protectted / (defualt) / private
  3.局部内部类:什么都不能写
============================================================
3.匿名内部类
如果接口的 实现类(或者是父类的子类)只需要使用唯一的一次
那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】
定义格式:
接口名称 对象名 = new 接口名称() {
     //覆盖重写所有抽象方法
};
注意事项:
1.匿名内部类,在【创建对象】的时候,只能使用唯一一次
2.匿名对象,在【调用方法】的时候,只能调用唯一一次
如果希望同一个对象,调用多次方法,那么必然要给对象起个名字
3.匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名字】
*/
public class Demo03 {

}

新发红包案例(未完成)

接口:

package com.hong.Day007.Demo02;

import java.util.ArrayList;

public interface OpenMode {
    /**
     * 请将totalMoney分成count份,保存到ArrayList<Integer>,返回
     * @param totalMoney           总金额为方便计算,已经转换为整数,单位为分
     * @param totalCount                   红包个数
     * @return ArrayList<Integer>   元素为各个红包的金额值,所有元素的值累和等于总金额
     */
    ArrayList<Integer> divide(int totalMoney,int totalCount);
}

操作界面:

package com.hong.Day007.Demo02;
/*
场景说明:
   红包发出去之后,所有人都有红包,大家抢完了之后,最后一个红包给群主自己
红包分发的策略:
     1.普通红包(平均):totalMoney / totalCount ,余数放在最后一个红包当中
     2.手气红包(随机):最少1分钱,最多不超过平均数的两倍,余额越发越少
 */
public class Bootstrap {
    public static void main(String[] args) {

    }
}

Object类

Class Object是类Object结构的根。 每个班都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。

equals(Object obj)

指示一些其他对象是否等于此。(重写后默认比较地址值)

toString()

返回对象的字符串表示形式。(重写后默认打印地址值)

Date类(日期<–>毫秒)

Data类的空参数构造方法(获取当前系统的日期和时间)

Data类的带参数构造方法(传递毫秒值,返回Data日期值)

getTime方法:把日期转换为毫秒

package com.hong.Day007.Demo02;

import java.util.Date;

/*
    java.lang.Date:表示日期和时间的类
    类 Date 表示特定的瞬间,精确到毫秒
    毫秒值的作用:可以对时间和日期进行计算(可以把日期转换成毫秒,把毫秒转换成日期)
把日期转换为毫秒:
     当前日期:2088-01-01
     时间原点(0毫秒):1970年 1 月 1 日 00:00:00(英国格林威治)
注意:
     中国属于东八区:
     时间原点(0毫秒):1970年 1 月 1 日 08:00:00
     把毫秒转换为日期:
     1天 = 24 * 60 * 60 = 86400秒 = 86400 * 1000毫秒
 */
public class Demo01{
    public static void main(String[] args) {
        //获取当前系统时间到1970年1 月 1 日 00:00:00经历了多少毫秒
        System.out.println(System.currentTimeMillis());
        //Data类的空参数构造方法(获取当前系统的日期和时间)
        getData();
        //Data类的带参数构造方法(传递毫秒值,返回Data日期值)
        System.out.println(changeData(0L));
        //getTime方法:把日期转换为毫秒
        Date date = new Date();
        System.out.println(date.getTime());
    }
    //Data类的空参数构造方法(获取当前系统的日期和时间)
    private static void getData() {
        Date date = new Date();
        System.out.println(date);
    }
    //Data类的带参数构造方法(传递毫秒值,返回Data日期值)
    private static Date changeData(long a) {
        Date date1 = new Date(a);
        return date1;
    }
}

DateFormat类(日期<–>文本)

DateFormat是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间。 日期/时间格式化子类(如SimpleDateFormat )允许格式化(即日期文本),解析(文本日期)和归一化。 该日期表示为一个Date对象,或自1970年1月1日00:00:00 GMT以来的毫秒。

Date and Time PatternResult
“yyyy.MM.dd G ‘at’ HH:mm:ss z”2001.07.04 AD at 12:08:56 PDT
“EEE, MMM d, ''yy”Wed, Jul 4, '01
“h:mm a”12:08 PM
“hh ‘o’‘clock’ a, zzzz”12 o’clock PM, Pacific Daylight Time
“K:mm a, z”0:08 PM, PDT
“yyyyy.MMMMM.dd GGG hh:mm aaa”02001.July.04 AD 12:08 PM
“EEE, d MMM yyyy HH:mm:ss Z”Wed, 4 Jul 2001 12:08:56 -0700
“yyMMddHHmmssZ”010704120856-0700
“yyyy-MM-dd’T’HH:mm:ss.SSSZ”2001-07-04T12:08:56.235-0700
“yyyy-MM-dd’T’HH:mm:ss.SSSXXX”2001-07-04T12:08:56.235-07:00
“YYYY-'W’ww-u”2001-W27-3
package com.hong.Day007.Demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
`DateFormat`是日期/时间格式化子类的抽象类
  作用:
    格式化(也就是日期-->文本)、解析(文本-->日期)
  成员方法:
     String format(Data data) 按照指定的模式,把Data日期,格式化为符合模式的字符串
     Data parse(String source) 把符合模式的字符串,解析为Data日期
  DateFormat类是一个抽象类,无法直接创建对象使用,可以使用DateFormat类的子类(SimpleDateFormat)
  构造方法:
      SimpleDateFormat(String pattern)
        用给定的模式和默认语言环境和日期格式符号构造
      参数:
        String pattern:传递指定格式
      模式:(大小写区分)
        y  年
        M  月
        d  日
        H  时
        m  分
        s  秒
 */
public class Demo02 {
    public static void main(String[] args) throws ParseException {
        texi01();
        texi02();
    }
    /*
      使用DataFormat类中的方法format,把日期格式转化为文本
     */
    private static void texi01() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        Date date = new Date();
        String d = sdf.format(date);
        System.out.println(date);
        System.out.println(d);
    }
    /*
      使用DataFormat类中的方法parse,把文本格式解析为日期
     */
    private static void texi02() throws ParseException{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        Date deta = sdf.parse("2008年08月08日 15时51分54秒");
        System.out.println(deta);
    }
}

练习:计算一个人已经出生了多少天

package com.hong.Day007.Demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/*
1.使用Scanner方法获得出生日期(2000年07月16日 05时21分12秒)
2.使用DateFormat中的parse方法把字符串的出生日期解析为Date格式的出生日期
3.把Date格式的出生日期转换为毫秒值
4.获取当前日期,转换为毫秒值
5.使用当前日期的毫秒值-出生日期的毫秒值
6.把毫秒值转换为天(s/1000/60/60/24)
 */
public class Demo03 {
    public static void main(String[] args) throws ParseException {
        System.out.print("请输入您的出生日期:");
        Scanner scanner = new Scanner(System.in);
        String godown = scanner.nextLine();
        Date a = getNow();
        Date b = toDate(godown);
        System.out.println("当前时间的:" + a);
        System.out.println("出生时间的:" + b);
        System.out.println("当前时间的毫秒值" + a.getTime());
        System.out.println("出生时间的毫秒值" + b.getTime());
        double c = (a.getTime() - b.getTime())/1000/60/60/24;
        System.out.println("出生天数:" + c + "天");
        scanner.close();
    }
    //获取当前日期,转换为毫秒值
    private static Date getNow() {
        Date date = new Date();
        return date;
    }
    //使用DateFormat中的parse方法把字符串的出生日期解析为Date格式的出生日期
    private static Date toDate(String godown) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        Date deta = sdf.parse(godown);
        System.out.println(deta);
        return deta;
    }
}

Calendar类(日历)

所述Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fieldsYEARMONTHDAY_OF_MONTHHOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从1970年1月1日00:00 00:00.000 GMT(Gregorian)的Epoch的偏移量。

package com.hong.Day007.Demo02;

import java.util.Calendar;

/*
    java.util.Calendar类:日历类
    Calendar类是一个抽象类,里面提供了很多操作日历字段的方法(YEAR、MONTH、DAY_OF_MONTH、HOUR)
    Calendar类无法直接创建对象使用,里面有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象
    static Calendar getInstance() 使用默认时区和语言环境获得一个日历
 成员方法的参数
 1.int get(int field)返回给定日历字段的值。
 2.void set(int year, int month, int date, int hourOfDay, int minute, int second)设置字段中的值 YEAR , MONTH , DAY_OF_MONTH , HOUR_OF_DAY , MINUTE和 SECOND 。
 3.abstract void add(int field, int amount)根据日历的规则,将指定的时间量添加或减去给定的日历字段。
 4.Date getTime()返回一个 Date表示此物体 Calendar的时间值(毫秒从偏移 Epoch “)。
 */
public class Demo04 {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();//多态
        System.out.println(c);
        //get(int field)返回给定日历字段的值。(输出的月份为美历月份为0-11月)
        int year = c.get(Calendar.YEAR);
        System.out.println(year);
        //set(int year, int month, int date, int hourOfDay, int minute, int second)设置字段中的值 YEAR , MONTH , DAY_OF_MONTH , HOUR_OF_DAY , MINUTE和 SECOND 。
        c.set(Calendar.YEAR,9999);
        int year1 = c.get(Calendar.YEAR);
        System.out.println(year1);
        //add(int field, int amount)根据日历的规则,将指定的时间量添加或减去给定的日历字段。
        c.add(Calendar.YEAR,1);
        int year2 = c.get(Calendar.YEAR);
        System.out.println(year2);
        //Date getTime()返回一个 Date表示此物体 Calendar的时间值(毫秒从偏移 Epoch “)。
        System.out.println(c.getTime());
    }
}

System类和相关练习

System类包含几个有用的类字段和方法。 它不能被实例化。

System类提供的System包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。

快速建立默认格式的变量: System.currentTimeMillis().var

package com.hong.Day007.Demo02;

import java.util.Arrays;

/*
1.static long currentTimeMillis()返回当前时间(以毫秒为单位)。
练习:
    验证for循环打印数字1:9999所需要使用的世界(毫秒)
2.static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)将指定源数组中的数组从指定位置复制到目标数组的指定位置。
                              源数组  源数组的起始位置 目标数组  目标数组中的起始位置 要复制数组元素的数量
练习:
    将src数组中的前3个元素,复制到dest数组的前3个位置上
    复制元素前:src{1,2,3,4,5}  dest{6,7,8,9,10}
    复制元素后:src{1,2,3,4,5}  dest{1,2,3,9,10}
 */
public class Demo05 {
    public static void main(String[] args) {
        //验证for循环打印数字1:9999所需要使用的世界(毫秒)
        long s = System.currentTimeMillis();
        for (int i = 0; i < 9999; i++) {
            System.out.println(i);
        }
        long l = System.currentTimeMillis();
        System.out.println(l-s);

        //将src数组中的前3个元素,复制到dest数组的前3个位置上
        int[] src = {1,2,3,4,5};
        int[] dest = {6,7,8,9,10};
        System.arraycopy(src,0,dest,0,3);
        System.out.println(Arrays.toString(src));
        System.out.println(Arrays.toString(dest));
    }
}

StringBuilder类

StringBuilder的主要StringBuilderappendinsert方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 append方法始终在构建器的末尾添加这些字符; insert方法将insert添加到指定点。

String类和StringBuilder类的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lHbAtIaV-1615209949745)(C:UsersasusAppDataRoamingTyporatypora-user-imagesimage-20210308160158165.png)]

package com.hong.Day007.Demo03;
/*
StringBuilder()
构造一个没有字符的字符串构建器,初始容量为16个字符。可以提高字符串的效率
常用方法:
1.append()表示附加到序列中。可以是所有基本类型
2.capacity()返回当前容量。
3.charAt(int index)返回 char在指定索引在这个序列值。
4.delete(int start, int end)删除此序列的子字符串中的字符。
5.getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)字符从该序列复制到目标字符数组 dst 。
6.indexOf(String str)返回指定子字符串第一次出现的字符串内的索引。
7.length()返回长度(字符数)。
8.replace(int start, int end, String str)用指定的String中的字符替换此序列的子字符串中的 String 。
9.toString()返回表示此顺序中的数据的字符串。
 */
public class Demo01 {
    public static void main(String[] args) {
        //空参数构造
        StringBuilder bu1 = new StringBuilder();
        System.out.println("bu1:" + bu1);//默认空字符串

        //带参数构造
        StringBuilder bu2 = new StringBuilder("abc");
        System.out.println("bu2:" + bu2);//abc

        //常用方法
        //1.append()表示附加到序列中。可以是所有基本类型
        StringBuilder bu3 = bu2.append('c');
        System.out.println("bu3:" + bu3);
        //2.capacity()返回当前容量。
        System.out.println(bu3.capacity());
    }
}

包装类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5hh0TVi-1615209949747)(C:UsersasusAppDataRoamingTyporatypora-user-imagesimage-20210308162107158.png)]

/*
基本类型     包装类(引用类型)
 short      Short
 byte       Byte
 int        Integer
 long       Long
 float      Float
 boolean    Boolean
 char       Character
 */

装箱与拆箱

package com.hong.Day007.Demo03;
/*
装箱:把基本类型的数据,包装到包装类中(基本类型-->包装类)
    构造方法:
        Integer(int value)构造一个新分配的 Integer对象,该对象表示指定的 int值。
        Integer(String s)构造一个新分配 Integer对象,表示 int由指示值 String参数。
    静态方法:
        static Integer valueOf(String s)返回一个 Integer对象,保存指定的值为 String 。
        static Integer valueOf(String s, int radix)返回一个 Integer对象,保存从指定的String中 String的值,当用第二个参数给出的基数进行解析时。
拆箱:在包装类中取出基本类型的数据(包装类-->基本类型)
    成员方法:
        int intValue()将 Integer的值作为 int 。
自动装箱与拆箱:基本类型的数据和包装类之间可以自动的相互转换
 */
public class Demo02 {
}

字符串与基本类型之间的转换

package com.hong.Day007.Demo03;
/*
     基本类型与字符串类型之间的相互转换
     基本类型-->字符串
         1.基本类型的值 + “ ” 最简单的方法
         2.包装类的静态方法toString(参数),不是Object类的toString()重载
         3.String类的静态方法valueOf(参数)
     字符串-->基本类型
         1.使用包装类的静态方法parseInt("字符串")
 */
public class Demo03 {
}

Collection集合

集合的长度是可变的。

集合存储的都是对象,而且对象的类型可以不一样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypqIKATB-1615209949750)(C:UsersasusAppDataRoamingTyporatypora-user-imagesimage-20210308164843630.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VInQpbY5-1615209949752)(C:UsersasusAppDataRoamingTyporatypora-user-imagesimage-20210308184424121.png)]

package com.hong.Day007.Demo03;

import java.util.ArrayList;
import java.util.Collection;

/*
Collection 常用功能
1.public boolean add(E e): 把给定的对象添加到当前集合中
2.public void clear: 从此集合中删除所有元素(可选操作)。
3.public boolean remove(Object o)从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
4.public boolean contains(Object o)如果此集合包含指定的元素,则返回 true 。
5.public boolean isEmpty()如果此集合不包含元素,则返回 true 。
6.public int size()返回此集合中的元素数。
7.public Object[] toArray()返回一个包含此集合中所有元素的数组。
 */
public class Demo04 {
    public static void main(String[] args) {
        //创建集合对象,可以使用多态
        Collection<String> coll = new ArrayList<>();
        System.out.println(coll);//重写了toString方法

        //public boolean add(E e): 把给定的对象添加到当前集合中
        //返回值是一个boolean值
        coll.add("张三");
        coll.add("李四");
        coll.add("王五");
        coll.add("赵六");
        coll.add("田七");
        System.out.println(coll);

        //public boolean remove(Object o)从该集合中删除指定元素的单个实例(如果存在)
        coll.remove("赵六");
        System.out.println(coll.remove("赵四"));//false
        System.out.println(coll);

        //public boolean contains(Object o)如果此集合包含指定的元素,则返回 true 。
        System.out.println(coll.contains("赵四"));//false
    }
}

Iterator接口(迭代器)

想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作

迭代:即Collection集合元素的通用获取方法,在获取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来,一直把集合中的所有元素全部取出,这种取出方式专业术语称为迭代。

快捷键:

在已有集合时 集合名.iterator.var

package com.hong.Day007.Demo03;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
     java.util.Iterator
     有两个常用的方法:
         boolean hasNext() 如果任有元素可以迭代,则返回ture
         E next() 返回迭代下一个元素(取出集合的下一个元素)
     Iterator迭代器,是一个接口,Collectino接口中有iterator()方法用来返回迭代器的实现类对象
     迭代器的使用方法:
         1.使用集合中的方法(iterator)获取迭代器的实现类对象,使用Iterator接口接受(多态)
         2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
         3.使用Iterator接口中的方法next取出集合中的下一个元素
 */
public class Demo05 {
    public static void main(String[] args) {
        //创建一个集合对象
        Collection<String> coll = new ArrayList<>();
        //往集合中添加元素
        coll.add("姚明");
        coll.add("科比");
        coll.add("麦迪");
        coll.add("詹姆斯");
        coll.add("艾弗森");
        /*
          1.使用集合中的方法(iterator)获取迭代器的实现类对象,使用Iterator接口接受(多态)
          注意:
            Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
         */
        //多态   接口            实现类对象
        Iterator<String> a = coll.iterator();
        //2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
        //3.使用Iterator接口中的方法next取出集合中的下一个元素
        for (int i = 0; i < 5; i++) {
            if (a.hasNext()){
                System.out.println(" "+ a.next());
            }
        }
    }
}

增强for循环

增强for循环(也称for-each循环),专门用来遍历数组和集合的,它的内部原理其实就是Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

格式:

for(元素的数据类型 变量 : Collection集合or数组){
    //写操作代码
}

练习1:遍历数组

public static void main(String[] args) {
    int[] arr = {3,5,6,87};
    //遍历数组
    for (int i : arr) {
        System.out.println(i);
    }
}

练习题2: 遍历集合

public static void main(String[] args) {
    ArrayList<Integer> arr = new ArrayList<>();
    arr.add(1);
    arr.add(2);
    arr.add(3);
    arr.add(4);
    //遍历数组
    for (int i : arr) {
        System.out.println(i);
    }
}

泛型(E/T)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iGUy2tR-1615209949753)(C:UsersasusAppDataRoamingTyporatypora-user-imagesimage-20210308190127104.png)]

使用泛型和不使用泛型的对比:

/*
创建集合对象,不使用泛型
好处:
    集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊端:
    不安全,会引发异常

创建集合对象,使用泛型
好处:
    1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
    2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)
弊端:
    泛型是什么类型,只能存储什么类型的数据
 */

泛型的使用:

定义含有泛型的类:

package com.hong.Day007.Demo04;
/*
    定义一个含有泛型的类,模拟ArrayList集合
    泛型是一个未知的数据类型,当我们不确定使用什么数据类型的时候,可以使用泛型
    泛型可以接收任意的数据类型,可以使用Integer、Double、String......
    创建对象的时候确定泛型的数据类型
 */
public class Demo01<E> {
    private E name;

    public Demo01() {
    }

    public Demo01(E name) {
        this.name = name;
    }

    public E getName() {
        return name;
    }

    public void setName(E name) {
        this.name = name;
    }
}
package com.hong.Day007.Demo04;

public class Demo02 {
    public static void main(String[] args) {
        //不写泛型默认为Object类型
        Demo01 demo01 = new Demo01();
        demo01.setName("只能是字符串");
        Object object = demo01.getName();

        //创建Demo01对象,泛型使用Integer类型
        Demo01<Integer> b = new Demo01<Integer>();
        b.setName(1);
        Integer name = b.getName();
        System.out.println(name);

    }
}

定义含有泛型的方法:

package com.hong.Day007.Demo04;
/*
     定义含有泛型的方法:泛型定义在方法的修饰符和值类型之间
     格式:
         修饰符 <泛型> 返回值类型 方法名(参数列表){方法体}
     含有泛型的方法,在调用方法的时候确定泛型的数据类型
 */
public class Demo03 {
    //定义一个含有泛型的方法
    public <M> void method(M m){
        System.out.println(m);
    }

    //定义一个含有泛型的静态方法
    public static <S> void method1(S s){
        System.out.println(s);
    }
}
package com.hong.Day007.Demo04;

public class Demo04 {
    public static void main(String[] args) {
        //创建一个Demo03对象
        Demo03 a = new Demo03();
        a.method(1);
        a.method("a");
        a.method(true);
        a.method(10.0);

        a.method1("静态方法,不建议创建对象使用");
        //静态方法,通过类名.方法名(参数)直接使用
        Demo03.method1("静态方法");
        Demo03.method1(1);
    }
}

定义含有泛型的接口:

package com.hong.Day007.Demo04;
/*
    定义含有泛型的接口
 */
public interface Demo05<I> {
    public abstract void method(I i);
}
package com.hong.Day007.Demo04;
/*
    含有泛型的接口
    第一种使用方法:定义接口的实现类,实现接口,指定接口的泛型
    第二种使用方法:接口使用什么泛型,实现类就使用什么泛型
 */
public class Demo06 implements Demo05<String>{
    @Override
    public void method(String s) {
        System.out.println(s);
    }
}
//public class Demo06<I> implements Demo05<I>{
//    @Override
//    public void method(I i) {
//        System.out.println(i);
//    }
//}
package com.hong.Day007.Demo04;

public class Demo08 {
    public static void main(String[] args) {
        //创建对象
        Demo06 demo06 = new Demo06();
        demo06.method("第一种方法");
    }
}

泛型的通配符:<?>

通配符:不知道使用什么类型来接受的时候,此时可以使用?

此时只能接受数据,不能存储数据

package com.hong.Day007.Demo05;

import java.util.ArrayList;
import java.util.Iterator;

/*
    泛型的通配符:
        ? 代表任意的数据类型
    使用方法:
        不能创建对象使用
        只能作为方法的参数使用
 */
public class Demo01 {
    public static void main(String[] args) {
        ArrayList<Integer> list01 = new ArrayList<>();
        list01.add(1);
        list01.add(2);
        ArrayList<String> list02 = new ArrayList<>();
        list02.add("a");
        list02.add("b");
        printArray(list01);
        printArray(list02);
    }
    /*
    定义一个方法,能遍历所有类型的ArrayList集合(可以使用泛型通配符)
     */
    public static void printArray(ArrayList<?> list){
        System.out.println(list);
        Iterator<?> it = list.iterator();
        while (it.hasNext()){
            //it.next()取出的元素是Object
            Object o = it.next();
            System.out.println(o);
        }
    }
}

泛型的上限和下限

/*
    泛型的上限限定:  ?  extends E  代表使用的泛型只能是E类型的子类/bens
    泛型的下限限定:  ?  super E    代表使用的泛型只能是E类型的父类/bens
    类与类之间的继承关系
    Integer extends Number extends Object
    String extends Object
*/
public class Demo02 {
}

ArrayList list01 = new ArrayList<>();
list01.add(1);
list01.add(2);
ArrayList list02 = new ArrayList<>();
list02.add(“a”);
list02.add(“b”);
printArray(list01);
printArray(list02);
}
/*
定义一个方法,能遍历所有类型的ArrayList集合(可以使用泛型通配符)
*/
public static void printArray(ArrayList<?> list){
System.out.println(list);
Iterator<?> it = list.iterator();
while (it.hasNext()){
//it.next()取出的元素是Object
Object o = it.next();
System.out.println(o);
}
}
}


### 泛型的上限和下限

```java
/*
    泛型的上限限定:  ?  extends E  代表使用的泛型只能是E类型的子类/bens
    泛型的下限限定:  ?  super E    代表使用的泛型只能是E类型的父类/bens
    类与类之间的继承关系
    Integer extends Number extends Object
    String extends Object
*/
public class Demo02 {
}

最后

以上就是苗条酸奶为你收集整理的Day 7 2021.3.8Final-权限修饰符-部分常用类-集合-泛型Day 7 2020.3.8的全部内容,希望文章能够帮你解决Day 7 2021.3.8Final-权限修饰符-部分常用类-集合-泛型Day 7 2020.3.8所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部