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

java-基础-【二】内部类与静态内部类

2017-04-25 10:02 176 查看
一、说明

  java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。

名称非静态内部类静态内部类
对外部类的引用需要持有对外部类的引用不需要有指向外部类的引用
对外部类的成员能够访问外部类的静态和非静态成员不能访问外部类的非静态成员

他只能访问外部类的静态成员

创建不能脱离外部类实体被创建

可以访问外部类的数据和方法,因为他就在外部类里面

OuterClass outerClass = new OuterClass();

OuterClass.InnerClass innerClass = outerClass .new InnerClass ();

OuterClass.InnerClass a = new OuterClass.InnerClass();
使用场景成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。

方便一个类对外提供一个公共接口的实现是成员类的典型应用。

以JDK Collection类库为例,每种Collection类必须提供一个与其对应

的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。

每种Collection类的Iterator实现就被定义为该Collection类的成员类。

例如JDK中AbstractList类的代码片断:

public class LinkedList<E> extends AbstractSequentialList<E>
…;
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;

Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
…;
}


View Code
显然,Entry用来表示LinkedList中的一个结点,只被LinkedList自身使用。

示例:

/* 下面程序演示如何在java中创建静态内部类和非静态内部类 */
class OuterClass{
private static String msg = "GeeksForGeeks";
// 静态内部类
public static class NestedStaticClass{
// 静态内部类只能访问外部类的静态成员
public void printMessage() {
// 试着将msg改成非静态的,这将导致编译错误
System.out.println("Message from nested static class: " + msg);
}
}
// 非静态内部类
public class InnerClass{
// 不管是静态方法还是非静态方法都可以在非静态内部类中访问
public void display(){
System.out.println("Message from non-static nested class: "+ msg);
}
}
}
class Main
{
// 怎么创建静态内部类和非静态内部类的实例
public static void main(String args[]){
// 创建静态内部类的实例
OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
// 创建静态内部类的非静态方法
printer.printMessage();
// 为了创建非静态内部类,我们需要外部类的实例
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
// 调用非静态内部类的非静态方法
inner.display();
// 我们也可以结合以上步骤,一步创建的内部类实例
OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
// 同样我们现在可以调用内部类方法
innerObject.display();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: