内部类

来源:互联网 发布:机械行业erp软件哪家好 编辑:程序博客网 时间:2024/06/05 12:04
将一个类的定义放在另一个类的内部,称为内部类。编写一个名为outer的外部类,它包含一个Inner内部类。在outer中添加一个方法他返回inner类型对象。在main中创建并初始化一个指向inner的引用。程序编译后,会产生两个class文件,分别是Outer.class和Outer$Inner.class,其中$代表了下面程序中Outer.Inner中的那个。Outer.Inner inner2=outer.new Inner();可以用来产生内部类对象,需要注意两点:1.开头的Outer是为了标明需要生成的内部类对象在哪个外部类中2.必须先有外部类对象才能生成内部类对象,因为内部类的作用就是为了访问外部类中的成员变量package com.htxx.action.business;public class Outer {   class Inner{      }   Inner getInner(){   return new Inner();   }   public static void main(String[] args) {Outer outer=new Outer();Inner inner=outer.getInner();//Inner inner2=new Inner();  Inner inner2=outer.new Inner();  Outer.Inner inner2=outer.new Inner();}}当生成一个内部类对象,此对象与生成他的外部类对象产生某种联系,使得内部类对象可以访问外部类的成员变量。package com.htxx.action.business;public class Outer {private String hello="555";   class Inner{   private String hello="444";   void say(){   String hello="333";   System.out.println(hello);   System.out.println(this.hello);   System.out.println(Outer.this.hello);   }   }   Inner getInner(){   return new Inner();   }   void say(){   System.out.println("hello");   }   public static void main(String[] args) {Outer outer=new Outer();Inner inner=outer.getInner();//Inner inner2=new Inner();Outer.Inner inner2=outer.new Inner();//inner2.say//不能访问外部类成员函数inner2.say();}}  输出结果:333 444 555内部类想生成对外部类对象的引用,可以使用外部类的名字.this;package com.htxx.action.business;public class Outer {private String hello="555";   class Inner{   private String hello="444";   void say(){   String hello="333";   System.out.println(hello);   System.out.println(this.hello);   System.out.println(Outer.this.hello);   }   Outer getOuter(){   return Outer.this;   }   }   void say(){   System.out.println("hello");   }   public static void main(String[] args) {Outer outer=new Outer();//Inner inner2=new Inner();Outer.Inner inner2=outer.new Inner();inner2.getOuter().say();}}在未拥有外部类对象时,是不能创建内部类对象的。这是因为内部类对象会暗暗连接到创建他的外部类对象。但是如果你创建的是嵌套类(静态内部类),那么他不需要外部对象的引用。package com.htxx.action.business;class Outer{static class Inner{void say(){System.out.println("hello");}}Inner getInner(){return new Inner();}}public class A {public static void main(String[] args) {      Outer.Inner inner=new Outer.Inner();      inner.say();}}创建一个包含内部类的类,在另一个独立的类内,创建此内部类实例。package com.htxx.action.business;import com.htxx.action.business.Outer.Inner;class Outer{class Inner{void say(){System.out.println("hello");}}}public class A {public static void main(String[] args) {    Outer outer=new Outer();    Outer.Inner inner=outer.new Inner();    inner.say();}}私有内部类:这时只能由外部类操作package com.htxx.action.business;import javassist.runtime.Inner;//import com.htxx.action.business.Outer.Inner;class Outer{private class Inner{void say(){System.out.println("helloa ");}}void getInner(){ new Inner().say();}}public class A {public static void main(String[] args) {    Outer outer=new Outer();    //因为是private,对于非外部类是不可见的    Outer.Inner inner=outer.new Inner();    inner.say();    //The type Outer.Inner is not visible    Outer.Inner inner2=outer.getInner();  //The type Outer.Inner is not visible    outer.getInner();//外部类调用方法使用内部类}}在方法和作用域内的内部类(在定义该内部类域以外,内部类是不可用的):package com.htxx.action.business;import com.sun.swing.internal.plaf.basic.resources.basic;public class A {    void sayA(){    class B{    void sayB(){    System.out.println("haha");    }    }    B b=new B();    b.sayB();    }    public static void main(String[] args) {A a=new A();A.B b=b.new B();//A.B cannot be resolved to a type}}创建一个至少有一个方法的接口。在某个方法内定义内部类实现该接口,这个方法返回对此接口的引用。package com.htxx.action.business;interface JieKou{void m1();}public class A {JieKou sayA(){    class B implements JieKou{@Overridepublic void m1() {// TODO Auto-generated method stubSystem.out.println("m1");}     }    return new B();    }    public static void main(String[] args) {}}重复前一个练习,但将内部类定义在某一个方法的作用域内。package com.htxx.action.business;interface JieKou{void m1();}public class A {void sayA(){if(2>1){    class B implements JieKou{@Overridepublic void m1() {// TODO Auto-generated method stubSystem.out.println("m1");}     }    B b= new B();    b.m1();}        }    public static void main(String[] args) {       A a =new A();       a.sayA();}}匿名内部类:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.htmlhttp://blog.sina.com.cn/s/blog_62ea4cf40100mubj.html接口内部的类:正常情况下,不能再接口内部防止任何代码,但是嵌套类可以作为接口的一部分。放到接口中的任何类自动是public和static的。因为类是static的,只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。甚至可以再内部类中实现外围接口。创建一个包含嵌套类的接口,实现此接口并创建嵌套类的实例。package com.htxx.action.business;public interface Inter1 {void say();    static class SAS implements Inter1{@Overridepublic void say() {// TODO Auto-generated method stubSystem.out.println("111");}    public static void main(String[] args) {new SAS().say();}  }  }-----------------------------------------参考文档-----------------------------http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html


 
原创粉丝点击