Я не могу передать входные данные из массива объектов в метод Java

#java #arrays #object #input #methods

#java #массивы #объект #ввод #методы

Вопрос:

Я создаю Java-программу для вычисления площади и периметра треугольника и квадрата, где мне нужно создать объект обоих классов triangle и square и получать от них входные данные. Я написал для него некоторый код, но он не принимает входные данные в качестве аргументов. Я не понимаю, в чем может быть проблема. Пожалуйста, помогите

geometricFigure.java — Это интерфейс

 public interface GeometricFigure {
    public void area(double sideOne, double sideTwo, double sideThree);
    public void perimeter(double sideOne, double sideTwo, double sideThree);
    public void print();
 

}

trisqu.java — Это файл с основной функцией

 public class trisqu{
public static void main(String[] args) {
double sideOne, sideTwo , sideThree;
 //Triangle tr = new GeometricFigure();
Triangle[] tr = new Triangle[3];
tr[0] = new Triangle(4,9,12);
tr[1] = new Triangle(9,16,25);
tr[2] = new Triangle(8,12,14);
for (int i=0;i<tr.length;i  ){
    System.out.println("Triangle Object :" (i 1) " ");
    tr[i].area(sideOne, sideTwo, sideThree);
    tr[i].perimeter(sideOne, sideTwo, sideThree);
    tr[i].print();
    }



//Square sq = new GeometricFigure();
Square[] sq = new Square[3];
sq[0] = new Square(8);
sq[1] = new Square(32);
sq[2] = new Square(16);
for (int i=0;i<sq.length;i  ){
    System.out.println("Square Object : " (i 1)  " ");
    sq[i].area(sideOne, sideTwo, sideThree);
    sq[i].perimeter(sideOne, sideTwo, sideThree);
    sq[i].print();
    }
  }
}
 

square.java — Это файл square

 public class Square implements GeometricFigure{
private double SqArea, SqPerimeter, side;
Square(double side){}


@Override
public void area(double sideOne, double sideTwo, double sideThree) {
    SqArea  = sideOne*sideOne;
    
}

@Override
public void perimeter(double sideOne,double sideTwo,double sideThree) {
    SqPerimeter  = sideOne*4;   
}

@Override
public void print(){
System.out.print("Area = " SqArea " Perimeter = " SqPerimeter);
System.out.println("n");
}
}
 

triangle.java — Это досье trianlge`

 import java.lang.Math;


public class Triangle implements GeometricFigure{
private double sideOne, sideTwo, sideThree,TriArea,TriPerimeter;
public Triangle(double sideOne, double sideTwo, double sideThree){
    
}
double halfp = (sideOne   sideTwo   sideThree)/2;
@Override
public void area(double sideOne, double sideTwo, double sideThree){
    TriArea = Math.sqrt(halfp*(halfp - sideOne)*(halfp - sideTwo)*(halfp - sideThree));
}

@Override
public void perimeter(double sideOne, double sideTwo, double sideThree){
    TriPerimeter = sideOne   sideTwo   sideThree;
}

@Override
public void print(){
System.out.print("Area = " TriArea " Perimeter = " TriPerimeter);
System.out.println("n");
}

}
 

Пожалуйста, помогите, я новичок в Java или любом другом языке, если на то пошло.

Ответ №1:

Есть несколько вещей, которые следует учитывать.

Во-первых, я полагаю, что вы неправильно используете интерфейсы, на мой взгляд, они должны описывать поведение (поэтому абстрактный класс здесь немного более предпочтителен, имхо), и поскольку классы, которые реализуют интерфейс, уже имеют значения объекта, вам не нужно их передавать.

Во-вторых, вы передаете параметры конструктору, но не присваиваете их свойствам вашего класса, что является проблемой.

В-третьих, когда вы передаете sideOne, sideTwo , sideThree параметры в main, они еще не инициализированы, однако наиболее важной частью является то, что вам вообще не нужно их передавать.

В общем, я бы порекомендовал вам что-то вроде этого:

 public interface GeometricFigure {
    public double getArea();
    public double getPerimeter();
    public void print();
}

 

Далее классы, которые его реализуют, должны быть следующими:

 public class Square implements GeometricFigure {
    private double side; // note that I have removed the area and perimeter variables

    Square(double side) {
        this.side = side;
    }

    @Override
    public double getArea() {
        return side * side;
    }

    @Override
    public double getPerimeter() {
        return side * 4;
    }

    @Override
    public void print() {
        System.out.print("Area = "   getArea()   " Perimeter = "   getPerimeter());
        System.out.println("n");
    }
}
 

Обратите внимание, что структура класса изменилась. Это было сделано для того, чтобы нам не нужно было обновлять свойства area and perimeter при каждом изменении стороны (если такое возможно).

Я верю, что вы сами можете сделать треугольник.

Теперь основная часть:

 public static void main(String[] args) {
        Triangle[] tr = new Triangle[3];
        tr[0] = new Triangle(4,9,12);
        tr[1] = new Triangle(9,16,25);
        tr[2] = new Triangle(8,12,14);
        for (int i=0;i<tr.length;i  ){
            System.out.println("Triangle Object :" (i 1) " ");
            tr[i].print();
        }

        Square[] sq = new Square[3];
        sq[0] = new Square(8);
        sq[1] = new Square(32);
        sq[2] = new Square(16);
        for (int i=0;i<sq.length;i  ){
            System.out.println("Square Object : " (i 1)  " ");
            sq[i].print();
        }
    }
 

Однако, если мы хотим пойти немного дальше, на самом деле нет необходимости в print() методе в GeometricFigure . Лучшим подходом для простых задач был бы переопределяющий toString() метод:

     @Override
    public String toString() {
        return "Area = "   getArea()   " Perimeter = "   getPerimeter();
    }
 

А затем в основном просто выполняем следующее:

    for (int i=0;i<sq.length;i  ){
       System.out.println("Square Object : " (i 1)  " n"   sq[i]);
   }
 

Комментарии:

1. @MayankSharma добро пожаловать, сэр, если ответ вас удовлетворяет, пожалуйста, отметьте его как выбранный ответ