8-1内部类的复习

来源:互联网 发布:淘宝男童运动套装 编辑:程序博客网 时间:2024/06/14 09:17

8/1 内部类复习

集合练习

1、已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数
2008 北京奥运会男足参赛国家:
科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚、日本,美国,中国,新西 兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利

import java.util.LinkedList;import java.util.List;import java.util.Random;public class Randomm {    public static void main(String[] args) {        List<String> list = new LinkedList<String>();        list.add("科特迪瓦");        list.add("阿根廷");        list.add("澳大利亚");        list.add("塞尔维亚");        list.add("荷兰");        list.add("尼日利亚");        list.add("日本");        list.add("美国");        list.add("中国");        list.add("新西兰");        list.add("巴西");        list.add("比利时");        list.add("韩国");        list.add("喀麦隆");        list.add("洪都拉斯");        list.add("意大利");                for(int i = 0; i<4;i++){//循环输出四个组的成员            System.out.println("第"+(i+1)+"组的成员国有:");            for(int j = 0;j<4;j++){                //随机生成数                int a = new Random().nextInt(list.size());               //将随机生成的数当作list索引,查询索引对应的值并输出                System.out.print(list.get(a)+"  ");                //从list列表中删除索引为随机数的值                list.remove(a);            }            System.out.println();        }    }}

运行结果:
这里写图片描述

这个题目的关键是:将16个国家的球队随机分到四个组中,则每个组有四个成员国的足球队,程序中用到了双重循环,内层循环用于随机生成数,遍历list表并输出随机数对应的list表中的值,输出后将其删除。外层循环用于输出每个组的球队。

2、有如下Student 对象,
private String name;
private int age;
private int score;
private String classNum;
其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList();
list.add(new Student(“Tom”, 18, 100, “class05”));
list.add(new Student(“Jerry”, 22, 70, “class04”));
list.add(new Student(“Owen”, 25, 90, “class05”));
list.add(new Student(“Jim”, 30,80 , “class05”));
list.add(new Student(“Steve”, 28, 66, “class06”));
list.add(new Student(“Kevin”, 24, 100, “class04”));
在这个list 的基础上,完成下列要求:
1) 计算所有学生的平均年龄
2) 计算各个班级的平均分
Student类:

public class Student {    private String name;    private int age;    private double score;    private String classNum;    public Student(String name,int age,double score,String classNum){        this.name = name;        this.age = age;        this.score = score;        this.classNum = classNum;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    public double getScore() {        return score;    }    public String getClassNum() {        return classNum;    }}
import java.util.ArrayList;import java.util.List;public class StudentList {    public static void main(String[] args) {        List<Student> list = new ArrayList<Student>();        list.add(new Student("Tom",18,100,"class05"));        list.add(new Student("Jerry",20,70,"class04"));        list.add(new Student("Tim",25,90,"class05"));        list.add(new Student("jim",30,80,"class05"));        list.add(new Student("Steven",28,66,"class06"));        list.add(new Student("Kenve",22,100,"class04"));        double sum = 0;        int i = 0;        for(i = 0;i<list.size();i++){            sum += list.get(i).getAge();         }        System.out.println("学生的平均年龄为:"+sum/list.size());        double totalScore4 = 0, totalScore5 = 0, totalScore6 = 0;        int a = 0, b = 0, c = 0;        for(int j=0;j<list.size();j++){            if(list.get(j).getClassNum().equals("class04")){                totalScore4 +=list.get(j).getScore();                 a = a+1;            }else  if(list.get(j).getClassNum().equals("class05")){                totalScore5 +=list.get(j).getScore();                 b = b+1;            }else if(list.get(j).getClassNum().equals("class06")){                totalScore6 +=list.get(j).getScore();                 c = c+1;            }        }        System.out.println("class04班级的总分为:"+totalScore4+",平均分为:"+totalScore4/a);        System.out.println("class05班级的总分为:"+totalScore5+",平均分为:"+totalScore5/b);        System.out.println("class06班级的总分为:"+totalScore6+",平均分为:"+totalScore6/c);    }}

运行结果:
这里写图片描述

3、
这里写图片描述
第一次自己做的时候,用到了两个列表Map和List,一个Map对象来存放一届世界杯的信息,然后List列表中用于存放多届世界杯。代码繁琐,后来看了老师的代码,进行修改。
修改后:

import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class ListTest01 {    public static void main(String[] args) {        //Map实例化    Map<String, String> m =  new HashMap<>();    //添加数据    m.put("1930","乌拉圭");    m.put("1934", "意大利");    m.put("1938","意大利");    m.put("1950","乌拉圭");    m.put("1954","西德");    m.put("1958","巴西");    m.put("1962","巴西");    m.put("1966","英格兰");    m.put("1970","巴西");    m.put("1974","西得");    m.put("1978","阿根廷");    m.put("1982","意大利");    m.put("1986","阿根廷");    m.put("1990","西得");    m.put("1994","巴西");    m.put("1998","法国");    m.put("2002","巴西");    m.put("2006","意大利");    m.put("2010","西班牙");    m.put("2014","德国");    System.out.println("请输入年份值:");    Scanner  sc = new Scanner(System.in);    String str = sc.nextLine();    //判断key值是否等于输入的值    if(m.containsKey(str)==true)    {        System.out.println(m.get(str));    }    else    {        System.out.println("今年没有举办世界杯");    }    System.out.println("请输入世界杯夺冠的国家:");    String str2 = sc.nextLine();    if(m.containsValue(str2)==true)    {        System.out.println("该对获取冠军的年份值是:");        for(String temp: m.keySet())        {            if(m.get(temp).equals(str2))            {                System.out.println(" "+temp);            }        }    }    else    {        System.out.println( str2+"没有获得冠军!");    }    }}

运行结果如下:
这里写图片描述



内部类复习

作用:

内部类的作用:
1.内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
2.内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。

分类:

成员内部类:

可以使用private、protected、public 任意进行修饰。

类文件:外部类$内部类.class

非静态内部类:

1、非静态内部类必须单独属于某个外部类对象。即只有在外部类对象存在的情况下,才存在内部类对象。

2、非静态内部类可以无条件访问外部类的成员;而外部类不能直接访问非静态内部类成员。

3、非静态内部类不能有静态方法、静态属性、静态初始化快。

4、成员变量访问要点:
①内部类里的方法的局部变量:变量名
②内部类属性:this.变量名
③外部类属性:外部类名.this变量名

静态内部类与非静态内部类实例化的区别:
静态内部类可以通过外部类类名直接调用;
非静态内部类必须通过外部类对象来调用。

这里写图片描述

静态内部类:

1、一个静态内部类对象存在,并不一定存在对应的外部类对象。
2、外部类的方法中可以通过:静态内部类.名字 访问静态内部类的静态成员。

静态内部类只能访问外部类的静态成员,而不能访问外部类的非静态成员。
这里写图片描述

匿名内部类:

适合那种只需要使用一次的类。
知道如何使用即可。

使用匿名类的一些原则:

1、匿名内部类不能有构造方法。
2、匿名内部类不能定义任何静态成员、静态方法。
3、匿名内部类不能是public,protected,private,static。
4、只能创建匿名内部类的一个实例。
5、一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
6、因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
7、但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

局部内部类:

一般用的很少。

原创粉丝点击