Java学习之路(七):泛型
泛型的概述和基本使用
作用:把类型明确的工作推前到创建对象或者调用方法的时候
泛型是一种参数化类型,把类型当做参数一样传递来明确集合的元素类型
泛型的好处
- 提高安全性
- 省去强转的麻烦
泛型的基本使用
- 声明集合泛型的格式:List<String> li = new ArrayList<String>();
- <>中存放的必须是引用数据类型
泛型的注意事项
- 默认声明一个泛型集合,前后的类型要一致
- jdk1.7以上的新特性:在声明泛型类型的时候可以只声明前面的泛型(菱形泛型)
- 集合声明泛型:代表此类或者子类都可以成为集合的元素 
- 声明的泛型类型一定要是引用类型
泛型ArrayList的遍历
package lesson03; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Demo01 { public static void main(String[] args){ List<String> li = new ArrayList<String>();
li.add("A");
li.add("B");
li.add("C");
Iterator<String> iterator = li.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
} } }
第一种:String
package lesson03; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Demo01 { public static void main(String[] args){ List<Student> li = new ArrayList<Student>();
li.add(new Student(11,"null11"));
li.add(new Student(22,"null22"));
li.add(new Student(33,"null33"));
li.add(new Student(44,"null44"));
for(Student fo:li){
System.out.println(fo);
}
} } class Student{
int age;
String name;
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}
第二种:Object
泛型类
定义格式:
public class 类名<泛型类型1,...> 注意:这里可以有多个,但不建议
我们一般写成 public class 类名<T>
注意事项:
- 泛型类型必须是引用类型
- T的值是在创建对象的时候出现的
泛型方法
定义格式:
public 返回类型 方法名(泛型类型 变量名)
注意:对象方法的泛型参数要与类中的泛型一致,不可以使用其他的名字
顺便补充:
泛型方法的定义:
public 返回类型(T) 方法名(泛型类型T 变量名)
具体的例子:
class Student<T>{    //泛型类
    private T o;                  //泛型属性
    public T getO() {
        return o;
    }
    public void setO(T o) {
        this.o = o;
    }
    public void fun1(T f1){}   //泛型方法,无参数
    public T fun2(int val){      //泛型方法,有参数
        return null;
    }
}
泛型接口
其实也就是:
public interface 接口名<数据类型>
使用场景:Dao (数据访问层)
泛型的高级使用(通配符)
- <?>   表示任意类型,如果没有明确表示,那么就是Object以及任何java类
- 一般是在传入参数的时候用的,表示接受任何类型
 
- ? extends E   向下限定,E以及其子类
- addAll方法,如果T是一个父类,那么添加的列表可以是子类,但是被添加的类表不能是子类
 
- ? super E 向上限定,E以及其父类
增强for循环
简化数组和Collection集合的遍历
格式:
for(元素数据类型 变量:数组或者Collection集合){
使用变量即可,这个变量就是数组或者Collection集合中的元素
}
其实在之前的ArrayList遍历中使用的便是增强for循环
注意:增强for循环不能边遍历,边删除元素,增强for循环的内部还是调用了
可变参数
定义方法的时候不知道我们该定义多少个参数。
格式:
修饰符 返回值类型 方法名(数据类型...变量名){}
注意事项:
- 这里的变量在内部就封装成了一个数组
- 如果一个方法有可变参数,并且有多个参数,可变参数要放在最后面
补充:
Arrays工具类的asList()方法的使用
List<String> li = Arrays.asList("A","B","C");
System.out.println(li);
在Arrays工具类的asList方法中就是使用了可变参数
Collection中的toArray(T[] a)将泛型转化为数组
package lesson05; import java.util.ArrayList;
import java.util.List; public class Demo01 { public static void main(String[] args) { List<String> li = new ArrayList<String>();
li.add("A");
li.add("B");
li.add("C"); String[] arr = new String[3];
li.toArray(arr); for(String fo:arr){
System.out.println(fo);
} } }
接下类是一个小例子
package lesson06;
//一个例子
//学生类
//班级集合
//学校集合 import java.util.ArrayList;
import java.util.List; public class Demo1 { public static void main(String[] args) {
List<Student> class_li = new ArrayList<Student>();
class_li.add(new Student(1,"null1"));
class_li.add(new Student(2,"null2"));
class_li.add(new Student(3,"null3"));
class_li.add(new Student(4,"null4"));
List<List<Student>> school_list = new ArrayList<List<Student>>();
school_list.add(class_li); for(List<Student> class_item:school_list){
for(Student stu_item:class_item){
System.out.println(stu_item);
} } }
}
class Student{
int age;
String name;
public Student() {
super();
}
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
} }
List嵌套List
Java学习之路(七):泛型的更多相关文章
- Java学习之路(七)
		1:什么是异常? 中断了正常指令流的事件. 异常是一个对象 ,在出现异常时,虚拟机会生成一个异常对象 生成对象的类是由 JDK 提供的 
- java学习之路之javaSE基础1
		<h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ... 
- JAVA学习之路与大家分享
		这是我四年以前总结的JAVA学习之路,希望对初学者或想从事JAVA开发的人有帮助. 本人是软件工程专业出身,先后学过C.C++.JAVA.VB.delphi等等开发语言以及网络相关管理技术.哎,好久不 ... 
- 新篇章之我的java学习之路下
		昨天写下了人生的第一篇博客,今天接着写我的java学习之路有关开发及框架的学习过程. 想要学好java语言,只学习一些java的基本语法对实际开发中的用处还是不大的,所以我们还要掌握一些有关javaW ... 
- java学习之路之javaSE基础2
		java学习之路之javaSE基础2 所有的代码都是引用他人写的. 1.逻辑运算符 //&,|,^,! //int x = 10; //5 < x < 15 //x > 5 ... 
- Java学习之路(转)
		Java学习之路(书籍推荐) 一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多 ... 
- Java 学习之路 -- day00
		Java 学习之路 -- day00 Typora 快捷键操作 标题:#+空格 2. *斜体* 3. **加粗** 4. **斜体加粗*** 5. ~~删除线~~ 6. > 引用 7. ···分 ... 
- Java学习笔记(七):内部类、静态类和泛型
		内部类 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一下这四种 ... 
- (转)如何学习Java技术?谈Java学习之路
		51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ... 
随机推荐
- Linux 基础教程 35-软件包管理-YUM
			YUM基础 使用RPM在Linux中安装.卸载软件或服务进会经常碰到RPM包的依赖,而我们在安装软件A时,提示依赖于软件B,安装软件B时又会出现提示依赖于软件C等一系列的依赖关系.这时大家会提 ... 
- MYSQL - JSON串中查找key对应的值
			1.建表 -- 建表 drop table if exists ta_product2; CREATE TABLE ta_product2( id int primary key auto_incre ... 
- java复习小知识(基础不算,有反射,递归)
			顺序选择循环,三种 1.至于循环和递归 循环效率更高,但是递归在处理文件递归的时候更为常见快捷 在java中实现传多参 2.public static void main(String[] args ... 
- C#基础入门 六
			C#基础入门 六 静态类进阶 静态构造方法 用于初始化任何静态数据,或用于执行仅需执行一次的特定操作,在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数,静态构造方法是无参数的. publ ... 
- .NET Core调用WCF的最佳实践
			现在.NET Core貌似很火,与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样.但是冷静背后我们要也看到.NET Core目前还有太多不足,别的不多说,与自家的服务框架WCF ... 
- sgi stl内存池实现------源码加翻译
			class __default_alloc_template { enum { unit = 8 };//分配单位 后面直接用8代替 enum { max_bytes = 128 };//最大分配字节 ... 
- 手动开发PHP模板引擎 一 (35)
			模板叫做TPL,模仿于smarty模板引擎. 我们所说的模板是Web模板,是主要由HTML标记组成的语言来编写的页面,但也有如何表示包含动态生成内容的方式(解析标签).模板引擎是一种软件库,允许我们从 ... 
- windows挂载网络盘
			@echo offset filename=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%set filename="DataBak-%filename%"ne ... 
- BZOJ 1248--游乐园(DFS&贪心)
			1248: 游乐园Pleasure Ground Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 6 Solved ... 
- 实时监测input输入变化 jQuery
			$('#production_name').on('input propertychange',function(){ alert('输入一个字弹一回'); }); 
