`

Java核心类库:内部类那点事儿

    博客分类:
  • j2se
 
阅读更多
内部类:定义在类的内部的类

为什么需要内部类?

典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。
java中的内部类和接口加在一起,可以实现多继承。
可以使某些编码根简洁。
隐藏你不想让别人知道的操作。
使用内部类最吸引人的原因是:

每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。

内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。

特点:

一、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。

二、内部类可以直接或利用引用访问外部类的属性和方法,包括私有属性和方法(但静态内部类不能访问外部类的非静态成员变量和方法)。内部类所访问的外部属性的值由构造时的外部类对象决定。

三、而外部类要访问内部类的成员,则只能通过引用的方式进行,可问内部类所有成员

四、访问机制:

System.out.println(this.x);或System.out.println(x);//内部类访问内部类的成员变量或成员方法可用此方法。   System.out.println(OuterClass.this.x);//内部类访问外部类的同名变量时可用此方法,如果没有同名可用System.out.println(x); 五、内部类可以使用任意的范围限定:public/private/protected class InnerClass,且严格按照这几种访问权限来控制内部类能使用的范围。普通类的范围限定只可以是public或者不加。

六、内部类的命名不允许与外部类 重名,内部类可以继承同级的内部类,也可继承其它类(除内部类和外部类)。

七、内部类可以定义为接口,并且可以定义另外一个类来实现它

八、内部类可以定义为抽象类,可以定义另外一个内部类继承它

九、内部类使用static修饰,自动升级为顶级类,外部类不可以用static修饰,用OuterClass.InnerClass inner=new OuterClass.InnerClass();创建实例。内部类还可定义为final.

十、内部类可以再定义内部类(基本不用)

十一、方法内的内部类:

方法内的内部类不能加范围限定(protected public private)
方法内的内部类不能加static修饰符
方法内的内部类只能在方法内构建其实例
方法内的内部类如果访问方法局部变量,则此局部变量必须使用final修饰
1)静态内部类(静态嵌套类)

从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。

静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的成员和方法。

语法

package com.tarena.day13;   import com.tarena.day13.Foo.Koo;  /**   * 静态类内部语法演示   */ public class StaticInner {   public static void main(String[] args) {    Koo koo = new Koo();    System.out.println(koo.add());//4   }   }  class Foo{   int a = 1;   static int b = 3;   /** 静态内部类,作用域类似于静态变量,属于类的 */  static class Koo{    public int add(){     //a ,不能访问a     return b+1;    }   }  } 2)成员内部类

* 1 成员内部类必须利用外部类实例创建

* 2 成员内部类可以共享外部类的实例变量

import com.tarena.day13.inn.Goo.Moo;   public class InnerClassDemo {   public static void main(String[] args) {    //Moo moo = new Moo(); //编译错误,必须创建Goo的实例    Goo goo = new Goo();    Moo moo = goo.new Moo();//利用goo实例创建Moo实例    Moo moo1 = goo.new Moo();    //moo和moo1共享同一个goo实例的实例变量    System.out.println(moo.add());//2    System.out.println(moo1.add());//2    Goo goo1 = new Goo();    goo1.a = 8;    Moo m1 = goo1.new Moo();    Moo m2 = goo1.new Moo();    System.out.println(m1.add());//9    System.out.println(m2.add());//9       }  }  class Goo{   int a = 1;   /**成员内部类*/  class Moo{    public int add(){     return a+1;    }   }  } 3)局部内部类(方法内部类)

(1) 方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

(2) 方法内部类对象不能使用该内部类所在方法的非final局部变量。

因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。用法

package com.tarena.day13.inn;   import java.util.Comparator;   /**   * 局部内部类   */ public class LocalInnerClassDemo {   public static void main(String[] args) {    int a = 5;    final int b = 5;    //局部内部类,定义在方法内部,作用域类似于局部变量    //仅仅在方法内部可见    //在局部内部类中可以访问方法中的局部final变量    class Foo{     public int add(){      return  b;//正确      //return a;//编译错误     }    }        Foo foo = new Foo();    //临时的自定义比较规则    class ByLength implements Comparator<String>{     public int compare(String o1,String o2){      return o1.length()-o2.length();     }    }   }   } 4)匿名内部类

顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。

匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
只用到类的一个实例。

类在定义后马上用到。
类非常小(SUN推荐是在4行代码以下)
给类命名并不会导致你的代码更容易被理解
在使用匿名内部类时,要记住以下几个原则:

匿名内部类不能有构造方法。
匿名内部类不能定义任何静态成员、方法和类。
匿名内部类不能是public,protected,private,static。
只能创建匿名内部类的一个实例。
一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
A、继承式的匿名内部类和接口式的匿名内部类。

import java.util.Arrays;  import java.util.Comparator;   /**匿名内部类 语法*/ public class AnnInnerClass {    public static void main(String[] args) {    // TODO Auto-generated method stub    Yoo yoo = new Yoo();//创建Yoo的实例    Yoo y1 = new Yoo(){};    //new Yoo(){}创建匿名类实例    //匿名类new Yoo(){}是继承Yoo类,并且同时创建了对象    //new Yoo(){}是Yoo的子类型,其中{}是类体(class Body)    //类体中可以定义任何类内的语法,如:属性,方法,方法重载,方法覆盖,等    //子类型没有名字,所以叫匿名类!    Yoo y2 = new Yoo(){     public String toString(){//方法重写(覆盖)      return "y2"; //y2是子类的实例     }    };    System.out.println(y2);//"y2",调用了匿名类对象toString()    //匿名内部类可以继承/实现 于 类,抽象类,接口等    //按照继承的语法,子类型必须实现所有的抽象方法        //Xoo x = new Xoo(){};//编译错误,没有实现方法    final int b = 5;    Xoo xoo = new Xoo(){ //是实现接口,并且创建匿名类实例,不是创建接口对象     public int add(int a){//实现接口中的抽象方法      return a+b; //要访问局部变量b,只能访问final变量     }    };    System.out.println(xoo.add(5));//10,调用对象的方法    //Comparator接口也可以使用匿名类的方式    Comparator<String> byLength = new Comparator<String>(){     public int compare(String o1,String o2){      return o1.length()-o2.length();           }    };    String[] names = {"Andy","Tom","Jerry"};    Arrays.sort(names,byLength);    System.out.println(Arrays.toString(names));    //也可以这样写,工作中常用    Arrays.sort(names,new Comparator<String>(){     public int compare(String o1,String o2){      return o1.length()-o2.length();     }    });   }   } 接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。


B. 参数式的匿名内部类。

class Bar{       void doStuff(Foo f){       }   }   interface Foo{       void foo();   }   class Test{     static void go(){         Bar b = new Bar();         b.doStuff(new Foo(){             public void foo(){                 System.out.println("foofy");             }         });    }   } 构造内部类对象的方法有:

1、内部类在自己所处的外部类的静态方法内构建对象或在另一个类里构造对象时应用如下形式:

(1)

OuterClass out = new OuterClass();  OuterClass.InnerClass in = out.new InnerClass(); (2)

OuterClass.InnerClass in=new OuterClass().new InnerClass(); 其中OuterClass是外部类,InnerClass是内部类。

2、内部类在它所在的外部类的非静态方法里或定义为外部类的成员变量时,则可用以下方式来构造对象:

InnerClass in = new InnerClass(); 3、如果内部类为静态类,则可用如下形式来构造函数:

OuterClass.InnerClass in = new OuterClass.InnerClass(); 无需再利用外部类的对象来来构造内部类对象,如果静态内部类需要在静态方法或其它类中构造对象就必须用上面的方式来初始化。

原文链接:http://www.cnblogs.com/hqr9313/archive/2012/04/16/2452906.html

分享到:
评论

相关推荐

    java核心类库使用大全

    Java核心类库是Java编程语言的核心组成部分,包含了丰富的API(应用程序接口)和工具,使得开发者能够构建各种类型的应用程序,从简单的控制台程序到复杂的分布式系统。这份"java核心类库使用大全"深入探讨了Java ...

    netMarketing类库:欧姆龙plc rs232通讯类演示

    C# netMarketing类库:欧姆龙plc rs232通讯类演示 netMarkting类库可以直接在vs中使用nuget下载安装,完全免费使用,它是勇哥在工业自动化行业多年的积累。 netMarkting类库官方说明页:...

    Java类库下载Q

    1. 核心类库:这是Java平台的基础,包括如`java.lang`、`java.util`和`java.io`等包,提供了基本的数据类型、集合框架、输入/输出操作以及字符串处理等功能。 2. 网络类库:如`java.net`包,提供了网络通信的相关...

    Category类库:php无限分类类库.zip

    Category类库的核心功能可能包括以下几点: 1. **创建分类**:允许用户添加新的分类,并指定其父分类,从而构建出层级结构。 2. **获取分类树**:能够以数组或者JSON格式返回整个分类树,方便在前端展示或进行其他...

    E4A 开发类库:DLNA投屏类库,复制到libs目录即可生效

    **E4A 开发类库:DLNA投屏类库** E4A(Easy4App)是一种基于Java语言的移动应用开发工具,主要用于快速构建Android应用程序。它简化了编程过程,使得非专业程序员也能轻松上手。在E4A中,类库扮演着至关重要的角色...

    java类库java类库.doc

    本文档主要介绍 Java 类库的结构和使用方法,涵盖了 Java 中一些常用的包和类,例如 java.lang、java.awt、java.io 等。同时,也介绍了 String 类和 StringBuffer 类的使用方法。 Java 类库是 Java API 的一部分,...

    java2类库 java类库的源文件

    Java 类库是 Java 语言的核心组成部分,它包含了各种预定义的类和接口,为开发者提供了丰富的功能和工具,使得编写程序变得更加便捷。源文件(.java 文件)是这些类库的原始代码,允许开发者深入理解类库的工作原理...

    Java标准类库PDF

    在Java标准类库中,`java.lang`包是非常核心的部分之一,它包含了运行Java程序所必需的一些基本类,例如`Object`类、基本数据类型的包装类以及其他一些常用类如`System`、`Runtime`和`Math`等。 #### 二、基本数据...

    Java2 类库 Java2 类库

    4. **多线程**:Java2类库支持多线程编程,Thread类和Runnable接口是实现多线程的基础。通过继承Thread或实现Runnable,可以创建并运行多个并发执行的任务。 5. **网络编程**:Java提供了Socket和ServerSocket类,...

    VC++和BC++数值分析类库:VC++和BC++数值分析类库

    VC++和BC++数值分析类库:VC++和BC++数值分析类库

    学习java开发应该了解的几个常用的基本核心类库

    在Java开发中,掌握一些常用的核心类库是至关重要的,这些类库提供了丰富的功能,能够极大地提高开发效率和代码质量。以下将详细讲解几个在Java开发中不可或缺的基础核心类库。 1. **Java.lang**: 这是Java中最基础...

    Java核心类库.png

    java核心类库的知识点,包括字符串,网络编程,IO流,异常处理等等。比如StringBuilder,StringBuffer,BufferedOutputSream,BufferedInputStream等

    5.java系统类库.zip

    5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5.java系统类库.zip5....

    Java类库中文手册

    2. **集合框架**:Java集合框架是处理对象集合的核心工具,包括`List`、`Set`和`Map`接口,以及实现这些接口的类如`ArrayList`、`HashSet`和`HashMap`。它们为数据存储、排序、遍历等提供了高效且灵活的方法。 3. *...

    java常用类库手册

    - **java.lang.\***:Java编程语言的基本类库。 - **java.math.\***:提供了整数算术和十进制算术的基本函数。 - **java.rmi**:提供了与远程方法调用相关的所有类。 - **java.net**:提供了用于实现网络通信应用的...

    031102_【第11章:Java常用类库】_Runtime类笔记

    031102_【第11章:Java常用类库】_Runtime类笔记

    Java2 类库详解

    8. **多线程**:Java2类库提供了Thread类和Runnable接口,以及synchronized关键字和wait/notify机制,使开发者能够方便地实现并发编程。 9. **安全性**:Java的沙箱模型和安全类库为应用提供了安全保障。如Access...

    java常用类库java常用类库java常用类库

    Java常用类库是Java编程语言的核心组成部分,它们提供了一系列预定义的类和接口,使得开发者可以方便地进行各种常见任务的处理,而无需从零开始编写所有代码。这些类库覆盖了输入输出、网络通信、数据处理、集合框架...

Global site tag (gtag.js) - Google Analytics