黑马程序员技术交流社区

标题: 内部类问题 [打印本页]

作者: zhanghuxin    时间: 2013-11-11 08:56
标题: 内部类问题
请帮我看看,老是报错:
package cn.zhanghuxin.java;
import java.util.*;
interface IntArrayProductor
{
//接口里定义的product方法用于封装“处理行为”
int product();
}
public class CommandTest
{
//定义一个方法,该生成指定长度的数组,但每个数组元素由于cmd负责产生
public int[] process(IntArrayProductor cmd  , int length)
{
  int[] result = new int[length];
  for (int i = 0; i < length ; i++ )
  {
   result = cmd.product();
  }
  return result;
}
public static void main(String[] args)
{
  CommandTest ct = new CommandTest();
  int seed = 5;
  //生成数组,具体生成方式取决于IntArrayProductor接口的匿名实现类
  int[] result = ct.process(new IntArrayProductor()
  {
   public int product()
   {
    return (int)Math.round(Math.random() * seed);
   }
  } , 6);
  System.out.println(Arrays.toString(result));
}
}


作者: Rockray    时间: 2013-11-11 10:11
本帖最后由 Rockray 于 2013-11-11 10:16 编辑

错误一:process()方法的for()循环中,赋值给数组中元素。
错误二:seed要被final修饰,内部类中访问的变量必须被final修饰。
  1. //package cn.zhanghuxin.java;
  2. import java.util.*;
  3. interface IntArrayProductor
  4. {
  5.         //接口里定义的product方法用于封装“处理行为”
  6.         int product();
  7. }
  8. public class CommandTest
  9. {
  10. //定义一个方法,该生成指定长度的数组,但每个数组元素由于cmd负责产生
  11.         public int[] process(IntArrayProductor cmd  , int length)
  12.         {
  13.                 int[] result = new int[length];
  14.                 for (int i = 0; i < length ; i++ )
  15.                         {
  16.                                 result[i] = cmd.product();  //错误一,赋值给数组元素
  17.                         }
  18.                 return result;
  19.         }
  20.         public static void main(String[] args)
  21.         {
  22.                 CommandTest ct = new CommandTest();
  23.                 final int seed = 5;  //错误二,final
  24.         //生成数组,具体生成方式取决于IntArrayProductor接口的匿名实现类
  25.                 int[] result = ct.process(new IntArrayProductor()
  26.                 {
  27.                         public int product()
  28.                         {
  29.                                 return (int)Math.round(Math.random() * seed);
  30.                         }
  31.                 } , 6);
  32.                 System.out.println(Arrays.toString(result));
  33.         }
  34. }
复制代码
输出结果:





作者: pireteMrZ    时间: 2013-11-11 10:17
//package cn.zhanghuxin.java;
import java.util.*;
interface IntArrayProductor
{

int product();
}
public class CommandTest
{

public int[] process(IntArrayProductor cmd  , int length)
{
  int[] result = new int[length];
  for (int i = 0; i < length ; i++ )
  {
   result = cmd.product();//首先product()是返回int类型,而result是数组,不能赋值
  }
  return result;
}
public static void main(String[] args)
{
  CommandTest ct = new CommandTest();
  final int seed = 5;/*改成final类型,因为当你使用内部匿名类的时候,如果希望内部匿名类可以调用到这个参数,
  就必须设置其为Final,最常见的就是用于函数的回调。*/


  
  int[] result = ct.process(new IntArrayProductor()
  {
   public int product()
   {
    return (int)Math.round(Math.random() * seed);
   }
  } , 6);
  System.out.println(Arrays.toString(result));
}
}

作者: zhanghuxin    时间: 2013-11-11 10:18
谢了,翻了一下书,内部类中的局部变量必须用Final修饰符




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2