两个构造函数在同一个类中具有不同的参数

时间:2011-11-18 00:53:09

标签: java android constructor

在第1课我制作一个实例:

  db = new AdapterDB (cal, rcarbohydrate, rfat, rprotein, getApplicationContext());

在第2课我做了一个实验:

db = new AdapterDB (Bits, Truncation, Crossover, Mutation, Chromosomes, Generation, getApplicationContext());

在AdapterDB类中,我创建了构造函数:

private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public AdapterDB(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper (context);
    }

    double Truncation;
    double Crossover;
    double Mutation;
    int Generation;

    private Context context;

    int indexOfChromosomes ;
    int indexOfGens;
    int gensNumber;
    int chromosomesNumber;

    String [][] population;
    double [] fitnesstotal;

    public AdapterDB(int Bits, double Truncation, double Crossover, double Mutation, int Chromosomes, int Generation, Context ctx)
    {
        this.indexOfGens = Bits;
        this.Truncation = Truncation;
        this.Crossover = Crossover;
        this.Mutation = Mutation;
        this.indexOfChromosomes = Chromosomes;
        this.Generation = Generation;
        this.context = ctx;
        DBHelper = new DatabaseHelper (context);

        population = new String[indexOfChromosomes][indexOfGens];
        fitnesstotal = new double [indexOfChromosomes];
    }

double cal;
    double rcarbohydrate;
    double rfat;
    double rprotein;

    public AdapterDB(double cal, double rcarbohydrate, double rfat, double rprotein, Context ctx)
    {
        this.cal = cal;
        this.rcarbohydrate = rcarbohydrate;
        this.rfat = rfat;
        this.rprotein = rprotein;
        this.context = ctx;
        DBHelper = new DatabaseHelper (context);
    }

在构造函数中值仍然存在,每个变量都有一个值,但是当我想在类AdapterDB中使用它时,cal,rcarbohydrate,rfat和rprotein为零(0.0)为什么会发生这种情况?以及如何解决?谢谢。

3 个答案:

答案 0 :(得分:3)

任何初学程序员要记住的一个好的经验法则是首先拥有所带来的好处:

What Is A Class? (From the Java Tutorials)

您的AdapterDB类显然试图同时成为两个不同的东西。我猜你的调用使用第一个构造函数创建一个实例,但是期望填充其他值(由第二个构造函数设置)。

你应该做的是让AdapterDB成为一个抽象类:

public abstract class AdapterDB {

    private Context context;
    private DBHelper dbHelper;

    public AdapterDB(Context context) {
        this.context = context;
        this.dbHelper = new DBHelper(context);
    }

    public Context getContext() {
        return context;
    }

    public DBHelper getDBHelper() {
        return dbHelper;
    }
}

然后,您可以为需要表示的各种数据类型创建单独的类:

public class GeneticAdapter extends AdapterDB {

    int chromosomesNumber;
    // ... And others

    public GeneticAdapter(Context context, int numChromosomes, ...) {
        super(context);
        // Set your instance variables
    }
}

一个适合健身的人?

public class FitnessAdapter extends AdapterDB {
    double cal;
    // ... And others

    public FitnessAdapter(Context context, double cal, ...) {
        super(context);
        // Set your instance variables
    }
}

如果这不是你想要的,我很抱歉,你的问题有点难以理解。祝您好运,如果您有后续行动,请在下方发表评论(或编辑您的答案)。

答案 1 :(得分:1)

听起来你正在创建两个单独的实例,并试图通过给它们相同的名称来合并它们。这不是Java的工作方式。

Class 1使用给定的参数生成一个adapterdb(称为db)。

Class 2生成另一个带有给定参数的adapterdb。

如果DB是两个类都可以访问的某种全局变量,则引用DB指向NEW对象,第一个对象是garbage。对构造函数的第二次调用不会将两者合并在一起。

构造函数看起来像属于两个不同的类:通常,构造函数会将所有实例变量设置为至少某个默认值。

如果你想“合并”两者,我会使用默认构造函数并将你拥有的两个构造转换为大型setter方法,如下所示:

public AdapterDB(Context context) {
    this.context = context;
    this.dbHelper = new DBHelper(context);
}

public setFitness(double cal, double rcarbohydrate, double rfat, double rprotein, Context ctx) {
    ...
}

public setGenetics(int Bits, double Truncation, double Crossover, double Mutation, int Chromosomes, int Generation, Context ctx) {
    ....
}

但是,因为参数是如此不同,我会对你的结构化问题保持警惕,我会看看craig提出的解决方案是不是更合适的选择。

答案 2 :(得分:0)

您可以使用this关键字调用其他构造函数。

class Animal {
    int weight;
    String name;

    Animal(int w) {
        weight = w;
    }

    Animal(String n) {
        this(10);  // set the weight to 10
        name = n;
    }
}