java构造函数有参无参_Java Bean 为什么必须要有一个无参构造函数

JAVAEE中,javaBean是一个很重要的概念

而JavaBean还有以下的使用习惯

1f52ce73c96a686886162e9b7d6a2f63.png

首先我们知道,有两种方法为java对象中的元素赋值,

1. 通过类的带参数构造函数的方法

2. 通过类的set方法

在javaBean里,一般参数在4个以上的,极不推荐使用带参数构造函数赋值:

1. 对于一个实体类,对于多个参数,降低可读性

2. 需要记住构造参数的顺序

3. 一个参数无效就会造成整个构造函数失效

4. 当我们要添加新的属性时,不仅要传参数,还要修改构造函数,同时之前所有的构造都要修改。

5. 必须在对象创建之前给参数赋值,而不可以在对象创建后赋值

使用set方法的优势:

1. 我们可以显式的看到赋值元素的名称

2. 可以以任何顺序赋值

3. 可以忽略一些元素的初始化

4. 添加新属性时,不需要修改类

5. 可以在对象创建后赋值

所以对于javaBean,最好的方法就是只定义一个无参数构造函数,

然后用set方法来赋值

最后复习一下类的构造器概念:

//constructor with parameters

public Bicycle(int startCadence, int startSpeed, int startGear) {

gear = startGear;

cadence = startCadence;

speed = startSpeed;

}

Bicycle myBike = new Bicycle(30, 0, 8);

//constructor without parameters

public Bicycle() {

gear = 1;

cadence = 10;

speed = 0;

}

Bicycle yourBike = new Bicycle();

一个类可以重载多个构造函数,只要他们的参数不同

当没有申明构造函数时,java将自动创建构造函数

若已申明带参数构造函数,必须申明无参数构造函数

否则当你调用无参数构造函数时,将会编译错误

对于一个普通的没有父类的类:

TO a class that has not a explicit super class

then it has an implicit superclass of Object,

which does have a no-argument constructor.

### 回答1: 下面是一个简单的score类的实现,包含了成员变量name和score,以及静态成员变量totals和静态成员函数re_totals()。 ```c++ #include <iostream> #include <string> class score { public: score(std::string n, int s) { name = n; score_value = s; totals += s; } std::string name; int score_value; static int totals; static int re_totals() { return totals; } }; int score::totals = 0; int main() { score student1("张三", 90); score student2("李四", 80); score student3("王五", 70); std::cout << "学生 " << student1.name << " 的成绩是 " << student1.score_value << std::endl; std::cout << "学生 " << student2.name << " 的成绩是 " << student2.score_value << std::endl; std::cout << "学生 " << student3.name << " 的成绩是 " << student3.score_value << std::endl; std::cout << "班级总分是 " << score::re_totals() << std::endl; return 0; } ``` 在上面的例子中,我们首先创建了三个学生对象,每个对象都有一个name和score_value属性。在每个学生对象的构造函数中,我们向静态成员totals中添加了该学生的分数。最后,我们通过在score类中定义的静态成员函数re_totals()来获取totals的值。 ### 回答2: 下面是用C语言编写的Score类的程序: ```c #include <stdio.h> // 定义Score类 typedef struct { char name[20]; // 学生姓名 int score; // 成绩 static int totals; // 总分 } Score; // 初始化总分为0 int Score::totals = 0; // 有参构造方法 Score initScore(char name[], int score) { Score s; strcpy(s.name, name); s.score = score; Score::totals += score; return s; } // 返回总分 int re_totals() { return Score::totals; } int main() { // 创建Score对象并初始化 Score score1 = initScore("张三", 80); Score score2 = initScore("李四", 90); Score score3 = initScore("王五", 85); // 输出总分 printf("班级总分:%d\n", re_totals()); return 0; } ``` 在这个程序中,我们使用了一个结构体来模拟Score类。成员变量name用于存储学生的姓名,score用于存储学生的成绩,totals用来存储班级的总分。成员变量totals被定义为静态变量,这样它就可以被所有Score对象共享。 在有参构造方法initScore中,我们通过strcpy函数将学生的姓名复制到成员变量name中,将学生的成绩赋值给成员变量score,并且将成绩添加到totals中。 静态成员函数re_totals用于返回班级的总分。 在main函数中,我们创建了三个Score对象,并初始化它们的姓名和成绩。然后,我们调用re_totals函数输出班级的总分。 这个程序可以用于统计一个班级学生的成绩,并计算出班级的总分。 ### 回答3: 首先,在C语言中,没有类的概念,但可以通过结构体来实现类似的功能。下面是一个基于结构体的score类的示例代码: #include <stdio.h> #include <string.h> // 定义score结构体 struct Score { char name[50]; // 学生姓名 float score; // 学生成绩 // 静态成员变量,存储总分 static float totals; }; // 静态成员变量初始化 float Score::totals = 0; // 有参构造方法,用于初始化学生姓名和成绩 Score createScore(const char* name, float score) { Score s; strcpy(s.name, name); s.score = score; // 更新总分 Score::totals += score; return s; } // 静态成员函数,返回总分 float re_totals() { return Score::totals; } int main() { Score s1 = createScore("Amy", 90); Score s2 = createScore("John", 85); printf("Total score: %.2f\n", re_totals()); return 0; } 在这个例子中,通过定义一个名为Score的结构体,实现了一个类似于score类的功能。结构体的成员包括学生姓名和成绩,以及一个静态成员变量totals用于存储总分。 createScore函数用于创建一个score对象,并传入学生姓名和成绩。在该函数中,通过strcpy函数将学生姓名复制到对象的name变量中,然后更新totals的值。 re_totals函数是一个静态成员函数,用于返回存储的总分。 在main函数中,创建了两个score对象,然后通过调用re_totals函数输出总分。 注意:虽然C语言没有类的概念,但可以利用结构体和函数组合的方式实现类似的功能。但这种实现方式在功能和使用上和真正的类是有一些差异的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值