如何用变量初始化一个 Java 对象?
How to initiate a Java object with a variable?
我正在尝试启动一个存储分子 p
、分母 q
及其比率 r
的对象 "rational number"。此代码产生不正确的答案。
class Rational {
int p, q;
double ratio;
public Rational(){
this.p = 0;
this.q = 1;
this.ratio = this.p/(double)(this.q);
}
public static void main (String[]arg) {
Rational r1 = new Rational();
r1.p = 1;
r1.q = 7;
// r1.ratio = r1.p/(double)(r1.q); //"this line"
System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ;
}
}
取消注释 "this line" 问题解决。如何定义对象以便在每次 this.p
或 this.q
更改时自动更新 this.r
?
例如,您应该添加更新它们的方法
public void Update(int p, int q)
{
this.p = p;
this.q = q;
this.ratio = p/q;
}
您现在必须在更改 p 和 q 值的地方调用它并删除这两行。
这应该可以解决它:)
通过将此构造函数添加到您的 Rational class:
public Rational(int p, int q){
this.p = p;
this.q = q;
this.ratio = this.p/(double)(this.q);
}
class Rational {
int p;
int q;
double ratio;
public Rational(){
this.p = 0;
this.q = 1;
this.ratio = this.p/(double)(this.q);
}
public void setP(int p) {
this.p = p;
this.ratio = this.p/(double)(this.q);
}
public void setQ(int q) {
this.q = q;
this.ratio = this.p/(double)(this.q);
}
public static void main (String[]arg) {
Rational r1 = new Rational();
r1.setP(1);
r1.setQ(7);
System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ;
}
}
在我看来,更简单的方法是定义一个名为 ratio 的函数,而不是变量。
class Rational {
private int p, q;
public Rational(){
this.p = 0;
this.q = 1;
}
public double ratio(){
return (double)p/(double)q;
}
//define the getters and setters for p and q
}
然后,无论何时您需要比率,您都应该调用该方法:
myRational.ratio()
您在设置 p 和 q 后没有更新比率变量,因此比率保持为 0。您应该使用封装。
应该是这样的:
class Rational {
private int p, q;
private double ratio;
public Rational(){
this.p = 0;
this.q = 1;
updateRatio();
}
private updateRatio() {
ratio = p / (double)q;
}
public setQ(int q){
this.q =q;
updateRatio();
}
public getQ(){
return q;
}
//make getters and setters for variable p too
public getRatio(){
return ratio;
}
public static void main (String[]arg) {
Rational r1 = new Rational();
r1.setQ(1);
r1.setP(7);
System.out.println (r1.getQ() + "/" + r1.getP() + " = " + r1.getRatio()) ;
}
}
在大多数情况下,最好的办法是使 class Rational 不可变,这样您就不必处理不一致的状态,也不需要在状态更改时添加逻辑来更新派生字段。也就是说,您想要另一个 Rational?只是构建它。时期。它看起来像这样:
class Rational {
final int p;
final int q;
final double ratio;
public Rational(int p, int q){
this.p = p;
this.q = q;
this.ratio = this.p/(double)(this.q);
}
public static void main (String[]arg) {
Rational r1 = new Rational(1, 7);
System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ;
}
}
奖金,您可以将字段设为私有并使用 getter 公开它们,以获得更封装的设计。
我正在尝试启动一个存储分子 p
、分母 q
及其比率 r
的对象 "rational number"。此代码产生不正确的答案。
class Rational {
int p, q;
double ratio;
public Rational(){
this.p = 0;
this.q = 1;
this.ratio = this.p/(double)(this.q);
}
public static void main (String[]arg) {
Rational r1 = new Rational();
r1.p = 1;
r1.q = 7;
// r1.ratio = r1.p/(double)(r1.q); //"this line"
System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ;
}
}
取消注释 "this line" 问题解决。如何定义对象以便在每次 this.p
或 this.q
更改时自动更新 this.r
?
例如,您应该添加更新它们的方法
public void Update(int p, int q)
{
this.p = p;
this.q = q;
this.ratio = p/q;
}
您现在必须在更改 p 和 q 值的地方调用它并删除这两行。 这应该可以解决它:)
通过将此构造函数添加到您的 Rational class:
public Rational(int p, int q){
this.p = p;
this.q = q;
this.ratio = this.p/(double)(this.q);
}
class Rational {
int p;
int q;
double ratio;
public Rational(){
this.p = 0;
this.q = 1;
this.ratio = this.p/(double)(this.q);
}
public void setP(int p) {
this.p = p;
this.ratio = this.p/(double)(this.q);
}
public void setQ(int q) {
this.q = q;
this.ratio = this.p/(double)(this.q);
}
public static void main (String[]arg) {
Rational r1 = new Rational();
r1.setP(1);
r1.setQ(7);
System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ;
}
}
在我看来,更简单的方法是定义一个名为 ratio 的函数,而不是变量。
class Rational {
private int p, q;
public Rational(){
this.p = 0;
this.q = 1;
}
public double ratio(){
return (double)p/(double)q;
}
//define the getters and setters for p and q
}
然后,无论何时您需要比率,您都应该调用该方法: myRational.ratio()
您在设置 p 和 q 后没有更新比率变量,因此比率保持为 0。您应该使用封装。
应该是这样的:
class Rational {
private int p, q;
private double ratio;
public Rational(){
this.p = 0;
this.q = 1;
updateRatio();
}
private updateRatio() {
ratio = p / (double)q;
}
public setQ(int q){
this.q =q;
updateRatio();
}
public getQ(){
return q;
}
//make getters and setters for variable p too
public getRatio(){
return ratio;
}
public static void main (String[]arg) {
Rational r1 = new Rational();
r1.setQ(1);
r1.setP(7);
System.out.println (r1.getQ() + "/" + r1.getP() + " = " + r1.getRatio()) ;
}
}
在大多数情况下,最好的办法是使 class Rational 不可变,这样您就不必处理不一致的状态,也不需要在状态更改时添加逻辑来更新派生字段。也就是说,您想要另一个 Rational?只是构建它。时期。它看起来像这样:
class Rational {
final int p;
final int q;
final double ratio;
public Rational(int p, int q){
this.p = p;
this.q = q;
this.ratio = this.p/(double)(this.q);
}
public static void main (String[]arg) {
Rational r1 = new Rational(1, 7);
System.out.println (r1.p + "/" + r1.q + " = " + r1.ratio) ;
}
}
奖金,您可以将字段设为私有并使用 getter 公开它们,以获得更封装的设计。