2011-01-27 32 views
7

Các lớp bên trong có trọng lượng nhẹ hơn các lớp bình thường hay trong java cuối cùng biên dịch các lớp bên trong giống như các lớp bình thường?Lớp bên trong có trọng lượng nhẹ không?

Tôi biết các lớp trong java không phải tất cả đều rất nhẹ, và chúng chiếm một phần bộ nhớ permgen, vì vậy tôi muốn biết cách tốt nhất để sử dụng các hàm giống như lớp bên trong, hoặc nếu các lớp chuẩn sẽ cũng ổn chứ?

+1

JVM chỉ có các kiểu dữ liệu nguyên thủy ('int',' float', v.v.) và các lớp. Không có gì giữa chúng. – Gabe

Trả lời

17

Lớp bên trong và các lớp bên trong vô danh cả hai biên dịch xuống .class tệp. Ví dụ:

class Outer { 
    class Inner { 

    } 

    Object function() { 
      return new Object() { 

      }; 
    } 
} 

sẽ tạo ra ba .class file, Outer.class, Outer$Inner.class, và Outer$1.class. Chúng không phải là "nhẹ" hơn so với các lớp khác, và (theo sự hiểu biết tốt nhất của tôi), không có lợi thế nào khi sử dụng cái này so với cái kia từ góc độ hiệu suất. Tất nhiên, các lớp bên trong và đặc biệt là các lớp bên trong vô danh thực sự hữu ích trong các bối cảnh mà các lớp thông thường khó mã hơn, nhưng đó là một vấn đề riêng biệt.

+7

+1. Nếu bất kỳ lớp bên trong nào là "nặng hơn" vì chúng chứa các phương thức tổng hợp và các trường mà trình biên dịch tạo ra để tạo điều kiện cho các quy tắc hiển thị đặc biệt mà chúng có liên quan đến lớp chứa của chúng. – Thilo

+0

Wow! Cảm ơn bạn về thông tin! – Waneck

1

Chúng không phải là trọng lượng nhẹ, nhưng chúng có giới hạn. AFAIK, bạn không thể tạo nhiều hơn một thể hiện của một lớp bên trong vô danh, và vì vậy nếu nhu cầu của bạn yêu cầu điều này, bạn phải sử dụng một lớp không ẩn danh.

chỉnh sửa 1: Cảm ơn tất cả các nhận xét và giải thích. Xin hãy giúp tôi hiểu điều này tốt hơn ... Tôi hiểu rằng bạn có thể có nhiều phiên bản của các lớp bên trong vô danh, nhưng nếu tôi khai báo một đối tượng ActionListener bên trong ẩn danh, làm cách nào tôi có thể có nhiều phiên bản mà lớp và chỉ có lớp đó mà không sử dụng sự phản chiếu? Cảm ơn trước (hoặc tôi nên hỏi điều này trong câu hỏi của riêng tôi?)!

OK, vì tôi không nhận được bất kỳ vết cắn nào ... Hãy để tôi chứng minh bằng mã. Giả sử tôi tạo một ActionListener ẩn danh tại đây:

JButton button = new JButton("Button"); 

    button.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("Button says \"Foo!\""); 
    } 

    }); 

    JOptionPane.showMessageDialog(null, button); 

Tôi tạo một ActionListener ẩn danh và cũng tạo đối tượng của lớp này trong một lần ngã. Những gì tôi đã luôn luôn được dạy, những gì tôi đã đề cập ở trên cùng của bài viết của tôi ở đây (và được dinged cho), đó là khó khăn nếu không phải là không thể (không có sự kỳ diệu của sự phản ánh) để làm cho một đối tượng của lớp vô danh này, chỉ có một đối tượng có thể được thực hiện, và trong những tình huống mà chỉ có một đối tượng là cần thiết, điều này là tốt. Nhưng trong các tình huống khác, nó không ổn. Và chắc chắn, bạn có thể tạo nhiều lớp ActionListener ẩn danh tương tự, như trong vòng lặp for:

JPanel panel = new JPanel(new GridLayout(5, 5)); 
    JButton[] buttons = new JButton[25]; 
    for (int i = 0; i < 25; i++) { 
    final int btnNumber = i; 
    buttons[i] = new JButton(String.valueOf(btnNumber)); 
    buttons[i].addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("From button " + btnNumber); 
     } 
    }); 
    panel.add(buttons[i]); 
    } 
    JOptionPane.showMessageDialog(null, panel); 

Nhưng dù vậy, mỗi lớp ẩn danh được tạo ở đây khác nhau. Điều này có thể có ý nghĩa nếu cùng loại người nghe này được sử dụng bởi nhiều JButtens, rằng nó có trạng thái, và hành vi của nó phụ thuộc vào trạng thái này. Đồng ý? Không đồng ý? Đặc biệt cảm ơn vì bất cứ đóng góp nào!

+3

Bạn có thể có nhiều phiên bản của các lớp bên trong vô danh bằng cách, ví dụ, đưa lớp vào một vòng lặp 'for' và khởi tạo nó nhiều lần.Tôi nghĩ Java yêu cầu tất cả các lớp này phải có cùng một kiểu, nhưng tôi không thể nhớ nó có đúng hay không. – templatetypedef

+1

Bạn đang suy nghĩ về nó. Một lớp bên trong vô danh vẫn là một lớp. Bạn có thể có bao nhiêu trường hợp của nó như bạn vui lòng. Bạn cũng có thể có nhiều lớp bên trong ẩn danh như bạn muốn chỉ định. Trình biên dịch xử lý tất cả điều này tại thời gian biên dịch. Đặc tả ẩn danh đầu tiên mà nó tìm thấy là tên đáng yêu của Foo $ 1, thứ hai là Foo $ 2, v.v. Mã như 'Runnable mới() {...}' trở thành 'Foo.new 1()'. –

+0

Cảm ơn các ý kiến ​​và thông tin hữu ích! Xin vui lòng làm rõ cho tôi ... nếu tôi có một ActionListener bên trong vô danh, làm thế nào tôi có thể có hai trường hợp riêng biệt của lớp này (không có phản xạ) vì nó được tạo ra như là đối tượng được tạo ra. Tôi biết rằng tôi có thể có nhiều trường hợp của ActionListeners ẩn danh, nhưng tôi tự hỏi làm thế nào nó có thể có nhiều trường hợp của một lớp vô danh riêng biệt đã được khai báo. –

7

Lớp bên trong vẫn là các lớp và chúng vẫn phải được tải bởi Trình nạp lớp. Nếu bất cứ điều gì, ngược lại là sự thật. Một lớp bên trong không tĩnh có thể giữ cho lớp cha không bị thu gom rác vì nó có tham chiếu đến lớp sở hữu nó.

+1

+1. Ngoài tham chiếu cha mẹ, cũng có các phương thức tổng hợp để cho phép gọi các phương thức "riêng tư" từ các lớp liên quan. – Thilo

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