Java OOP methods overriding

Hi mọi người ạ! Em mới học JAVA và OOP phần kế thừa, hôm nay học thì bị kẹt ở đoạn methods overrring.

Em có 1 super-class Shape (String name, double x, double y)

public class Shape {
	private String _name;
	private double _x, _y;
	
	public Shape(String name, double x) {
		this._name = name;
		this._x = x;
	}
	public Shape(String name, double x, double y) {
		this._name = name;
		this._x = x;
		this._y = y;
	}
        // em muốn kế thừa hàm getName() và getArea() từ shape qua 3 sub-class kia
        public String getName() {
		return _name;
	}
	public double getArea() {
		System.out.println("Shape's area is unknown at this moment!");
		return 0;
	}

}

và 3 sub-class Circle, Triangle, Rectangle kế thừa toàn bộ instance variables từ class Shape. Trong class Shape đó em có 2 methods là getName() và getArea()

public class Circle extends Shape {
	private String _name;
	private double _radius;
	
	public Circle(String name, double radius) {
		super(name, radius);
	}
	@Override
	public String getName() {
		return super.getName();
	}
	@Override
	public double getArea() {
		return (_radius * _radius) * Math.PI;
	}
	
}
public class Rectangle extends Shape {
	private String _name;
	private double _height, _width;
	
	public Rectangle(String name, double height, double width) {
		super(name, height, width);
	}
	@Override
	public String getName() {
		return super.getName();
	}
	@Override
	public double getArea() {
		return _height * _width;
	}
}
public class Triangle extends Shape{
	private String _name;
	private double _height, _base;
	
	public Triangle(String name, double height, double base) {
		super(name, height, base);
//		this._name = name;
	}
	@Override
	public String getName() {
		return super.getName();
	}
	@Override
	public double getArea() {
		return (_base/2) * _height;
	}	
}

và đây là hàm main của em. Em đã thử implement tuy nhiên lúc print ra thì lại sai kết quả. Em ko biết sai ở đâu ạ. Ai biết có thể chỉ cho em chỗ sai đc ko ạ? Em cảm ơn ạ.

public class Ex3 {
	public static void main(String[] args) {
		Shape[] arrShape = 	{
								new Circle("Circle", 5), // 78.5
								new Rectangle("Rectangle", 3, 4), // 12.0
								new Triangle("Triangle", 5, 5),  // 12.5
					  		};
		
		double sum = 0;
		for(Shape a: arrShape) {
			System.out.println(a.getArea() + " " + a.getName());
		}
		System.out.println(sum);  // 103.0
	}
}

Tips nhỏ cho bạn là với các giá trị nào không cần change, hãy nên để final cho nó. Như trong trường hợp này, các member _radius, _width, _height, _base, đểu nên có thêm keyword final. Và bạn sẽ thấy điều kỳ diệu xảy ra :stuck_out_tongue:

4 Likes

anh có thể giải thích chút nữa đc ko ạ? Em ko hiểu lắm, final thì nên thêm ở đâu ạ?

em chỉ biết là final nó tạo constant variable với ngăn ko cho override ạ, nhưng trong code này của em, em cần override để cho cái object Shape nó có thể reference với mấy cái getArea() methods ạ.

Mình đã nói rõ là thêm vào các data member này rồi mà :slight_smile:

3 Likes

vâng em đã thêm final vào những member đó và init dèault value cho nó rồi nhưng vấn ko dc ạ.

ý anh là như này phải ko ạ

public class Triangle extends Shape{
	private String _name;
	private final double _height = 0.0 , _base = 0.0;
	
	public Triangle(String name, double height, double base) {
		super(name, height, base);
//		this._name = name;
	}
	@Override
	public String getName() {
		return super.getName();
	}
	@Override
	public double getArea() {
		return (_base/2) * _height;
	}	
}

Bạn thêm final, rồi gán value =0.0 thì bạn cho mình hỏi trong constructor hàm super đó nó khởi tạo cho cái gì vậy bạn?

3 Likes

ah, em sorry anh, tại em add final vào nó có bug nên nhìn thoáng qua thấy chưa có init value. Giờ em init value như trên vào nó chạy đc rồi ạ.

Đây cũng là 1 cách, nhưng anh cho em hỏi thêm là nếu ko dùng final thì mình còn cách nào để override đc ko ạ?

Em cảm ơn anh ạ.

Chắc bạn hiểu nhầm gì đó ở đây, finaloverride không hề liên quan gì với nhau.
Vấn đề của bạn nó đơn giản hơn nhiều so với override

Sao bạn không thử suy nghĩ trả lời mà cứ thích hỏi hơn ấy nhỉ? :stuck_out_tongue:

3 Likes

Dạ em mới học qua JAVA nên cũng ko rõ lắm. Cứ có gì là lại GG thôi nên ko hiểu rõ bản chất vấn đề lắm ạ :)).

Tại có người để hỏi thì sao ko hỏi ạ cho ra nhẽ ạ, nghĩ thì nhiều lúc nghĩ ạ :blush:

Anyway, dù sao cũng cảm ơn anh nhiều nhé ạ :slight_smile:

Bạn có gán giá trị cho các trường của lớp con đâu mà đòi kết quả đúng. Bạn chỉ gọi đến hàm dựng của lớp cha và gán cho _x, _y, các trường của lớp con vẫn là 0.0.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?