【问题标题】:why is this java initialization giving error? [duplicate]为什么这个java初始化给出错误? [复制]
【发布时间】:2012-10-24 12:05:54
【问题描述】:

我正在尝试在循环中初始化数组 C,但它给出了错误:
C 是类 ipdata 的数组,我已经声明了它并尝试在循环内对其进行初始化。

import java.io.*;
import java.util.*;
public class cluster_anlysis {
    class ipdata{


        float a,b;
        int cluster;

        ipdata()
        {
            a=0;
        }
    }
    public float modc(float a){
            if(a<0.0)
                a=-a;
            return a;
    }
    public static void main(String[] args) {
        cluster_anlysis obj=new cluster_anlysis();
    ipdata C[] = new ipdata[50];
    float mean1,mean2,mean3;
    int i,j,n1=0,n2=0,n3=0,flag=0;
    float ina=0.0f;
    float inb=0.0f;

    //BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    Scanner scan =new Scanner(System.in);
    System.out.println("pls enter no of data: ");
    Integer no = scan.nextInt();
    System.out.println("\nnow enter the x and y values");
    for(i=0;i<no;i++)
    {
        ina=scan.nextFloat();
        inb=scan.nextFloat();
        System.out.println(ina);
        C[i]= new ipdata();          // this line is giving error

        C[i].a=ina;
        C[i].b=inb;
        C[i].cluster=0;
    }


    }

}

可能是什么问题? 它说 : 无法访问 cluster_anlysis 类型的封闭实例。必须使用 cluster_anlysis 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 cluster_anlysis 的实例)。

【问题讨论】:

    标签: java


    【解决方案1】:

    您使用外部类实例外部类的静态方法创建一个内部类实例

    c[i]= new cluster_anlysis().new ipdata();
    

    因为您已经在 main 方法的第一行中创建了 cluster_anlysis 实例。

    cluster_anlysis obj = new Cluster_anlysis();
    

    你可以做的很简单。

    c[i]= obj.new ipdata();
    

    阅读Inner classes in java

    但是如果你想从你的外部类的非静态方法创建一个内部类实例,你不需要你的外部类的实例。

     public class OuterClass {
           public void method(){
               InnerClass inner = new InnerClass();
           }
           class InnerClass{
             }
        }
    

    并遵循@A.R.S 和@JB Nizet 在他们的解决方案中发布的类名约定。

    【讨论】:

      【解决方案2】:

      我认为最好的做法是将ipdata 声明为static;这将消除错误。在这种情况下,不需要为了实例化ipdata 而实例化cluster_analysis,而且ipdata 实际上应该是static 是有道理的。


      哦,按照惯例,您可能需要考虑改用名称 IpDataClusterAnalysis - 类名称通常以大写字母开头并且是“CamelCased”,正如另一个答案也指出的那样。

      【讨论】:

        【解决方案3】:

        使用外部类Instance调用内部类构造函数

        喜欢

        c[i]=new cluster_analysis().new ipdata();
        

        【讨论】:

          【解决方案4】:

          看来您是从 Java 开始的。我建议暂时避免弄乱内部类。在自己的文件中定义每个Java类,一切都会变得更简单。

          还可以了解 Java 命名约定:

          • 类以大写字母开头,并且是驼峰式:ClusterAnalysisIpData。它们不应包含下划线。
          • 变量以小写字母开头,驼峰式:c。它们不应包含下划线。

          一旦您对基础知识更加熟悉,请在the Java tutorial 中了解内部类和静态内部类。但是内部类不应该被滥用。基本规则是每个文件有一个类。

          【讨论】:

          • +1 - OP 也需要获得正确的缩进和嵌入空白。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-23
          • 1970-01-01
          • 1970-01-01
          • 2018-05-13
          相关资源
          最近更新 更多