Java集合框架(十八)——集合(集合方法)、Iterator迭代器(实现原理、转型)、增强for循环、泛型(引入、类\接口、通配符、限定)

目录

第一章 集合

1.1 ArrayList集合

1.2 集合Collection

1.3 集合Collection的方法

1.3.1 add()方法

 1.3.2 clear方法

1.3.3  contains(Object o)方法

1.3.4  remove(Object o)方法

1.3.5 size()方法 

1.3.6 toArray() 方法

第二章 Iterator迭代器

2.1 迭代器的概述

2.2 迭代器的实现原理

2.3 集合迭代中的转型  

第三章 增强for循环遍历数组

3.1 增强for循环

第四章 泛型类

4.1 泛型的引入

4.2 泛型的定义与使用

4.3 泛型类、接口

4.3.1 带有泛型的类

4.3.2 带有泛型的接口

4.4 泛型的通配符

 4.5 泛型的限定


第一章 集合

集合,集合是java中提供的一种容器,可以用来存储多个数据。 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据。那么,集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的。集合的长度是可变的。集合中存储的元素必须是引用类型数据 。

 

1.1 ArrayList集合

Alt+Shift+s:给私有成员变量添加get与set方法(或者右键sourse)。

ArrayList集合举例:

package day18.demo1;
public class Person {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
}
package day18.demo1;
import java.util.ArrayList;
/*
 *  集合体系,
 *    目标  集合本身是一个存储的容器:
 *       必须使用集合存储对象
 *       遍历集合,取出对象
 *       集合自己的特性
 */
public class ArrayListDemo {
	public static void main(String[] args) {
		/*
		 *  集合ArrayList,存储int类型数
		 *  集合本身不接受基本类,自动装箱存储
		 */
		ArrayList<Integer> array = new ArrayList<Integer>();
		array.add(11);
		array.add(12);
		array.add(13);
		array.add(14);
		array.add(15);
		for(int i = 0 ; i < array.size() ;i++){
			System.out.println(array.get(i));
		}
		/*
		 *  集合存储自定义的Person类的对象
		 */
		ArrayList<Person> arrayPer = new ArrayList<Person>();
		arrayPer.add(new Person("a",20));
		arrayPer.add(new Person("b",18));
		arrayPer.add(new Person("c",22));
		for(int i = 0 ; i < arrayPer.size();i++){
			//get(0),取出的对象Person对象
			//打印的是一个对象,必须调用的toString()
			System.out.println(arrayPer.get(i));//输出的不是地址,因为Person类中重写了toString类
		}
	}
}

 

1.2 集合Collection

查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口。Collection接口为最顶层集合接口了。

说明我们在使用ArrayList类时,该类已经把所有抽象方法进行了重写。那么,实现Collection接口的所有子类都会进行方法重写。

  •    Collecton接口常用的子接口有:List接口、Set接口
  •    List接口常用的子类有:ArrayList类、LinkedList类
  •    Set接口常用的子类有:HashSet类、LinkedHashSet类

List:可以存储重复的元素,并且容器中元素都有序排列。

Set:不可存储重复的元素,并且容器中元素无序。

 

1.3 集合Collection的方法

集合转数组的意义:在IO中统计文件个数,一旦数目确定了就会将集合转为数组。

多行注释:

CTRL + SHIFT + /

多行取消注释(斜杠换成反斜杠):

CTRL + SHIFT + \

1.3.1 add()方法

Collection<String> coll = new ArrayList<String>();
coll.add("abc");

 1.3.2 clear方法

void clear() 清空集合中的所有元素,集合容器本身依然存在。//[]

public static void function(){
		//接口多态的方式调用
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc");
		coll.add("bcd");
		System.out.println(coll);
		
		coll.clear();
		
		System.out.println(coll);//[]  只是倒掉水,杯子还在
		
	}

1.3.3  contains(Object o)方法

boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true;方法参数是Object类型.

private static void function_1() {
        Collection<String> coll = new ArrayList<String>();
        coll.add("abc");
        coll.add("itcast");
        coll.add("itheima");
        coll.add("money");
        coll.add("123");
        
        boolean b = coll.contains("itcast");
        System.out.println(b);    //true
    }

1.3.4  remove(Object o)方法

  boolean remove(Object o)移除集合中指定的元素。

如果有两个符合条件的元素,remove只删除第一个遇到的元素。

private static void function_3(){
        Collection<String> coll = new ArrayList<String>();
        coll.add("abc");
        coll.add("money");
        coll.add("itcast");
        coll.add("itheima");
        coll.add("money");
        coll.add("123");    
        System.out.println(coll);//[abc, money, itcast, itheima, money, 123]
        
        boolean b = coll.remove("money");
        System.out.println(b);    //true
        System.out.println(coll);//[abc, itcast, itheima, money, 123]
    }

 

1.3.5 size()方法 

学习Java中三种长度表现形式:

  • 数组.length 属性  返回值 int
  • 字符串.length() 方法,返回值int
  • 集合.size()方法, 返回值int

 

1.3.6 toArray() 方法

Object[] toArray() 是将集合中的元素转成数组中的元素, 即集合转成数组。
     返回是一个存储对象的数组, 数组存储的数据类型是Object

 private static void function_2() {
        Collection<String> coll = new ArrayList<String>();
        coll.add("abc");
        coll.add("itcast");
        coll.add("itheima");
        coll.add("money");
        coll.add("123");
        
        Object[] objs = coll.toArray();
        for(int i = 0 ; i < objs.length ; i++){
            System.out.println(objs[i]);//打印的是数组元素
        }
    }
package day18.demo1;

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

/*
 *  Collection接口中的方法
 *  是集合中所有实现类必须拥有的方法
 *  使用Collection接口的实现类,程序的演示
 *  ArrayList implements List
 *  List extends Collection
 *  方法的执行,都是实现的重写
 */
public class CollectionDemo {
	public static void main(String[] args) {
		function_3();
	}
	/*
	 * Collection接口方法
	 * boolean remove(Object o)移除集合中指定的元素
	 */
	private static void function_3(){
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc");
		coll.add("money");
		coll.add("itcast");
		coll.add("itheima");
		coll.add("money");
		coll.add("123");	
		System.out.println(coll);//[abc, money, itcast, itheima, money, 123]
		
		boolean b = coll.remove("money");
		System.out.println(b);	//true
		System.out.println(coll);//[abc, itcast, itheima, money, 123]
	}
	
	/*  Collection接口方法
	 *  Object[] toArray() 集合中的元素,转成一个数组中的元素, 集合转成数组
	 *  返回是一个存储对象的数组, 数组存储的数据类型是Object
	 */
	private static void function_2() {
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc");
		coll.add("itcast");
		coll.add("itheima");
		coll.add("money");
		coll.add("123");
		
		Object[] objs = coll.toArray();
		for(int i = 0 ; i < objs.length ; i++){
			System.out.println(objs[i]);
		}
	}
	/*
	 * 学习Java中三种长度表现形式
	 *   数组.length 属性  返回值 int
	 *   字符串.length() 方法,返回值int
	 *   集合.size()方法, 返回值int
	 */
	
	/*
	 * Collection接口方法
	 * boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true
	 * 方法参数是Object类型
	 */
	private static void function_1() {
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc");
		coll.add("itcast");
		coll.add("itheima");
		coll.add("money");
		coll.add("123");
		
		boolean b = coll.contains("itcast");
		System.out.println(b);
	}


	/*
	 * Collection接口的方法
	 * void clear() 清空集合中的所有元素
	 * 集合容器本身依然存在
	 */
	public static void function(){
		//接口多态的方式调用
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc");
		coll.add("bcd");
		System.out.println(coll);
		
		coll.clear();
		
		System.out.println(coll);//[]  只是倒掉水,杯子还在
		
	}
}

 

第二章 Iterator迭代器

 

2.1 迭代器的概述

Java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。 取得方式也不一样,未解决此问题,迭代器就出现了,为了统一我们取元素的方式。

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

每种集合的底层的数据结构不同,例如ArrayList是数组,LinkedList底层是链表,但是无论使用那种集合,我们都会有判断是否有元素 以及取出里面的元素的动作,那么Java为我们提供一个迭代器定义了统一的判断元素和取元素的方法。

 

2.2 迭代器的实现原理

集合中的迭代器: 获取集合中元素方式。

接口 Iterator 的两个抽象方法:

boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true

next() 取出集合中的下一个元素

Collection接口定义方法

Iterator iterator()

ArrayList 重写方法 iterator(),返回了Iterator接口的实现类的对象

使用ArrayList集合的对象

  • Iterator it =array.iterator(),运行结果就是Iterator接口的实现类的对象
  • it是接口的实现类对象,调用方法 hasNext 和 next 集合元素迭代 
  • Iterator<String> it = coll.iterator();执行到此步指针才生成,且在-1的位置。遇到next()语句时,指针才后移。迭代器指针只能后移,因此迭代器只能使用一次。

迭代元素图解:

注意:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。

for循环的迭代器节省内存,因为迭代器是在for循环内建立的,而while的迭代器是在main内建立的。但是一般用while,代码简洁。

while(it.hasNext()){
			String s = it.next();
			System.out.println(s);
		}
for (Iterator<String> it2 = coll.iterator(); it2.hasNext();  ) {
			System.out.println(it2.next());
	}

 

package day18.demo1;

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

/*
 *  集合中的迭代器:
 *    获取集合中元素方式
 *  接口 Iterator : 两个抽象方法
 *     boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true
 *     next() 取出集合中的下一个元素
 *     
 *  Iterator接口,找实现类.
 *    Collection接口定义方法 
 *       Iterator  iterator()
 *    ArrayList 重写方法 iterator(),返回了Iterator接口的实现类的对象
 *    使用ArrayList集合的对象
 *     Iterator it = array.iterator(),运行结果就是Iterator接口的实现类的对象
 *     it是接口的实现类对象,调用方法 hasNext 和 next 集合元素迭代
 */
public class IteratorDemo {
	public static void main(String[] args) {
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		//迭代器,对集合ArrayList中的元素进行取出
		
		//调用集合的方法iterator()获取出,Iterator接口的实现类的对象
		Iterator<String> it = coll.iterator();
		//接口实现类对象,调用方法hasNext()判断集合中是否有元素
		//boolean b = it.hasNext();
		//System.out.println(b);
		//接口的实现类对象,调用方法next()取出集合中的元素
		//String s = it.next();
		//System.out.println(s);
		
		//迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false
		while(it.hasNext()){
			String s = it.next();
			System.out.println(s);
		}
		
		/*for (Iterator<String> it2 = coll.iterator(); it2.hasNext();  ) {
			System.out.println(it2.next());
		}*/
		
	}
}

 

2.3 集合迭代中的转型  

1. Cllection接口的简单使用,集合中可以存储任何对象,那么存放进去的数据都是还是原来类型吗?

  • 不是了,提升成了object.

2. 在使用集合时,我们需要注意以下几点:

  • 集合中存储其实都是对象的地址。
  • 集合中可以存储基本数值吗? jdk1. 5版本以后可以存储了。因为出现了基本类型包装类,它提供了自动装箱操作(基本类型>对象), 这样,集合中的元素就是基本数值的包装类对象。
  • 存储时提升了Object.取出时要使用元素的特有内容,必须向下转型。

注意:如果集合中存放的是多个对象,这时进行向下转型会发生类型转换异常。

提示:Iterator接口也可以使用<>来控制迭代元素的类型的。  

//Iterator接口也可以使用<>来控制迭代元素的类型的。
 Collection<String> coll = new ArrayList<String>();
 coll.add("abc");
 coll.add("aabbcc");
 coll.add("shitcast");
 Iterator<String> it = coll.iterator();
 while (it.hasNext()) {
  String str =  it.next(); 
 //当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
  System.out.println(str.length());
 }

 

package day18.demo1;

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

public class CollectionDemo1 {
	public static void main(String[] args) {
		//集合可以存储任意类型的对象
		//集合中,不指定存储的数据类型, 集合什么都存
		Collection coll = new ArrayList();
		coll.add("abc");//提升为Object类
		coll.add("uyjgtfd");
		
		//迭代器获取
		Iterator it = coll.iterator();
		while(it.hasNext()){
			//it.next()获取出来的是什么数据类型,Object类
			//Object obj = it.next();
			//System.out.println(obj);
			String s = (String)it.next();//获取子类特有属性,必须强转
			System.out.println(s.length());
		}
	}
}

 

第三章 增强for循环遍历数组

 

3.1 增强for循环

JDK1.5版本后,出现新的接口 java.lang.Iterable,Collection接口开始继承Iterable接口。
 Iterable实现增强for循环。  
 格式:
            for( 数据类型  变量名 : 数组或者集合 ){
                     System.out.println(变量);
                    }

原理图:增强for循环

将数组中的值赋给i,打印i,未修改数组中的值。

增强for循环:

好处: 代码少了,方便对容器遍历

弊端: 没有索引,不能修改容器里面的元素。

因此增强for循环适合做遍历使用。

 

package day18.demo1;

import java.util.ArrayList;

/*
 *  JDK1.5新特性,增强for循环
 *  JDK1.5版本后,出现新的接口 java.lang.Iterable
 *    Collection开始继承Iterable
 *    Iterable作用,实现增强for循环
 *    
 *    格式:
 *      for( 数据类型  变量名 : 数组或者集合 ){
 *         sop(变量);
 *      }
 */

public class ForEachDemo {
	public static void main(String[] args) {
		function_2();
	}
	/*
	 *  增强for循环遍历集合
	 *  存储自定义Person类型
	 */
	public static void function_2(){
		ArrayList<Person> array = new ArrayList<Person>();
		array.add(new Person("a",20));
		array.add(new Person("b",10));
		for(Person p : array){
			System.out.println(p);
		}
	}
	
	
	public static void function_1(){
		//for对于对象数组遍历的时候,能否调用对象的方法呢
		String[] str = {"abc","itcast","cn"};
		for(String s : str){
			System.out.println(s.length());
		}
	}
	
	/*
	 *  实现for循环,遍历数组
	 *  好处: 代码少了,方便对容器遍历
	 *  弊端: 没有索引,不能操作容器里面的元素
	 */
	public static void function(){
		int[] arr = {3,1,9,0};
		for(int i : arr){
			System.out.println(i+1);
		}
		System.out.println(arr[0]);
	}
}

 

有泛型才可以使用增强for,否则会出现安全隐患。

增强for循环和老式的for循环有什么区别?

注意:增强for 循环必须有被遍历的目标。目标只能是Cllection 或者是数组。

建议:遍历数组时,如果仅为遍历,可以使用增强for。如果要对数组的元素进行操作,使用老式for循环可以通过角标操作。

 

第四章 泛型类

 

4.1 泛型的引入

在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成object类型。当我们在取出每一个对象 ,并且进行相应的操作,这时必须采用类型转换。例如:

package day18.demo1;


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


public class GenericDemo {
	public static void main(String[] args) {
		function();
	}
	
	public static void function(){
		Collection coll = new ArrayList();
		coll.add("abc");
		coll.add("rtyg");
		coll.add("43rt5yhju");
		coll.add(1);    //有安全隐患,integer类型不能转换为String类型
		
		Iterator it = coll.iterator();
		while(it.hasNext()){
			String s = (String)it.next();
			System.out.println(s.length());
		}
	}
}

程序在运行时发生了问题java.lang.ClassCastException
为什么会发生类型转换异常呢?、
       由于集合中什么类型的元素都可以存储。导致取出时,如果出现强转就会引发运行时ClassCastException异常

怎么来解决这个问题呢?

       使用集合时,必须明确集合中元素的类型。这种方式称为:泛型。

注意:有泛型才可以使用增强for,否则会出现安全隐患。

package day18.demo1;
//将上述代码加上泛型
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
 * JDK1.5 出现新的安全机制,保证程序的安全性
 *   泛型: 指明了集合中存储数据的类型  <数据类型>
 */

public class GenericDemo {
	public static void main(String[] args) {
		function();
	}
	
	public static void function(){
		Collection<String> coll = new ArrayList<String>();
		coll.add("abc");
		coll.add("rtyg");
		coll.add("43rt5yhju");
//		coll.add(1);
		
		Iterator<String> it = coll.iterator();
		while(it.hasNext()){
			String s = it.next();
			System.out.println(s.length());
		}
	}
}

 

4.2 泛型的定义与使用

泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。JDK1.5 出现新的安全机制,保证程序的安全性。

泛型,指明了集合中存储数据的类型  <数据类型>,即在尖括号中写上数据类型。

定义格式: 修饰符 class 类名<代表泛型的变量> { }

 

4.3 泛型类、接口

4.3.1 带有泛型的类

ArrayList<E>

E: Element 元素, 实际思想就是一个变量而已 

 ArrayList<Integer> , E 接受到类型,就是Integer类型

package day18.demo1;

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

/*
 *  带有泛型的类
 *    ArrayList
 *    E: Element 元素, 实际思想就是一个变量而已 
 *    ArrayList<Integer> , E 接受到类型,就是Integer类型
 *    public class ArrayList<E>{
 *    
 *       public boolean add(Integer e){
 *          elementData[size++] = e;
 *       }
 *       
 *       public boolean add(E e){}
 *    }
 *    
 *    Iterator<E> 
 *    E next()
 *    
 *    Iterator<Integer> 
 *    Integer next()
 *   
 */
public class GenericDemo1 {
	public static void main(String[] args) {
		ArrayList<Integer>  array = new ArrayList<Integer> ();
		array.add(123);
		array.add(456);
		// ArrayList集合,自己有个方法
		// <T> T[] toArray(T[] a) 
		Integer[] i = new Integer[array.size()];
		Integer [] j = array.toArray(i);
		for(Integer k : j){
			System.out.println(k);
		}

	}
}

 

4.3.2 带有泛型的接口

Iterator<E> 
Iterator<Integer> ,E 接受到类型,就是Integer类型

泛型的好处

将运行时期的ClassCastException,转移到了编译时期,变成了编译失败。

避免了类型强转的麻烦。

package day18.demo1;

/*
 *  带有泛型的接口
 *  
 *  public interface List <E>{
 *    abstract boolean add(E e);
 *  }
 *  实现类,先实现接口,不理会泛型
 *  public class ArrayList<E> implements List<E>{
 *  }
 *  调用者 : new ArrayList<String>() 后期创建集合对象的时候,指定数据类型
 *  
 *  实现类,实现接口的同时,也指定了数据类型
 *  public class XXX implements List<String>{
 *  }
 *  new XXX()
 */
public class GenericDemo2 {

}

 

4.4 泛型的通配符

泛型的通配含义:匹配所有的数据类型。

通配符为问号 “?”

//Collection<?> coll

package day18.demo1;

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

/*
 *  泛型的通配符
 */
public class GenericDemo3 {
	public static void main(String[] args) {
		ArrayList<String> array = new ArrayList<String>();
		
		HashSet<Integer> set = new HashSet<Integer>();
		
		array.add("123");
		array.add("456");
		
		set.add(789);
		set.add(890);
		
		iterator(array);
		iterator(set);
	}
	/*
	 *  定义方法,可以同时迭代2个集合
	 *  参数: 怎么实现 , 不能写ArrayList,也不能写HashSet
	 *  参数: 或者共同实现的接口
	 *  泛型的通配,匹配所有的数据类型  ?
	 */
	public static void iterator(Collection<?> coll){
		Iterator<?> it = coll.iterator();
		while(it.hasNext()){
			//it.next()获取的对象,什么类型
			System.out.println(it.next());
		}
	}
}

 

 4.5 泛型的限定

  • 格式: ArrayList<? extends Employee> array
  • ?代表子类,<? extends Employee>代表继承Employee的任意子类。
  • ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
  • ? super   Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
/*
	 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 work
	 * ? 通配符,迭代器it.next()方法取出来的是Object类型,怎么调用work方法
	 * 强制转换:  it.next()=Object o ==> Employee 但有安全隐患 String没办法转
	 * 方法参数: 控制,可以传递Employee对象,也可以传递Employee的子类的对象
	 * 泛型的限定  本案例,父类固定Employee,但是子类可以无限?
	 *   ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
	 *   ? super   Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
	 */
public static void iterator(ArrayList<? extends Employee> array){
		
		 Iterator<? extends Employee> it = array.iterator();
		 while(it.hasNext()){
			 //获取出的next() 数据类型,是什么Employee
			 Employee e = it.next();
			 e.work();
		 }
	}

 泛型的限定举例:

package day18.demo2;

/*
 *  将的酒店员工,厨师,服务员,经理,分别存储到3个集合中
 *  定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法
 */
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
	public static void main(String[] args) {
		//创建3个集合对象
		ArrayList<ChuShi> cs = new ArrayList<ChuShi>();
		ArrayList<FuWuYuan> fwy = new ArrayList<FuWuYuan>();
		ArrayList<JingLi> jl = new ArrayList<JingLi>();
		
		//每个集合存储自己的元素
		cs.add(new ChuShi("张三", "后厨001"));
		cs.add(new ChuShi("李四", "后厨002"));
		
		fwy.add(new FuWuYuan("翠花", "服务部001"));
		fwy.add(new FuWuYuan("酸菜", "服务部002"));
		
		jl.add(new JingLi("小名", "董事会001", 123456789.32));
		jl.add(new JingLi("小强", "董事会002", 123456789.33));
		
//		ArrayList<String> arrayString = new ArrayList<String>();
		iterator(jl);
		iterator(fwy);
		iterator(cs);
	
	}
	/*
	 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 work
	 * ? 通配符,迭代器it.next()方法取出来的是Object类型,怎么调用work方法
	 * 强制转换:  it.next()=Object o ==> Employee 但有安全隐患 String没办法转
	 * 方法参数: 控制,可以传递Employee对象,也可以传递Employee的子类的对象
	 * 泛型的限定  本案例,父类固定Employee,但是子类可以无限?
	 *   ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
	 *   ? super   Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
	 */
	public static void iterator(ArrayList<? extends Employee> array){
		
		 Iterator<? extends Employee> it = array.iterator();
		 while(it.hasNext()){
			 //获取出的next() 数据类型,是什么Employee
			 Employee e = it.next();
			 e.work();
		 }
	}
}

其他类: 

package day18.demo2;
/*
 *  定义厨师类
 *    属于员工一种,具有额外服务功能
 *    继承Employee,实现VIP接口
 */
public class ChuShi extends Employee implements VIP{
	//空参数构造方法
	public ChuShi(){}
	
	//有参数构造方法
	public ChuShi(String name,String id){
		super(name,id);
	}
	
	//抽象方法重写
	public void work(){
		System.out.println("厨师在炒菜");
	}
	public void services(){
		System.out.println("厨师做菜加量");
	}
}
package day18.demo2;
/*
 *  定义经理类
 *    属于员工一种,没有VIP功能
 *    自己有奖金属性
 */
public class JingLi extends Employee {
	//空参数构造方法
	public JingLi(){}
	
	//满参数构造方法
	public JingLi(String name,String id,double money){
		super(name, id);
		this.money = money;
	}
	
	//定义奖金属性
	private double money;
	
	
	public double getMoney() {
		return money;
	}


	public void setMoney(double money) {
		this.money = money;
	}


	//重写抽象方法
	public void work(){
		System.out.println("管理,谁出错我罚谁");
	}
}
package day18.demo2;
/*
 *  酒店的VIP服务
 *    厨师和服务员
 */
public interface VIP {
	public abstract void services();
}
package day18.demo2;


public class Test {
	public static void main(String[] args) {
		//创建1个经理,2个服务员,2个厨师
		JingLi jl = new JingLi("小名", "董事会001", 123456789.32);
		jl.work();
		
		FuWuYuan f1 = new FuWuYuan("翠花", "服务部001");
		FuWuYuan f2 = new FuWuYuan("酸菜", "服务部002");
		
		f1.work();
		f1.services();
		
		f2.work();
		f2.services();
		
		ChuShi c1 = new ChuShi("老干妈", "后厨001");
		ChuShi c2 = new ChuShi("老干爹", "后厨002");
		
		c1.work();
		c1.services();
		
		c2.work();
		c2.services();
		
	
	}
}
package day18.demo2;
/*
 *  定义厨师类
 *    属于员工一种,具有额外服务功能
 *    继承Employee,实现VIP接口
 */
public class FuWuYuan extends Employee implements VIP{
	//空参数构造方法
	public FuWuYuan() {
		super();
		
	}
   //满参数构造方法
	public FuWuYuan(String name, String id) {
		super(name, id);
		
	}
	
	//抽象方法重写
	public void work(){
		System.out.println("服务员在上菜");
	}
	


	public void services(){
		System.out.println("服务员给顾客倒酒");
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值