#java #getter-setter
#java #средство получения-установки
Вопрос:
Я пытаюсь создать объекты box, используя полиморфизм и наследование, мои средства получения и настройки ширины работают отлично, но для длины я записал тот же формат, что и средства получения и настройки ширины, если набор width или length не попадает между MIN, который равен 3, и MAX, который равен 20, установите переменную в то, к чему она ближе всего, (например, если length равен 24, тогда установите значение 20, если length равен 2, установите значение 3) В любом случае, это работает отлично подходит для ширины, но не для длины? и я так запутался, что понятия не имею, почему. вот мой код.
Box.java
package l08;
public class Box {
/** Minimum size for either side of the box */
public static final int MIN = 3;
/** Maximum size for either side of the box */
public static final int MAX = 20;
/** The width of the box */
private int width;
/** The length of the box */
private int length;
/** * A symbol to be used to draw a box */
private char symbol;
/** Boolean to indicate whether the box is filled or not */
private boolean filled;
/**
* Constructor
*
* @param startWidth
* @param startLength
* @param startSymbol
* @param startFilled
*/
public Box(int startWidth, int startLength, char startSymbol,
boolean startFilled) {
if (length < MIN) {
length = MIN;
}
if (length > MAX) {
length = MAX;
}
this.width = startWidth;
this.length = startLength;
this.symbol = startSymbol;
this.filled = startFilled;
if (width < MIN) {
width = MIN;
}
if (width > MAX) {
width = MAX;
}
}// end constructor
/**
* Draw this box.
*/
public void drawBox() {
for(int star = 3; star < getLength(); star )
System.out.print(getSymbol());
System.out.print("n" getSymbol());
for(int space = 0; space < getLength()-2; space ) System.out.print("
");
System.out.print(getSymbol() "n");
for(int star = 0; star < getLength(); star )
System.out.print(getSymbol());
System.out.println();
}
/**
* Get the value of filled
*
* @return the value of filled
*/
public boolean isFilled() {
return filled;
}
/**
* Set the value of filled
*
* @param newFilled new value of filled
*/
public void setFilled(boolean newFilled) {
this.filled = newFilled;
}
/**
* Get the value of symbol
*
* @return the value of symbol
*/
public char getSymbol() {
// Activity 3, implement the getters
return symbol;
}
/**
* Set the value of symbol
*
* @param newSymbol new value of symbol
*/
public void setSymbol(char newSymbol) {
this.symbol = newSymbol;
}
/**
* Get the value of length
*
* @return the value of length
*/
public int getLength() {
return length;
}
/**
* Set the value of length
*
* @param newLength new value of length
*/
public void setLength(int newLength) {
if (length >= MIN || length <= MAX) {
length = newLength;
}
}
/**
* Get the value of width
*
* @return the value of width
*/
public int getWidth() {
// Activity 3, implement the getters
return width;
}
/**
* Set the value of width
*
* @param newWidth new value of width
*/
public void setWidth(int newWidth) {
if (width >= MIN || width <= MAX) {
newWidth = width;
}
}
}// end class
BoxDriver.java
package l08;
import java.util.Scanner;
public class BoxDriver {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
//Testing constructors, if everything is good, then nothing will be
//printed!
System.out.println("nn=========================");
System.out.println("Testing the constructor");
System.out.println("=========================");
Box b1 = new Box(30,15,'*',true);
Box b2 = new Box(-2,-2,'#',false);
Box b3 = new Box(2,5,'*',false);
System.out.println("n(If nothing is printed, "
"there were no run-time errors!)");
System.out.print("nPress ENTER to continue...");
kb.nextLine();
//Testing the getters of the Box class
System.out.println("nn=========================");
System.out.println("Testing the getters");
System.out.println("=========================");
System.out.println("Box 1: width=" b1.getWidth()
" and length=" b1.getLength()
"tt(should be 20 and 15)");
System.out.println("Box 2: symbol=" b2.getSymbol()
" and filled=" b2.isFilled() "t(should be # and false)");
System.out.println("Box 3: width=" b3.getWidth()
" and length=" b3.getLength() "tt(should be 3 and 5)");
System.out.print("nPress ENTER to continue...");
kb.nextLine();
//Testing the setters of the Box class
System.out.println("nn=========================");
System.out.println("Testing the setters");
System.out.println("=========================");
b1.setFilled(false);//changing it to non-filled box
b1.setWidth(500);
b1.setLength(14);
b1.setSymbol('A');
System.out.println("Box 1: width=" b1.getWidth()
" and length=" b1.getLength() " "
"symbol=" b1.getSymbol()
" filled=" b1.isFilled()
"n(should now be changed to 20, 14, A, and false)");
b2.setFilled(true);//changing it to non-filled box
b2.setWidth(2);
b2.setLength(2);
System.out.println("nBox 2: width=" b2.getWidth()
" and length=" b2.getLength() " "
"symbol=" b2.getSymbol()
" filled=" b2.isFilled()
"n(should now be changed to 3, 3, #, and true)");
System.out.print("nPress ENTER to continue...");
kb.nextLine();
//Testing drawBox() method
System.out.println("nn=========================");
System.out.println("Testing drawBox() method");
System.out.println("=========================");
System.out.println("Drawing box #1 (" b1.getWidth() "x"
b1.getLength() ", not filled)");
b1.drawBox();
System.out.print("nPress ENTER to continue...");
kb.nextLine();
System.out.println("nnDrawing box #2 (" b2.getWidth() "x"
b2.getLength() ", filled)");
b2.drawBox();
System.out.print("nPress ENTER to continue...");
kb.nextLine();
System.out.println("nnDrawing box #3 (" b3.getWidth() "x"
b3.getLength() ", not filled)");
b3.drawBox();
System.out.print("nPress ENTER to continue...");
kb.nextLine();
}//end main()
}//end class
длина box2 должна быть установлена равной 3, поскольку она равна 2, но она не работает? я действительно понятия не имею, почему.
Вывод
=========================
Testing the constructor
=========================
(If nothing is printed, there were no run-time errors!)
Press ENTER to continue...
=========================
Testing the getters
=========================
Box 1: width=20 and length=15 (should be 20 and 15)
Box 2: symbol=# and filled=false (should be # and false)
Box 3: width=3 and length=5 (should be 3 and 5)
Press ENTER to continue...
=========================
Testing the setters
=========================
Box 1: width=20 and length=14 symbol=A filled=false
(should now be changed to 20, 14, A, and false)
Box 2: width=3 and length=2 symbol=# filled=true
(should now be changed to 3, 3, #, and true)
Комментарии:
1. И где находится полиморфизм и наследование, о которых вы говорите?
Ответ №1:
У вас та же ошибка в setLength
и setWidth
(просто имена переменных разные); а именно, вы протестировали существующее свойство length
(или width
) вместо нового значения. Кроме того, вы хотите логическое и. Изменить,
public void setLength(int newLength) {
if (length >= MIN || length <= MAX) {
length = newLength;
}
}
Для
public void setLength(int newLength) {
if (newLength >= MIN amp;amp; newLength <= MAX) {
length = newLength;
}
}
и изменить
public void setWidth(int newWidth) {
if (width >= MIN || width <= MAX) {
newWidth = width;
}
}
для фактического обновления width
тоже…
public void setWidth(int newWidth) {
if (newWidth >= MIN amp;amp; newWidth <= MAX) {
width = newWidth;
}
}
Комментарии:
1. Еще одна вещь, не является ли код коротким для перехода к min / max? То есть, если current
length = 10
и я вызываюsetLength(1)
, функция сохранитlength = 10
вместо изменения наlength = 3 (MIN)
. Это не то, что говорится в его описании функциональности, нет?2. Но это все еще имеет тот же результат, что и у меня
Ответ №2:
Если вы хотите, чтобы переменная переходила к ближайшему из (MIN / MAX), учитывая, что она находится за пределами границ, функции должны измениться на:
public void setLength(int newLength) {
if (newLength <= MIN)
length = MIN;
else if(newLength >= MAX)
length = MAX;
else
length = newLength;
}
public void setWidth(int newWidth) {
if (newWidth <= MIN)
width = MIN;
else if(newWidth >= MAX)
width = MAX;
else
width = newWidth;
}
Комментарии:
1. Дело в том, что все, что нужно сделать установщикам, это изменить длину или ширину, ТОЛЬКО если они находятся между MIN и MAX, если они не попадают в значения, просто не меняйте значение, конструктор — это то, что должно позаботиться о MIN и MAX, вот моя проблема — это назначение, и я обычно делаю это без проблем, но этот переключатель странный