概述
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 Pattern | Result |
---|---|
“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 fields
如YEAR
, MONTH
, DAY_OF_MONTH
, HOUR
,等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从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的主要StringBuilder
是append
和insert
方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复