java四种内部类详解

一般来说,有4中内部类:常规内部类、静态内部类、局部内部类、匿名内部类。

一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中。
  1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法。
  2.在常规内部类中可以直接用内部类创建对象
  3.代码如下:

public class MyOuter {
 private int x = 100;

// 创建内部类
 class MyInner {
  private String y = "Hello!";

public void innerMethod() {
   System.out.println("内部类中 String =" + y);
   System.out.println("外部类中的x =" + x);// 直接访问外部类中的实例变量x
   outerMethod();

System.out.println("x is" + MyOuter.this.x);
  }

}

public void outerMethod() {
  x++;

}

public void makeInner() {
//在外部类方法中创建内部类实例
  MyInner in = new MyInner();
 }

/**
  * @param args
  */
 public static void main(String[] args) {

MyOuter mo = new MyOuter();
  // 使用外部类构造方法创建mo对象
  MyOuter.MyInner inner = mo.new MyInner();//常规内部类需要通过外部类的实例才能创建对象,与实例变量需要通过对象来访问相似
  // 创建inner对象
  inner.innerMethod();
  // TODO Auto-generated method stub

}

}
  4.运行结果:
  
    内部类中 String =Hello!
    外部类中的x =100
    x is101

二.静态内部类:与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。静态内部类与静态内部方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量,与实例方法,只有通过对象引用才能访问。
  3.由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,但是可以访问外部类中的static成员。这与一般类的static方法想通
  4.实例代码:

public class Java05 {

     public static  int x=100;

     public static class MyInner{
         private String y="Hello!";
         public void innerMethod(){
             System.out.println("x="+x);
             System.out.println("y="+y);
         }
     }

     public static void main(String[] args) {
          Java05.MyInner si=new Java05.MyInner();//静态内部类不通过外部实例就可以创建对象;与类变量可以通过类名访问相似
          si.innerMethod();
          // TODO Auto-generated method stub

         }
}

三.局部内部类:在方法体或语句块(包括方法、构造方法、局部块或静态初始化块)内部定义的类成为局部内部类。
  局部内部类不能加任何访问修饰符,因为它只对局部块有效。
  1.局部内部类只在方法体中有效,就想定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象
  2.在方法内部定义类时,应注意以下问题:
   1.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和   abstract修饰
   2.方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问。
   3.static方法中定义的内部类可以访问外部类定义的static成员

四.匿名内部类:定义类的最终目的是创建一个类的实例,但是如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创建一个类
  以这种方法定义的没有名字的类成为匿名内部类。
   声明和构造匿名内部类的一般格式如下:
   new ClassOrInterfaceName(){

/*类体*/ }

1.匿名内部类可以继承一个类或实现一个接口,这里的ClassOrInterfaceName是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是Object类的直接子类,匿名类继承一个类或实现一个接口,不需要extends和implements关键字。
  
   2.由于匿名内部类没有名称,所以类体中不能定义构造方法,由于不知道类名也不能使用关键字来创建该类的实例。实际上匿名内部类的定义、构造、和第一次使用都发生在同样一个地方。此外,上式是一个表达式,返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量。例:

TypeName obj=new Name(){

/*此处为类体*/
      }
  同样,也可以将构造的对象作为调用的参数。例:
   
   someMethod(new Name(){
   /*此处为类体*/  });

3.程序代码:
  public class NiMing {
 private int size=5;
 public Object makeInner(int localVar){
  final int finalLocalVar=localVar;
  return new Object(){
   //使用匿名内部类
   public String toString(){
    return "OuterSize="+size+"\nfinalLocalVar="+finalLocalVar;
    
    
   }
   
   
  };
  
  
 }

/**
  * @param args
  */
public static void main(String args[])
 {
 Object obj=new NiMing().makeInner(47);
 System.out.println(obj.toString());
 
 
 
 }

}
 4.程序运行结果:
   OuterSize=5
   finalLocalVar=47

时间: 2024-08-10 02:10:52

java四种内部类详解的相关文章

java 四种内部类的学习

内部类 定义在外部类的内部, 编译后是独立存在的类 可以访问外部类的私有成员,且不破坏封装 成员内部类 用"外部类类名.this"访问外部类的当前对象 创建对象:先创建外部类对象,再通过"外部类对象.new 内部类类名"创建内部类对象 静态内部类 只能访问外部类的静态成员 创建对象:直接用"new 外部类类名.内部类类名()" 局部内部类 定义在外部类的方法内部 作用范围:从定义开始到所在的代码块结束 同局部变量 不仅可以访问外部类的成员,还可以

Android中点击事件的四种写法详解

Android中点击事件的四种写法使用内部类实现点击事件使用匿名内部类实现点击事件让MainActivity实现View.OnClickListener接口通过布局文件中控件的属性 第一种方法:使用内部类基本步骤如下: 新建一个MyOnClickListener类并实现View.OnClickListener接口 重写View.OnClickListener接口中的OnClick(View view)方法 给Button绑定一个监听器,并监听一个点击事件示例代码如下: public class

LVS三种模式及常见的四种调度算法详解

LVS三种工作模式: 1. Virtual server via NAT(VS-NAT) 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配Internet的保留私有地址,只有负载均衡器需要一个合法的IP地址. 缺点:扩展性有限.当服务器节点(普通PC服务器)数据增长到20个或更多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包都需要经过负载均衡器再生.假使TCP包的平均长度是536字节的话,平均包再生延迟时间大约为60us(在Pentium处理器上计算

PHP页面间参数传递的四种方法详解

2016-04-16 定义page01.php和page02.php两个php文件,将page01中的内容想办法传递到page02,然后供我们继续使用.--------------------------------------------------------------------------------第一种:使用客户端浏览器的cookie.cookie很容易理解,就是一个临时文件,可以把它看成一个储藏室,浏览器在浏览的过程中记录一些信息,就暂时存放在这里.在page01中设置一个coo

AES加密的四种模式详解

对称加密和分组加密中的四种模式(ECB.CBC.CFB.OFB) 一. AES对称加密:                                                       AES加密                          分组 二. 分组密码的填充                                                    分组密码的填充 e.g.:                                          

单元测试实战(四种覆盖详解、测试实例)

理论部分 前言 单元测试,就是对某一段细粒度的Java代码的逻辑测试.代码块一般指一个Java 方法本身,所有外部依赖都需要mock掉,仅关注代码逻辑本身. 需要注意,单测的一个大前提就是需要清楚的知道自己要测试的程序块所预期的输入输出,然后根据这个预期和程序逻辑来书写case. (这里需要注意的就是单测的预期结果 一定要针对需求/设计逻辑去写,而不是针对实现去写,否则单测将毫无意义,照着错误的实现设计出的case也很可能是错的) 覆盖类型 1.行覆盖 Statement Coverage 行覆

java 四种内部类

/** * 常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. * 1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法. * 2.在常规内部类中可以直接用内部类创建对象 */ public class MyOuter { private int x = 100; class MyInner{ private String y="Hello!"; public void innerMethod(){ System.out.println("内部类中

[转] Java内部类详解

作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.

Java内部类详解 2

Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811