Java 面向对象/Java 接口
在java中,可以在另一个类中定义一个类,这些类称为嵌套类。它们使您能够对仅在一个地方使用的类进行逻辑分组,从而增加封装的使用,并创建更具可读性和可维护性的代码。
嵌套类的范围受其封闭类的范围限制。因此,在上面的例子中,类NestedClass并不独立类的存在在OuterClass。
嵌套类可以访问嵌套类的成员,包括私有成员。然而,反向并不正确,即封闭类不能访问嵌套类的成员。
嵌套类也是其封闭类的成员。
作为其封闭类的成员,嵌套类可以声明为private,public,protected或package private(默认)。
嵌套类分为两类:
静态嵌套类:被声明为嵌套类的静态被称为静态嵌套类。
内部类:内部类是非静态嵌套类。
句法:
class OuterClass
{
...
class NestedClass
{
...
}
}
静态嵌套类
与类方法和变量一样,静态嵌套类与其外部类相关联。像静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们。
他们使用封闭的类名访问。
OuterClass.StaticNestedClass
例如,要为静态嵌套类创建对象,请使用以下语法:
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
// Java program to demonstrate accessing
// a static nested class
// outer class
class OuterClass
{
// static member
static int outer_x = 10;
// instance(non-static) member
int outer_y = 20;
// private member
private static int outer_private = 30;
// static nested class
static class StaticNestedClass
{
void display()
{
// can access static member of outer class
System.out.println("outer_x = " + outer_x);
// can access display private static member of outer class
System.out.println("outer_private = " + outer_private);
// The following statement will give compilation error
// as static nested class cannot directly access non-static membera
// System.out.println("outer_y = " + outer_y);
}
}
}
// Driver class
public class StaticNestedClassDemo
{
public static void main(String[] args)
{
// accessing a static nested class
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
nestedObject.display();
}
}
输出:
outer_x = 10
outer_private = 30
内部类
要实例化一个内部类,你必须首先实例化外部类。然后,使用以下语法在外部对象内创建内部对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
有两种特殊的内部类:
本地内部类
匿名内部类
// Java program to demonstrate accessing
// a inner class
// outer class
class OuterClass
{
// static member
static int outer_x = 10;
// instance(non-static) member
int outer_y = 20;
// private member
private int outer_private = 30;
// inner class
class InnerClass
{
void display()
{
// can access static member of outer class
System.out.println("outer_x = " + outer_x);
// can also access non-static member of outer class
System.out.println("outer_y = " + outer_y);
// can also access private member of outer class
System.out.println("outer_private = " + outer_private);
}
}
}
// Driver class
public class InnerClassDemo
{
public static void main(String[] args)
{
// accessing an inner class
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
innerObject.display();
}
}
输出:
outer_x = 10
outer_y = 20
outer_private = 30
静态和内部(非静态嵌套)类之间的区别
静态嵌套类不直接访问封闭类的其他成员(非静态变量和方法),因为它是静态的,它必须通过对象访问封闭类的非静态成员。也就是说,它不能直接引用其封闭类的非静态成员。由于这个限制,很少使用静态嵌套类。
非静态嵌套类(内部类)可以访问其外部类的所有成员(静态变量和非静态变量和方法,包括私有变量),并且可以直接以与外部其他非静态成员相同的方式引用它们上课做。