2011-09-17 35 views
5

Hiện tại, chúng tôi đang tìm hiểu cách sử dụng nhiều lớp trong Java và có một dự án hỏi về việc tạo một lớp Circle sẽ chứa radiusdiameter. từ một lớp chính để tìm đường kính. Mã này tiếp tục nhận được một lỗi (đề cập trong tiêu đề)Lỗi Java - "khai báo phương thức không hợp lệ; loại trả về bắt buộc"

public class Circle 
{ 
    public CircleR(double r) 
    { 
     radius = r; 
    } 
    public diameter() 
    { 
     double d = radius * 2; 
     return d; 
    } 
} 

Nhờ sự giúp đỡ, -AJ

Cập nhật 1: Được rồi, nhưng tôi không cần phải khai báo dòng thứ ba public CircleR(double r) là một đôi, phải không? Trong cuốn sách tôi đang học hỏi, ví dụ không làm điều đó.

public class Circle 

    { 
     //This part is called the constructor and lets us specify the radius of a 
     //particular circle. 
     public Circle(double r) 
     { 
     radius = r; 
     } 

     //This is a method. It performs some action (in this case it calculates the 
     //area of the circle and returns it. 
     public double area() //area method 
     { 
      double a = Math.PI * radius * radius; 
     return a; 
    } 

    public double circumference() //circumference method 
    { 
     double c = 2 * Math.PI * radius; 
    return c; 
    } 

     public double radius; //This is a State Variable…also called Instance 
     //Field and Data Member. It is available to code 
    // in ALL the methods in this class. 
    } 

Như bạn thấy, mã public Circle(double r).... thế nào là khác biệt so với những gì tôi đã làm trong mỏ với public CircleR(double r)? Vì lý do gì, không có lỗi nào được đưa ra trong mã từ cuốn sách, tuy nhiên tôi nói có lỗi ở đó.

+3

Javac thường khá hữu ích và các thông báo lỗi mà nó trả về khá rõ ràng. Lần tới khi bạn có một trong số đó có thời gian nghỉ ngắn và câu trả lời sẽ đến với bạn :) – mbatchkarov

+2

'CircleR' không phải là hàm tạo cho' Vòng tròn'. Tên * phải * khớp. –

Trả lời

22

Như bạn thấy, mã Vòng công cộng (r kép) .... thế nào là khác nhau từ những gì tôi đã làm trong mỏ với CircleR công cộng (double r)? Đối với bất kỳ lý do gì, không có lỗi nào được đưa ra trong mã từ sách, tuy nhiên, của tôi cho biết có lỗi ở đó.

Khi xác định các hàm tạo của một lớp, chúng phải có cùng tên với lớp. Như vậy đoạn mã sau

public class Circle 
{ 
    //This part is called the constructor and lets us specify the radius of a 
    //particular circle. 
    public Circle(double r) 
    { 
    radius = r; 
    } 
.... 
} 

là đúng trong khi mã của bạn

public class Circle 
{ 
    private double radius; 
    public CircleR(double r) 
    { 
     radius = r; 
    } 
    public diameter() 
    { 
     double d = radius * 2; 
     return d; 
    } 
} 

là sai vì constructor của bạn có tên khác nhau từ các lớp học. Bạn có thể có thể làm theo cùng một mã từ cuốn sách và thay đổi constructor của bạn từ

public CircleR(double r) 

để

public Circle(double r) 

hoặc (nếu bạn thực sự muốn đặt tên constructor của bạn như CircleR) đổi tên lớp học của bạn để CircleR.

Vì vậy, lớp mới bạn nên

public class CircleR 
{ 
    private double radius; 
    public CircleR(double r) 
    { 
     radius = r; 
    } 
    public double diameter() 
    { 
     double d = radius * 2; 
     return d; 
    } 
} 

Tôi cũng đã thêm các kiểu trả về đôi trong phương pháp của bạn như đã chỉ ra bởi Froyo và John B.

Tham khảo article này về xây dựng.

HTH.

+0

ok, nhưng bây giờ nó đang làm nổi bật bán kính = r; và nói "không thể tìm thấy biểu tượng - lớp biến". và cảm ơn bài báo, tôi đang đọc nó ngay bây giờ. –

+1

không bao giờ nhớ, tôi nhận ra rằng ở phía dưới, tôi cần phải nói công khai bán kính gấp đôi ;. lý do cho điều này là gì? tại sao tôi nói rằng ở phía dưới chứ không phải ở bên trong vòng tròn công cộng (double r)? –

+0

Bởi vì ... 'double r' là một tham số cho hàm tạo. 'bán kính kép;', bên ngoài bất kỳ phương thức nào, là một trường trong lớp. Các tham số được loại bỏ khi phương thức trả về. Các trường tồn tại miễn là cá thể lớp. –

4

Bạn quên tuyên bố tăng gấp đôi như một kiểu trả về

public double diameter() 
{ 
    double d = radius * 2; 
    return d; 
} 
8

Mỗi phương pháp (trừ một constructor) phải có một kiểu trả về.

public double diameter(){... 
-1

Tôi gặp sự cố tương tự khi thêm lớp học vào phương thức chính. Hóa ra đó không phải là một vấn đề, đó là tôi không kiểm tra chính tả của mình. Vì vậy, như một noob, tôi đã học được rằng chính tả sai có thể và sẽ gây rối mọi thứ. Những bài đăng này đã giúp tôi "nhìn thấy" lỗi của tôi và tất cả đều tốt.

Các vấn đề liên quan