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、但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
局部内部类:
一般用的很少。