#5d027b0de70c12d39e94bc2ab06269c1#
大概每个人在学生时代开始就使用Java了,我们一直在学习Java,但Java中总有一些概念含混不清,不论是对初级还是高级程序员都是如此。所以,这篇文章的目的就是弄清楚这些概念。
读完本文你会对这些概念有更深入的了解,还能弄清楚一切灰色的东西。在本书中,我们将讨论匿名内联类、多线程、同步和序列化。
1、匿名类Java匿名类很像局部类或内联类,只是没有名字。我们可以利用匿名类,同时定义并实例化一个类。只有局部类仅被使用一次时才应该这么做。
匿名类不能有显式定义的构造函数。相反,每个匿名类都隐含地定义了一个匿名构造函数。
创建匿名类有两种方法:
扩展已有的类(可以是抽象类,也可以是具体类)
创建接口
理解代码的最好方法就是先阅读,所以我们首先来看看代码。
interface Football { void kick(); } class AnnonymousClass { public static Football football = new Football() { @Override public void kick() { System.out.println("Nested Anonymous Class."); } }; public static void main(String\[\] args) { // anomynous class inside the method Football footballObject = new Football() { @Override public void kick() { System.out.println("Anonymous Class"); } }; footballObject.kick(); AnnonymousClass.football.kick(); } }匿名类可以在类和函数代码块中创建。你也许知道,匿名类可以用接口来创建,也可以通过扩展抽象或具体的类来创建。上例中我先创建了一个接口Football,然后在类的作用域和main()方法内实现了匿名类。Football也可以是抽象类,也可以是与interface并列的顶层类。
Football可以是抽象类,请看下面的代码。
public abstract class Football { abstract void kick(); }匿名类不仅可以是抽象类,还可以是具体类。
// normal or concrete class public class Football { public void kick(){} }// end of class scope.如果Football类没有不带参数的构造方法怎么办?我们可以在匿名类中访问类变量吗?我们需要在匿名类中重载所有方法吗?
// normal or concrete class public class Football { protected int score; public Football(int score) { this.score = score; } public void score(){ System.out.println("Score "+score); }; public void kick(){} public static void main(String\[\] args) { Football football = new Football(7) { @Override public void score() { System.out.println("Anonymous class inside the method "+score); } }; football.score(); } } // end of class scope.
创建匿名类时可以使用任何构造方法。注意这里也使用了构造方法的参数。
匿名类可以扩展顶层类,并实现抽象类或接口。所以,访问控制的规则依然适用。我们可以访问protected变量,而改成private就不能访问了。
由于上述代码中扩展了Football类,我们不需要重载所有方法。但是,如果它是个接口或抽象类,那么必须为所有未实现的方法提供实现。
匿名类中不能定义静态初始化方法或成员接口。
匿名类可以有静态成员变量,但它们必须是常量。
匿名类的用途: