`

总结---内部类

    博客分类:
  • java
阅读更多

昨天上课毕老师讲到了匿名内部类,很多哥们都懵了,一点不奇怪,引用老师的话:“任何人第一次接触匿名内部类都是懵的,因为他没见过这种形式。”我以前刚开始学习java接触到内部类和匿名内部类的时候很惆怅,苦于没有老师,只能上网去查资料、翻书,很长时间才明白个大概。我这里就把我理解的内部类的情况总结了一下,可能不是很全面或者有什么错误的地方,希望大家能补充或指正。

     在Java中定义在其他类内部的类叫内部类或者嵌入类。内部类分为成员内部类,静态内部类,局部内部类,匿名内部类。大家可以把静态内部类当做静态属性来看,成员内部类当做成员属性来看,只不过它们同时具备类的特性,而且可以访问外部类的私有成员。

成员内部类:

特点:可以访问外部类所有成员,相比较外部类只有public和默认的修饰符不同,内部类作为一个成员,可以被任意修饰符修饰。

例:

//当我们在外部类,内部类,内部类的方法中定义了相同名称的变量时,如何知道你要访问的是哪个变量?(内部类中的注释部分)

//如何实例化内部类调用内部类的方法 1.(注释部分) 2. 在外部类的外面直接创建内部类的实例然后调用内部类方法,要注意格式(main方法中未注释部分)

class Outer {
         private int i = 1;
         class Inner {
                  private int i = 2;
                  public void show() {
                  int i = 3;
                  System.out.println(i);                  // 得到的是方法内的i
                  System.out.println(this.i);           // 使用this,得到的是内部类的i

                  System.out.println(Outer.this.i); //使用外部类名.this,得到的是外部类的i
                  }
           }
    /*public void innerMethod() {            //在外部类中创建内部类对象调用方法,并提供方法供外部调用
                  Inner in = new Inner();
                  in.show();
       }*/
}

public class Test {
         public static void main(String[] args) {
               /*Outer out = new Outer();    //创建外部类的实例
                  out.innerMethod();*/           

                  Outer out = new Outer();    //创建外部类的实例
                  Outer.Inner in = out.new Inner();  //创建内部类实例
                  in.show();                                  //调用内部类方法
          }
}
 

静态内部类:

特点:在定义成员内部类的时候可以在类前面加static将类定义成静态的,静态内部类只能访问外部类的静态成员,只有在静态内部类中才能定义静态的变量和方法,静态内部类实例化的时候不必先实例化外围类,可以直接实例化内部类。拿上面例子来说: 静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通过生成外部类对象来生成。

 

局部内部类(在方法和作用域内的类):

特点:只在局部有效,可以访问外部类的所有成员变量,但是只能访问内部类所在作用域用final修饰的变量。(为什么呢?final修饰的变量在内存中只有一份,生命周期较长,普通的局部变量在代码块执行完毕后就会被当成垃圾回收,而内部类的不会消失)静态方法中的局部内部类只能访问外围类的静态成员,访问不了非静态成员。当我们要解决一个复杂的问题,需要一个类来辅助我们的解决方案,但又不希望这个类是公共可用的时候就用到局部内部类。由于局部内部类只在局部有效,所以不能在外面用局部内部类的引用指向局部内部类的对象,只能用局部内部类实现接口并创建局部内部类对象,在外面用接口引用指向局部内部类对象。

例(From Thinking in java):

public class Test {
          public Destination dest(String s){
                  class PDestination implements Destination{
                         private String label;
                         private PDestination(String label){
                                   this.label = label;
                         }
                         public String readLabel(){
                         return label;
                         }
                  }
                   return new PDestination(s);
                 }
 public static void main(String[] args) {
                 Test t = new Test();
                 Destination d = t.dest("Tanzania");
   }
}
interface Destination{
                 String readLabel();
}

 

匿名内部类:

特点:是内部类的一种简化写法,使用匿名内部类的前提是内部类可以继承一个外部类或者实现一个接口,必须实现父类或者接口中的所有抽象方法。可以简单理解为:建立一个带内容的外部类或者接口的匿名对象,目的是是为了方便阅读。

例:

public class Outer {
         public static void main(String[] args) {
                  new Outer().method(new OneClass() {
                       public void show() {
                             System.out.println("哈哈");
                       }
                  });
          }

              public void method(OneClass o) {
                 o.show();
              }
         }

}

abstract class OneClass {
         abstract public void show();
}

另外需要注意的是:

成员内部类编译后生成的.class文件名称格式是<外部类类名>$<内部类类名>。

静态内部类编译后生成的.class文件名称格式是<外部类类名>$<静态内部类类名>。

局部内部类编译后生成的.class文件名称格式是<外部类类名>$<x><内部类类名>  x是该局部的第几个内部类
匿名内部类编译后生成的.class文件名称格式是<外部类类名>$<x>   x是该类的第几个匿名内部类。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuxiaolei7676/archive/2010/03/31/5437041.aspx

分享到:
评论

相关推荐

    java语言--内部类总结

    《Java语言——内部类详解》 内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以提供更复杂的封装,使得代码结构更加清晰,同时还能访问外部类的私有成员,提供了更高级别...

    总结----c++类

    ### C++类的相关知识点 ...通过上述知识点的总结,我们可以看到C++中的类提供了强大的封装机制,使得我们能够更好地组织代码,并通过各种成员和属性来管理对象的状态和行为。这对于构建复杂的应用程序非常有用。

    Java内部类总结

    ### Java内部类总结 在Java编程语言中,内部类是一个重要的概念,它允许开发者在一个类的内部定义另一个类。这种特性极大地增强了代码的封装性和复用性,同时也为解决特定问题提供了灵活的方法。本文将围绕Java内部...

    170331-01.匿名内部类总结.java

    170331-01.匿名内部类总结.java 170331-01.匿名内部类总结.java 匿名 内部类 总结 java

    面试题总结---javaSE--适用于初学者

    本文将深入解析“面试题总结---javaSE--适用于初学者”这一主题,旨在为初学者提供宝贵的复习资料。 1. **Java基础** - **数据类型**:Java分为基本数据类型(如int、char、boolean等)和引用数据类型(类、接口、...

    总结-Milo1

    - 静态内部类:如果你希望内部类能独立于外部类实例存在,或者需要在不创建外部类对象的情况下创建内部类对象,应使用静态内部类。 - 匿名内部类:当需要快速实现一个简单的接口或父类时,可以使用匿名内部类,...

    java内部类使用总结

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类提供了增强封装的能力,使得内部类可以被隐藏在外部类中,仅对外部类可见,从而增加了代码的隐私性和安全性。同时,内部...

    java中的内部类总结

    Java 中的内部类是面向对象编程的一个重要特性,它允许在一个类的定义内部定义另一个类。内部类的主要优点是能够方便地访问外部类的私有成员,提供了更封装的代码组织方式,以及创建特定上下文的类实例。下面将详细...

    j2se总结-一个学习java的总结笔记j2se部分

    - 内部类可以访问外部类的所有成员变量(包括私有成员)。 - 内部类的一个实例与其外部类的实例有着内在的联系。 - 内部类可以在外部类的方法内部定义。 2. **匿名内部类**: - 是一种没有名字的内部类。 - ...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    - 内部类:在类内部定义的类,包括成员内部类、局部内部类、匿名内部类等。 - 集合框架:如ArrayList、Vector、LinkedList、HashSet、TreeSet、LinkedHashSet、HashMap等,用于存储和操作对象。 - 泛型:提供类型...

    ios开发--Objective-C 基础总结-(重点已标识)

    总的来说,这篇总结涵盖了 Objective-C 的基本要素,包括面向对象的概念、封装的实现、类与对象的定义、对象的创建和使用,以及方法的声明和调用。对于想要学习 iOS 开发的初学者来说,这是很好的起点,能够帮助他们...

    java oop总结-编程程序

    ### Java OOP 总结与理解 #### 一、面向对象基本概念 在 Java 面向对象(Object-Oriented Programming, OOP)编程中,我们主要关注以下几个核心概念:类(Class)、对象(Object)、封装(Encapsulation)、继承...

    day03-内部类&API1

    总结来说,本内容主要探讨了Java中类、抽象类和接口在方法参数和返回值中的使用,以及内部类的概念和基本应用。这些知识是理解和编写面向对象程序的基础,它们让代码更具灵活性和可扩展性,同时也强化了面向接口编程...

    java综合知识点总结-必背.zip

    这份“java综合知识点总结-必背.zip”文件很可能是为了帮助Java学习者或开发者整理和回顾核心概念,以便深入理解和应用。以下是根据标题和描述可能包含的一些关键知识点的详细解释: 1. **基础语法**: - 变量:...

    Java知识总结-完整版

    ### Java知识总结——关键知识点详解 #### 一、Java概述 - **面向对象特性**:Java是一种完全面向对象的编程语言,它继承了C++的一些面向对象特性,并且简化了一些复杂的概念,如去掉了指针操作,使得程序更加安全...

    内部类总结

    ### 内部类总结 #### 一、内部类概述及分类 **内部类**是Java中一种特殊类的形式,它可以嵌套在另一个类的内部。根据内部类所在的上下文环境不同,可以将其分为多种类型: 1. **成员内部类**(最常见的一种内部类...

    java 静态内部类的使用规范

    总结,Java的静态内部类提供了更灵活的类组织方式,同时具备独立实例化的能力。理解并掌握其使用规范,有助于编写出结构清晰、易于维护的代码。在实际编程中,应根据需求选择合适的内部类类型,以实现最佳的代码设计...

    Java内部类语法总结.pdf

    在Java编程语言中,内部类是一个强大的特性,它允许我们在一个类的定义内部定义另一个类。内部类提供了更高级别的封装,并且可以访问外部类的所有成员,包括私有成员,这使得它们在处理复杂问题时非常有用。以下是...

Global site tag (gtag.js) - Google Analytics