Java 局部变量分为以下四种:普通内部类,静态内部类,局部内部类和匿名内部类。对于内部类,有以下几点需要确认:
1:创建内部类对象的时刻并不依赖于外围类对象的创建。
2:内部类并没有“is a ”的关系.
3:内部类提供了更好的封装,除了该外围类,其他类都不能访问
1:普通内部类:
普通内部类就是直接将一个类的定义放在另外一个类类体的内部,该类被包括该类的类独享,任何外部类想访问该内部内首先要访问其外部类。普通内部类从概念上讲非常容易理解,其代码如下:
public class OuterClass {
public OuterClass()
{
}
public void show()
{
System.out.println("我是外部类");
}
public class InnerClass{
public InnerClass()
{
}
public void show()
{
System.out.println("我是内部类");
}
}
}
现在我们需要回答如下几个问题:1,内部类何时被创建.2, 如何访问内部类。3,内部类可以访问外部类的成员变量或者成员方法吗?如果可以,那么和外部类的成员变量访问修饰符有关系吗?先来回答第一个问题。首先我们要明确一个概念,就是内部类是一个编译时的概念,当编译完成以后,他和外部类属于完全不同的两个类。内部类的创建必须依附于外部类的对象,所以获取内部类对象的语法如下:
OuterClass o=new OuterClass();
OuterClass.InnerClass i=o.new InnerClass();
现在回答第二个问题,如何访问内部类。在创建内部类的对象以后,就可以把内部类当成一个普通的类来进行访问了。
第三个问题,内部类可以访问外部类的成员变量吗?可以,由于可以把内部类当成外部类的一个成员,那么内部类当然可以向普通成员方法一样访问外部类的成员变量。
2:局部内部类
局部内部类是创建在函数中的类,该类只能在该函数中实例化使用。
public void test()
{
class InnerClass{
InnerClass()
{
}
public void test()
{
System.out.println("我是局部内部类");
}
}
InnerClass i=new InnerClass();
i.test();
}
局部内部类类似于函数的局部变量,随着该方法调用的结束,该类也会消亡掉。注意局部内部类不可以有访问修饰符,因为没有任何在方法外部访问该类的可能,因此,局部内部类也就没有必要设置访问修饰符。
3:静态内部类:
静态内部类和成员内部类类似,只是在类名前面加上static 关键字,静态内部类类似于类的静态变量,可以不通过外部类的对象进行访问而直接通过类名访问。静态内部类的实例化可以不通过外部类而被直接实例化,例如:
public class OuterClass {
private String a="999";
public OuterClass()
{
}
public static class InnerClass{
InnerClass()
{
}
public void test()
{
System.out.println("我是静态内部类");
}
}
}
实例化该类的代码如下:
InnerClass i=new InnerClass();
同时,静态内部类只能访问外部类的静态成员而不能访问非静态成员,但是外部类访问静态内部类的成员只能通过内部类的实例来访问。
4:匿名类
匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。匿名类的创建方式如下:
new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}
实现代码如下:
public class OuterClass {
void show() {
System.out.println("调用 Out 类的 show() 方法");
}
}
public class Test {
private void show() {
OuterClass anonyInter = new OuterClass() {
// 获取匿名内部类的实例
void show() {
System.out.println("调用匿名类中的 show() 方法");
}
};
anonyInter.show();
}
public static void main(String[] args)
{
Test test = new Test();
test.show();
}
}
这样调用的方法是内部类中的方法。