Помогите пожалуйста.Без введения новых полей класса и изменения модификаторов доступа устранить все ошибки компиляции.
class Ball{
private int radius;
private final int defaultRadius;
public Ball(){
defaultRadius = 20;
radius = calculateRadius();
}
public Ball(boolean isDoubled){
if (isDoubled)
radius <<= 1;
}
protected int calculateRadius(){
return defaultRadius;
}
public String toString(){
return radius;
}
}
class BigBall extends Ball{
private int radiusInc = 30;
protected int calculateRadius(){
return defaultRadius+radiusInc;
}
}
public class Main{
public static void main (String[]args){
System.out.println(new Ball());
System.out.println(new Ball(true));
System.out.println(new BigBall());
System.out.println(new BigBall(true));
}
}
Error:(17, 16) java: incompatible types required: java.lang.String found: int
Error:(24, 16) java: defaultRadius has private access in Ball
Error:(32, 28) java: constructor BigBall in class BigBall cannot be applied to given types; required: no arguments found: boolean reason: actual and formal argument lists differ in length
incompatible types required: java.lang.String found: int
Говорит о том, что возвращаемый тип метода должен быть String, а он сейчас int
Чтобы привести в нужный вид, нужно возвращать то, что требуют:
public String toString(){
return String.valueOf(radius);
}
defaultRadius has private access in Ball
Модификатор доступа у defaultRadius объявлен как приватный, а значит достучаться к полю можно через метод calculateRadius(). Вдобавок он объявлен как final, а значит брать значение можно только с базового класса. Это значит, что здесь:
protected int calculateRadius(){
return defaultRadius+radiusInc;
}
можно записать так:
protected int calculateRadius(){
return super.calculateRadius()+radiusInc;
}
constructor BigBall in class BigBall cannot be applied to given types; required: no arguments found: boolean reason: actual and formal argument lists differ in length
Говорит о том, что в строке
System.out.println(new BigBall(true));
Дается конструктору параметр, хотя в классе BigBall нет такого конструктора.
лечится добавлением оного:
public BigBall(boolean isDoubled){
super(isDoubled);
}
Правда тогда пропадает конструктор по умолчанию, который компилятор автоматически всегда создает для классов, а значит для new BigBall() теперь нужно конструктор по умолчанию создать ручками:
public BigBall(){
super();
}
и еще. Т.к. defaultRadius объявлен как final, то изменять это значение нельзя. А значит значение нужно сразу инициализировать
private final int defaultRadius = 10;
а также нельзя пытаться изменить это значение здесь:
public Ball(){
defaultRadius = 20; <!---- Это нужно удалить
radius = calculateRadius();
}
Результат может выглядеть как-то так:
class Ball{
private int radius;
private final int defaultRadius = 10;
public Ball(){
radius = calculateRadius();
}
public Ball(boolean isDoubled){
// вызов конструктора по умолчанию,
// иначе не будет инициализирован radius
this();
if (isDoubled)
radius <<= 1;
}
protected int calculateRadius(){
return defaultRadius;
}
public String toString(){
return String.valueOf(radius);
}
}
class BigBall extends Ball{
private int radiusInc = 30;
public BigBall(){
super();
}
public BigBall(boolean isDoubled){
super(isDoubled);
}
protected int calculateRadius(){
return super.calculateRadius()+radiusInc;
}
}
main без изменений
System.out.println(new Ball());
System.out.println(new Ball(true));
System.out.println(new BigBall());
System.out.println(new BigBall(true));
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости