#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 добро пожаловать, сэр, если ответ вас удовлетворяет, пожалуйста, отметьте его как выбранный ответ