2016-04-03 2 views
-1

У меня есть 3 класса, и у меня есть метод в моем классе прямоугольников, который проверяет, имеют ли высоту и ширину одну и ту же длину, однако, если я задаю высоту и ширину в моем треугольном классе и наследую свой класс треугольников, он говорит, что Метод rectangle isSquare() является истинным, потому что он использует значения по умолчанию 0.0 и 0.0. Почему это не наследует то, что я назначил в классе Triangle?Наследование значений переменных классов в Java?

class inheritence { 
    private double width; 
    private double height; 
    public void setHeight(double height){ 
     this.height=height; 
    } 
    public double getHeight(){ 
     return height; 
    } 
    public void setWidth(double width){ 
     this.width=width; 
    } 
    public double getWidth(){ 
     return width; 
    } 
    void showDim(){ 
     System.out.println("Width and height are "+width+" and "+height); 
    } 
} 

class Triangle extends inheritence{ 
    String style; 
    double area(){ 
     return getHeight()* getWidth(); 
    } 
    void showStyle(){ 
     System.out.println("Triangle is "+style); 
    } 
} 

public class Rectangle extends Triangle{ 
    boolean isSquare(){ 
     if(getWidth()==getHeight()){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
    public double area(){ 
     return getWidth()*getHeight(); 
    } 
} 

public class Driver { 
    public static void main(String[]args){ 
     Triangle t1=new Triangle(); 
     Triangle t2=new Triangle(); 
     Rectangle rect=new Rectangle(); 
     t1.setHeight(10); 
     t1.setWidth(20); 
     if(rect.isSquare()){ 
      System.out.println("Its a square!"); 
     }else{ 
      System.out.println("Its not a square"); 
     } 

     System.out.println(t1.getHeight()); 
     System.out.println(t1.getWidth()); 
     t1.showDim(); 
     System.out.println("The area for t1 is "+t1.area()); 
     t1.style="Outlined"; 
     t1.showStyle(); 
    } 
} 
+0

Это должно быть правдой изначально. Как только вы измените свойства ширины и высоты, тогда это может быть другим. А прямоугольник - это не тип треугольника, так что это не очень хорошая классическая структура. – ManoDestra

+4

... Прямоугольник ** определенно НЕ ** треугольник, поэтому ваша структура наследования неправильна к тому, чтобы быть с (и форма изначально традиционно проблематична). Кроме того, область для треугольника была бы неправильной в любом случае. –

+0

Lol, я знаю, что это страшная структура классификации, НО мне интересно, почему это не работает – Eli

ответ

3

Вы устанавливаете width и height в экземпляре вашего Triangle класса (t1), но назвать проверку rect.isSquare() на другой экземпляр (что случается быть Rectangle), для которого вы не установили width и height, поэтому они оставались 0.

В width и height членов являются членами экземпляра (они не являются статичными), что означает, каждый экземпляр вашего класса class inheritence имел бы разные значения для них, поэтому их установка в одном экземпляре не влияет на их значения в других случаях.

1

Вы устанавливаете высоту и ширину для объекта t1 вместо объекта rect. Если вы установите его на Rect объекта, то выход будет показывать Its not a square

rect.setHeight(10); 
    rect.setWidth(20); 

Поскольку вы наследуя значения, вы в принципе не нужны отдельные экземпляры объектов треугольника для работы с. Вы можете просто работать с 1 объектом, то есть rect

+0

Значит, для наследования он не наследует значения объектов? – Eli

+0

Поскольку вы наследуете свойства в соответствии с принципом наследования ООП, вам в основном не нужны отдельные экземпляры объектов треугольника ('t1' или' t2') для работы. Вы можете просто работать с 1 объектом, т. Е. ('Rect') Так как' rect' - это экземпляр объекта 'Rectangle', он наследует свойства от' Triangle' и 'Triangle' inturn, наследует высоту и ширину из класса« inheritance » , –

Смежные вопросы