Java-29 泛型 增强for循环 静态导入 可变参数
2021/10/15 22:16:38
本文主要是介绍Java-29 泛型 增强for循环 静态导入 可变参数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 泛型:把明确数据类型的工作提前到编译时期,在创建对象的时候明确。这种有点像把类型当作参数进行传递,所以泛型还有另外一种叫法:参数化类型。
- 格式:
<数据类型>
注意:这里的数据类型只能是引用数据类型 - 好处:
1、将运行时期的问题提前到编译时期
2、避免了强制类型转化
3、优化了代码程序,消除不必要的黄色警告线
import java.util.ArrayList; public class GenericDemo1 { public static void main(String[] args) { //JDK1.7之后会自动的进行类型推断 ArrayList<String> strings = new ArrayList<>(); strings.add("hello"); strings.add("world"); // strings.add(1);//报错 //集合遍历 for (String string : strings) { System.out.println(string); } } }
- 泛型的高级用法:(通配符)
泛型通配符<?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了
//如果泛型里面的类型只用一个的时候,并且明确了数据类型的时候,前后必须要写一致 ArrayList<Object> objects = new ArrayList<Object>(); // ArrayList<Object> objects2 = new ArrayList<Animal>(); // ArrayList<Object> objects2 = new ArrayList<Dog>(); // ArrayList<Object> objects3 = new ArrayList<Cat>(); //泛型通配符<?> //表示任意类型,如果没有明确,那么就是Object以及任意的Java类 //还没有明确类型 ArrayList<?> objects1 = new ArrayList<Object>(); ArrayList<?> objects2 = new ArrayList<Animal>(); ArrayList<?> objects3 = new ArrayList<Dog>(); ArrayList<?> objects4 = new ArrayList<Cat>();
<? extends E>
向下限定,E及其子类
//<? extends E> //向下限定,E及其子类 ArrayList<? extends Animal> a1 = new ArrayList<Animal>(); ArrayList<? extends Animal> a2 = new ArrayList<Dog>(); ArrayList<? extends Animal> a3 = new ArrayList<Cat>(); // ArrayList<? extends Animal> a4 = new ArrayList<Object>();
<? super E>
向上限定,E及其父类
//<? super E> //向上限定,E及其父类 ArrayList<? super Animal> animal1 = new ArrayList<Animal>(); // ArrayList<? super Animal> animal2 = new ArrayList<Dog>(); // ArrayList<? super Animal> animal3 = new ArrayList<Cat>(); ArrayList<? super Animal> animal4 = new ArrayList<Object>();
- 泛型类的使用
public class GenericClass<E> { private E name; public E getName() { return name; } public void setName(E name) { this.name = name; } } public class GenericDemo3 { public static void main(String[] args) { GenericClass<String> stringGenericClass = new GenericClass<>(); stringGenericClass.setName("hello"); System.out.println(stringGenericClass.getName());//hello // stringGenericClass.setName(12);//编译错误 } }
- 定义含有泛型的类
/* 泛型方法:将泛型定义方法上 格式:public <泛型类型> 返回类型 方法名(泛型类型 .) */ public class GenericDemo4 { public static void main(String[] args) { GenericDemo4 genericDemo4 = new GenericDemo4(); genericDemo4.show1(110); genericDemo4.show1("hello"); genericDemo4.show1(false); show(112); show("true"); show('h'); } //定义一个泛型方法 public <E> void show1(E e){ System.out.println(e); } //定义一个含有静态方法的泛型方法 public static <E> void show(E e){ System.out.println(e); } }
- 定义泛型接口
- 使用方式一 :定义接口的实现类,实现接口,指定接口的类型
- 使用方式二:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
/* 把泛型定义在接口上 格式:public interface 接口名<泛型类型1…> */ public interface Generic<T> { public abstract void show(T t); } //定义实现接口类 public class GenericClass2<T> implements Generic<T>{ @Override public void show(T t) { System.out.println(t); } } /* 泛型接口测试 */ public class GenericDemo5 { public static void main(String[] args) { GenericClass2<String> stringGenericClass2 = new GenericClass2<>(); stringGenericClass2.show("hello");//hello GenericClass2<Object> objectGenericClass2 = new GenericClass2<>(); objectGenericClass2.show(1); } }
- 增强for循环: 用来遍历数组和Collection集合
增强for循环,JDK1.5之后出现
到目前为止,JDK1.5之后出现的特性:泛型、增强for循环、包装类(自动装箱、自动拆箱)
- 格式:
for(元素的数据类型 变量名 : 数组名/Collection集合名称){ 使用变量即可,该变量就是元素。 }
- 注意:集合和数组能使用增强for循环的,就使用增强for循环,它也可以消除黄色警告线
public class ForDemo { public static void main(String[] args) { //定义一个数组 int[] arr = {1,2,3,4,5,6}; // for(int i=0;i<arr.length;i++){ // System.out.println(arr[i]); // } System.out.println("+++++++++++++增强for循环遍历数组+++++++++++++"); for (int i : arr) { System.out.println(i); } System.out.println("====================================="); //创建一个集合对象 ArrayList<String> strings = new ArrayList<String>(); strings.add("hello"); strings.add("world"); strings.add("bigdata"); strings.add("hive"); // for(String string : strings){ // System.out.println(string); // } // strings = null; //NullPointerException // for (String string : strings) { // System.out.println(string); // } //上面的string是不是从strings集合取出来的,而strings是null //所以我们在遍历之前加一个判断,判断是不是空 // if(strings != null){ // for (String string : strings) { // System.out.println(string); // } // } //其实增强for循环就是用来替代迭代器的 //如何验证呢? //我们之前学迭代器的时候,遇到一个问题:并发修改异常 //ConcurrentModificationException for(String s : strings){ if("world".equals(s)){ strings.add("flink"); } }
- 静态导入:
- 格式:import static 包名….类名.方法名;
- 注意事项:
- 方法必须是静态的
- 如果说本类有其他的方法与静态导入的方法重名了,优先使用的是本类中的方法
- 当静态导入的方法重名了,通过增加前缀的方法去调用
public class FunctionDemo { public static void show(String s){ System.out.println(s); } public static int abs(int i){ System.out.println("这是在FunctionDemo中的abs方法"); return i; } } /* 静态导入: 静态导入概述 格式:import static 包名….类名.方法名; 可以直接导入到方法的级别 */ import static java.lang.Math.abs; import static com.shujia.java.day18.FunctionDemo.show; import static com.shujia.java.day18.FunctionDemo.abs; public class StaticImportDemo { public static void main(String[] args) { System.out.println(Math.abs(-100)); //有没有什么办法,不用去写类名,直接写方法名调用即可 // System.out.println(abs(-100)); //有一种办法,可以不用写类名,直接通过使用方法名调用 //静态导入 import static java.lang.Math.abs; // System.out.println(abs(-200)); //在一个程序种静态导入使用的方式可以和类名直接调用方式共存 show("hello");//这是在本类中的show方法 FunctionDemo.show("world"); //当静态导入的方法重名了,怎么办呢? //通过增加前缀的方法去调用 // System.out.println(abs(20)); System.out.println(com.shujia.java.day18.FunctionDemo.abs(20)); } public static void show(String s){ System.out.println("这是在本类中的show方法"); } }
可变参数:
/* 可变参数概述 定义方法的时候不知道该定义多少个参数 格式 修饰符 返回值类型 方法名(数据类型... 变量名){} 注意: 这里的变量其实是一个数组 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个 */ public class ArgsDemo { public static void main(String[] args) { //求两个数之和 int a = 10; int b = 20; sum(a,b); //求三个数之和 int c = 30; sum(a,b,c); //求四个数之和 int d = 40; sum(a,b,c,d); //可变参数改进 sum(a,b,c,d,12,32,41,2,13,141,431,31,313,89); } public static void sum(int... ints){ int sum =0; //这里的变量其实是一个数组 for (int anInt : ints) { sum +=anInt; } System.out.println(sum); } public static void sum(int i,int j){ System.out.println(i+j); } public static void sum(int i,int j,int x){ System.out.println(i+j+x); } public static void sum(int i,int j,int x,int y){ System.out.println(i+j+x+y); } }
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /* Arrays工具类中的可变参数方法举例: public static <T> List<T> asList(T... a):将数组转成集合 1、集合与数组之间的互相转换 2、数组排序 */ public class ArraysDemo { public static void main(String[] args) { //集合--数组 ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(33); integers.add(44); integers.add(11); integers.add(55); integers.add(22); //将集合转成数组 Object[] objects = integers.toArray(); //数组--集合 List<Object> objectList = Arrays.asList(objects); for (Object o : objectList) { Integer i = (Integer)o; System.out.println(i); } System.out.println("******************************"); Arrays.sort(objects); for (Object object : objects) { System.out.println(object); } } }
这篇关于Java-29 泛型 增强for循环 静态导入 可变参数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-29RocketMQ底层原理资料详解:新手入门教程
- 2024-11-29RocketMQ源码资料解析与入门教程
- 2024-11-29[开源]6.1K star!这款电视直播源神器真的太赞啦!
- 2024-11-29HTTP压缩入门教程:轻松提升网页加载速度
- 2024-11-29JWT开发入门指南
- 2024-11-28知识管理革命:文档软件的新玩法了解一下!
- 2024-11-28低代码应用课程:新手入门全攻略
- 2024-11-28哪些办公软件适合团队协作,且能够清晰记录每个阶段的工作进展?
- 2024-11-28全栈低代码开发课程:零基础入门到初级实战
- 2024-11-28拖动排序课程:轻松掌握课程拖动排序功能