您的位置:首页 > 编程语言 > Java开发

Java嵌套类

2015-04-16 00:00 369 查看
摘要: 嵌套类 内部类 匿名类

在Java中可以创建几种不同类型的嵌套类:

静态嵌套类:

静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量

public class Outer {

private String name;
private static String sname;

public String getName(){
return name;
}

public static String getSname(){
return sname;
}

private static class Nested{
public void test(){
getSname();
System.out.println(Outer.sname);
Outer outer = new Outer();
System.out.println(outer.name);
}
}

public static void main(String[] args) {
Outer.Nested instance = new Outer.Nested();
instance.test();
}

}


非静态嵌套类(内部类)

内部类跟外部类的实例相关联,因此必须先创建外部类实例,才能创建内部类实例

public class Outer {

private String name = "I'm private";
private static String sname;

public String getName(){
return name;
}

public static String getSname(){
return sname;
}

private class Nested{
public void test(){
getSname();
System.out.println(Outer.sname);
System.out.println(name);
getName();
}
}

public static void main(String[] args) {
Outer outer = new Outer();
Outer.Nested instance = outer.new Nested();
instance.test();
}

}


影子内部类
如果内部类声明了与外部类一样的方法和属性,我们称这样的类为影子内部类

public class Outer {
private String name = "I'm Outer private";
private class Nested{
private String name = "I'm Inner private";
public void printText(){
System.out.println(name);
System.out.println(Outer.this.name);
}
}

public static void main(String[] args) {
Outer outer = new Outer();
Outer.Nested instance = outer.new Nested();
instance.printText();
}
}


局部类

类似于内部类,但是是定义在方法体中的类,只能在定义它的方法作用域内访问。可以向其他内部类一样访问外部类的成员属性和方法, 可以访问方法体内其他的final成员变量。局部类同样可以定义在static方法中,此时只能访问外部类的静态成员,但是局部类中不能定义静态成员(常量除外,被声明为static final的除外)。

The same shadowing rules apply for local classes as for inner classes.

public class Outer {
private String name = "I'm Outer private";

public void printText(){
final String value = "Java";
class Local{
private void test(){
System.out.println(value);
System.out.println(name);
}
}
Local local = new Local();
local.test();
}

public static void main(String[] args) {
Outer outer = new Outer();
outer.printText();
}
}


匿名类

顾名思义没有名字的类,他们通常声明为一个已有类的子类或者一个接口的实现。匿名类是在他们实例化的时候声明的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内部类 匿名类