[英]Two constructors at in the same class with different parameters
在第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),为什么会发生这种情况? 以及如何解决? 谢谢。
任何新手程序员都应记住的一个好的经验法则是,从一开始就拥有类将带来好处:
您的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
}
}
我很抱歉,如果这不是您想要的,您的问题有点难以理解。 祝您好运,如果您有后续行动,请在下方评论(或编辑答案)。
听起来您正在创建两个单独的实例,并尝试通过给它们指定相同的名称来合并它们。 这不是Java的工作方式。
第1类使用给定的参数制作一个adapterdb(称为db)。
类2使用给定的参数制作另一个adapterdb。
如果DB是两个类都可以访问的某种全局变量,则引用DB指向NEW对象,而第一个对象是垃圾。 对构造函数的第二次调用不会将两者合并在一起。
构造函数似乎属于两个不同的类:通常,构造函数会将所有实例变量设置为至少某个默认值。
如果您确实想“合并”这两个,我将使用默认构造函数并将您拥有的两个构造转换为大型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提出的解决方案是否不是更合适的选择。
您可以使用this
关键字调用另一个构造函数。
class Animal {
int weight;
String name;
Animal(int w) {
weight = w;
}
Animal(String n) {
this(10); // set the weight to 10
name = n;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.