2012-05-16 23 views
7

Tôi bắt đầu viết Java program đầu tiên của mình.Làm thế nào để lớp chứa phương thức chính không được khởi tạo và vẫn ổn trong Java?

class HelloWorldApp { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 
} 

Chương trình chỉ chạy tốt với mã ở trên. Nhưng theo kiến ​​thức OOP của tôi, một class chỉ là một khái niệm trừu tượng và không đến với cuộc sống cho đến khi bạn tạo ra một đối tượng thuộc loại này. Và sau đó, thông qua đối tượng đó, chúng ta gọi các phương thức/hàm trong lớp.

Nhưng trong ví dụ cụ thể này, có vẻ như main phương pháp được gọi là thậm chí mà không cần tạo một đối tượng của classHelloWorldApp

là đối tượng được tạo ra ở một nơi khác? Nếu vậy, phần mã đó biết tên class tên HelloWorldApp của tôi như thế nào?

Trả lời

10

Đó là bởi vì nó là static phương pháp, và cho rằng nó không cần phải tạo ra dụ

JVM sẽ nạp lớp HelloWorldApp và nó sẽ gọi phương thức tĩnh trên nó, Và vì nó là JVM công cộng (là bên ngoài) có thể truy cập phương pháp này


Ngoài Xem

+0

Điều đó có nghĩa là tôi có thể gọi bất kỳ chức năng tĩnh nào bên trong bất kỳ lớp nào khác không? Nó không làm giảm đi khái niệm đóng gói? –

+0

có bạn có thể, các trường/phương thức tĩnh được liên kết với lớp (mỗi lớp được tải và không phải với đối tượng), nếu chúng được công khai, bạn có thể thực hiện nó –

+2

Đóng gói không phải là quy tắc được thực thi bởi trình biên dịch mà là nguyên tắc sử dụng để cố gắng tạo mã tốt hơn. Ngôn ngữ và trình biên dịch có thể giúp chúng tôi đạt được đóng gói nhưng không ép buộc chúng tôi. Ngay cả một ngôn ngữ hướng đối tượng thuần túy như Smalltalk cũng không buộc bạn phải theo dõi sự đóng gói. Tuy nhiên, trong Smalltalk, các lớp là chính các đối tượng thực, do đó bạn có thể gửi các thông điệp mà chúng phản hồi. Bạn thậm chí có thể kế thừa chúng trong các lớp con và có các lớp con gọi super. –

3

Bắt đầu từ điểm cho một ứng dụng java (không phải luôn luôn) là phương pháp này

public static void main(String[] args) { 
     System.out.println("Hello World!"); // Display the string. 
    } 

Khi bạn làm java className nó sẽ đi và kiểm tra xem lớp học có một phương thức main, kể từ tĩnh của nó có thể được gọi mà không cần tạo một cá thể.

Nếu không có phương pháp chính hoặc phương pháp chính ở đó nhưng không có cùng chữ ký, nó sẽ ném bạn RuntimeException nêu rõ phương pháp chính không tìm thấy.

Đừng quên đọc A closer look at main method.

tắt chủ đề:

Mở rộng cùng một ý tưởng, bạn không cần một cá thể của lớp để tham chiếu phương pháp và trường tĩnh của nó.

public class MyClass { 
    public static int NUMBER = 10; 

    public static void String sayHello(){ 
    return "Hello"; 
    } 

    public void String sayBye(){ 
    return "Bye"; 
    } 

    public static void main(String[] args){ 
    System.out.println(NUMBER); // No need for object 
    System.out.println(sayHello()); // No need for object 
    System.out.println(new MyClass().sayBye()); // sayBye is not accessible at class level have to have an object of MyClass to access sayBye 
    } 
} 

Nếu cùng được gọi trong một số lớp khác sau đó nó có thể trông giống như:

public class MyClassCaller { 
    public static void main(String[] args){ 
    System.out.println(MyClass.NUMBER); // No need for object just refer the class 
    System.out.println(MyClass.sayHello()); // No need for object just refer the class 
    System.out.println(new MyClass().sayBye()); // sayBye is not accessible at class level have to have an object of MyClass to access sayBye 
    } 
} 

Một cuộc thảo luận thoải mái về việc sử dụng/overusage của static methods

1

phương pháp chính là tĩnh mà không cần một Ví dụ

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