gpt4 book ai didi

java - 内部类的目的是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:37 24 4
gpt4 key购买 nike

我正在阅读有关接口(interface)和类中的内部类的内容。我无法理解真正的用途。但是,我不想在这篇文章中讨论有关接口(interface)内部类的任何内容。

到目前为止,我一直使用内部类作为回调。我可以在某处外部声明类。

假设我有一个学生列表,我想按 id 对他们进行排序。我必须实现 Comparator 接口(interface)并将其作为参数提供给 Collections 的排序方法。

public class StudentList {

public static void main(String[] args) {

List<Student> students = new ArrayList<Student>();

Student student = new Student();
student.setId(1);
student.setName("Krishna");
students.add(student);

student = new Student();
student.setId(2);
student.setName("Chaitanya");
students.add(student);

Collections.sort(students, new StudentList().new MyComparator());
}

public class MyComparator implements Comparator<Student> {

@Override
public int compare(Student o1, Student o2) {

if (o1.getId() < o2.getId()) {
return 1;
} else if (o1.getId() > o2.getId()) {
return -1;
} else {
return 0;
}
}

}

}

我也可以这样做

public class StudentList {

public static void main(String[] args) {

List<Student> students = new ArrayList<Student>();

Student student = new Student();
student.setId(1);
student.setName("Krishna");
students.add(student);

student = new Student();
student.setId(2);
student.setName("Chaitanya");
students.add(student);

Collections.sort(students, new MyComparator());
}

}

class MyComparator implements Comparator<Student> {

@Override
public int compare(Student o1, Student o2) {

if (o1.getId() < o2.getId()) {
return 1;
} else if (o1.getId() > o2.getId()) {
return -1;
} else {
return 0;
}
}

}

我认为上面示例中的内部类不会增加任何重要意义,除非它被声明为私有(private)类。当我将其声明为私有(private)时,只有封闭类才能使用它。这意味着该类与封闭类紧密绑定(bind),我看到了这样做的一些优势。

谁能解释一下在应用程序中使用/编写内部类的真正重要性/重要性。

最佳答案

如果你需要一些特定于你工作的类的东西,你应该使用内部类。可以在这里找到内部类的一个很好的例子:java.awt.geom.Ellipse2D和相应的Ellipse2D.DoubleEllipse2D.Float (Ellipse2D source code)。您可以将这些类放在一个包中,但它们作为嵌套类更有意义。它们直接对应于 Ellipse2D 并且在其他地方没有用处;此外,它们嵌套的事实提高了使用它们的代码的可读性。另一方面,如果一个内部类在更通用时很有可能有用,那么通常最好将其泛化并制作一个常规类。

此外,内部类可以直接访问外部类中的变量。这意味着内部类可用于更改外部类。仍然可以获取它的实例以在任一类之外使用。为了说明我在说什么:

public class Example {
public static void main(String[] args) {
Foo foo = new Foo();
Foo.Bar bar = foo.getBar(); //note, cannot call new Foo.Bar(); as Bar is dependent on Foo
for (int i = 0; i < 50; i++){
System.out.println(bar.get());
}
}
}
class Foo {
int val;
Bar b;

public Foo(){
b = new Bar();
}
public Bar getBar(){
return b;
}
public class Bar{
public Bar(){
val++;
}
public int get(){
return val++;
}
}
}

内部类的另一种可能用途是为真正需要的内部类创建类似包装类的东西,这对递归类特别有用。这用于实现 LinkedList。有一次,我实现了这样一个列表,没有意识到以前已经做过任何类似的事情。这个想法是你有你的 LinkedList 类,以及其中的一个 Node 类(其中每个节点只指向下一个/前一个节点并保存一个值)。这样做可以简化代码。但是,Node 类在 LinkedList 外部没有任何意义,因为它是什么类型的“节点”?因此它应该是一个内部类。

关于java - 内部类的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com