- 浏览: 458208 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- java基础 (59)
- struts (8)
- spring (8)
- 数据库 (8)
- java 网络编程 (29)
- hibernate (3)
- JavaScript (10)
- 日志管理 (2)
- jsp (4)
- servlet (7)
- xml (4)
- ajax (2)
- web service (4)
- 算法与数据结构 (13)
- java 反射机制 (11)
- java 泛型 (3)
- java I/O (8)
- java 线程 (12)
- JavaEE (6)
- java解惑 (33)
- 工具 (5)
- MyEclipse编程实践 (1)
- OSGI (2)
- 设计模式 (9)
- 正则表达式 (0)
- EJB (3)
- Ubuntu linux (6)
- Android (1)
- web前端 (2)
- 找工作 (1)
- SCA (1)
- maven (1)
- 缓存 (1)
- json (1)
- javamail (1)
- 工作笔记 (2)
最新评论
-
霜花似雪:
博主可以分享一下源码吗?
使用maven构建web项目实例 -
王庆波-行:
很好的demo!
memcache使用实例 -
surpassno:
大写的牛逼
java可视化显示内存使用情况 -
zhulin0504:
怎么访问NetEcho.html页面呀???
applet与servlet的网络通信 -
springdata:
java多线程实例demo源代码下载:http://www.z ...
java多线程例子
内部类允许在一个类中定义另一个类。允许一个类成为另一个类的成员。内部类实例可以访问外部类的所有成员,即使是private的成员。
常规的(非static、非匿名的、方法是本地的)内部类:
如果使用java命令 :javac Outer.java
会生成两个类文件:Outer.class,Outer$Inner.class
但是普通方法不能访问这个内部类文件,如不能使用java Outer$Inner来运行这个内部类的main方法,因为常规内部类不能有任何类型的静态声明(包括静态方法和静态变量)。访问内部类的唯一方法是通过外部类的一个活实例!!
为了创建内部类的实例。必须有一个与这个内部类相关的外部类实例。这一规则没有例外!!
正常情况下,一个对象如何引用它自己?使用this引用。
1,this只能从实例代码内使用,也就是说它不能出现在static代码内
2,this引用是对当前执行对象的引用。
3,this引用是对象把对其自己的引用作为方法参数传递给其他代码的一种方法。
应用域内部类的成员修饰符:可以有final,abstract,public,private,protected,static,strictfp
方法本地内部类:
常规内部类的范围限制在另一个类的大括号之内,但在任何方法代码之外(也就是与被声明的实例变量有相同的级别),但是,也可以在方法内定义内部类:也叫做方法本地内部类
方法本地内部类只能在定义该内部类的方法内实例化。换句话说,运行在任何其他方法内的其他任何代码都不能实例化方法本地内部类。
内部类的对象不能访问该内部类所在本地方法内的局部变量。为什么?因为方法中的局部变量是放在栈内的,只存活在方法中,当方法调用结束,变量也就被删除。
但是,即使方法调用结束,在其中创建的内部类对象仍然可能存活于堆上,因此不能保证它们的生命周期一样长,所以不能访问。除非将局部变量声明为final类型。
不能把方法本地内部类标识为public、private、protected、static、transient等。
唯一能应用于方法本地内部类的修饰符是abstract和final。而且永远它两不能同时使用。
匿名内部类:
被声明的内部类没有任何类名。不仅能在方法内,而且能够在方法的参数内定义这些类。
第一种形式的普通旧匿名内部类:
请看下面代码
Food具有实例变量,声明为Popcorn类型。Food没有任何方法。要注意的关键一点:Popcorn引用变量不是引用Popcorn实例,而是Popcorn匿名(未命名)子类的实例。
匿名类代码:
第二行,Popcorn类型的实例变量声明,不同于Popcorn p = new Popcorn();在第二行就结束,通常分号所在位置有一个大括号:
声明了Popcorn 的一个心累,它没有名字,但是是Popcorn 的子类,并重写了Popcorn 父类中的pop方法。
建立匿名内部类的关键点:重写父类的一个或多个方法!!
第二种形式的普通旧匿名内部类:
第一种与第二种的唯一区别是,第一种形式创建指定类 类型的匿名子类,而第二种形式则创建指定接口类型的实现类。
interface
参数定义的匿名内部类:
静态嵌套类(静态内部类):
按照内部类的标准定义,它们根本不是内部类。对于静态类,更重要的是名称空间解析,而不是两个类之间的隐含关系。
例子:
练习题:
这个程序会出现编译错误,一定要小心。注意少量个分号
执行结果:输出zippo。
执行结果:57 22
常规的(非static、非匿名的、方法是本地的)内部类:
class Outer{ class Inner{ //public static void main(String[] args){ } // 如果加上这一句会出现编译错误,因为不能有静态方法 } }
如果使用java命令 :javac Outer.java
会生成两个类文件:Outer.class,Outer$Inner.class
但是普通方法不能访问这个内部类文件,如不能使用java Outer$Inner来运行这个内部类的main方法,因为常规内部类不能有任何类型的静态声明(包括静态方法和静态变量)。访问内部类的唯一方法是通过外部类的一个活实例!!
为了创建内部类的实例。必须有一个与这个内部类相关的外部类实例。这一规则没有例外!!
public class Outer{ private int x = 7; public static void main(String[] args){ //从外部类实例代码外(包括外部类的静态方法),内部类 名称必须包含外部类名称 Outer o = new Outer(); Outer.Inner i = o.new Inner(); i.seeOuter(); } public void makeInner(){ //从外部类实例方法内,以正常方式使用内部类名称 Inner in = new Inner(); in.seeOuter(); } class Inner{ public void seeOuter(){ System.out.println("Outer x is "+x); System.out.println("Inner is "+this); //内部类引用自身实例 System.out.println("Outer is "+Outer.this); //内部类引用外部类当前实例 } } } //执行结果:Outer x is 7
正常情况下,一个对象如何引用它自己?使用this引用。
1,this只能从实例代码内使用,也就是说它不能出现在static代码内
2,this引用是对当前执行对象的引用。
3,this引用是对象把对其自己的引用作为方法参数传递给其他代码的一种方法。
应用域内部类的成员修饰符:可以有final,abstract,public,private,protected,static,strictfp
方法本地内部类:
常规内部类的范围限制在另一个类的大括号之内,但在任何方法代码之外(也就是与被声明的实例变量有相同的级别),但是,也可以在方法内定义内部类:也叫做方法本地内部类
public class Outer{ private String x = "Outer"; public static void main(String[] args){ Outer o = new Outer(); o.doStuff(); } public void doStuff(){ int a = 0; class Inner{ //如果加public,会出现compile error public void seeOuter(){ System.out.println("Outer x is "+x); //可以访问外部类的变量 System.out.println("doStuff a is "+a); //编译错误,不能访问本地方法的局部变量,必须声明为final类型才可以,可以想象一下监听器 } } //inner class Inner i = new Inner(); i.seeOuter(); } //dostuff } //outer class //执行结果:Outer x is Outer
方法本地内部类只能在定义该内部类的方法内实例化。换句话说,运行在任何其他方法内的其他任何代码都不能实例化方法本地内部类。
内部类的对象不能访问该内部类所在本地方法内的局部变量。为什么?因为方法中的局部变量是放在栈内的,只存活在方法中,当方法调用结束,变量也就被删除。
但是,即使方法调用结束,在其中创建的内部类对象仍然可能存活于堆上,因此不能保证它们的生命周期一样长,所以不能访问。除非将局部变量声明为final类型。
不能把方法本地内部类标识为public、private、protected、static、transient等。
唯一能应用于方法本地内部类的修饰符是abstract和final。而且永远它两不能同时使用。
匿名内部类:
被声明的内部类没有任何类名。不仅能在方法内,而且能够在方法的参数内定义这些类。
第一种形式的普通旧匿名内部类:
请看下面代码
class Popcorn{ public void pop(){ System.out.println("popcorn"); } } class Food{ Popcorn p = new Popcorn(){ public void pop(){ System.out.println("anonymous popcorn"); } }; }
Food具有实例变量,声明为Popcorn类型。Food没有任何方法。要注意的关键一点:Popcorn引用变量不是引用Popcorn实例,而是Popcorn匿名(未命名)子类的实例。
匿名类代码:
2 Popcorn p = new Popcorn(){ 3 public void pop(){ 4 System.out.println("anonymous popcorn"); 5 } 6 };
第二行,Popcorn类型的实例变量声明,不同于Popcorn p = new Popcorn();在第二行就结束,通常分号所在位置有一个大括号:
声明了Popcorn 的一个心累,它没有名字,但是是Popcorn 的子类,并重写了Popcorn 父类中的pop方法。
建立匿名内部类的关键点:重写父类的一个或多个方法!!
第二种形式的普通旧匿名内部类:
第一种与第二种的唯一区别是,第一种形式创建指定类 类型的匿名子类,而第二种形式则创建指定接口类型的实现类。
interface
Cookable{ public void cook(); } public class Food { Cookable c= new Cookable(){ @Override public void cook() { } }; }
参数定义的匿名内部类:
interface Foo{ public void foof(); } class Bar{ void doStuff(Foo f){ f.foof(); } } public class Food { void go(){ Bar b = new Bar(); b.doStuff(new Foo(){ @Override public void foof() { System.out.println("hello"); } }); } public static void main(String[] args){ new Food().go(); } }执行结果:hello
静态嵌套类(静态内部类):
按照内部类的标准定义,它们根本不是内部类。对于静态类,更重要的是名称空间解析,而不是两个类之间的隐含关系。
class BigOuter { static class Nested{ //static 修饰符只是说这个嵌套类是外部类的静态成员。这意味着没有 外部类实例,也能够访问。 } }
例子:
class BigOuter { static class Nested{ //static 修饰符只是说这个嵌套类是外部类的静态成员。这意味着没有 外部类实例,也能够访问。 void go(){ System.out.println("hi"); } } } public class Broom{ static class B2{ void goB2(){ System.out.println("hi 2"); } } public static void main(String[] args){ BigOuter.Nested n = new BigOuter.Nested(); //两个类名 n.go(); B2 b= new B2(); b.goB2(); } }
练习题:
public class TestObj { public static void main(String[] args) { Object o = new Object(){ public boolean equals(Object o){ return true; } } System.out.println(o.equals("he")); } }
这个程序会出现编译错误,一定要小心。注意少量个分号
public class TestObj { public static void main(String[] args) { class Horse{ public String name; public Horse(String name){ this.name = name; } } Object o = new Horse("zippo"); Horse h = (Horse) o; System.out.println(h.name); } }
执行结果:输出zippo。
public abstract class AbstractTest { public int getNum(){ return 45; } public abstract class Bar{ public int getNum(){ return 38; } } public static void main(String[] args) { AbstractTest t = new AbstractTest(){ public int getNum(){ return 22; } }; AbstractTest.Bar f = t.new Bar(){ public int getNum(){ return 57; } }; System.out.println(f.getNum()+" "+t.getNum()); } }
执行结果:57 22
发表评论
-
数据库及struts面试题
2011-06-22 11:07 1025数据库部分 Q: What is SQL? ... -
EJB面试题
2011-06-22 10:54 1093Q: What are the different kinds ... -
java中的servlet面试题
2011-06-22 10:43 1076Q: Explain the life cycle metho ... -
java中JSP的面试题
2011-06-22 10:22 1506Q: What is a output comment? (可 ... -
java中的集合面试题
2011-06-22 10:12 688Q: What is the Collections API? ... -
细说java(java中的浮点数十六进制表示)
2011-06-12 16:48 3509java中浮点数不能用八进制表示,但可以用十六进制表示,只能用 ... -
SCJP试题
2011-06-09 16:14 1143package scjp; public class T ... -
java面试题解惑 之 继承、多态、重载、重写
2011-06-03 09:36 1269继承、多态、重载、重写 继承 java中有三种类:类,抽象类, ... -
java面试题解惑 之 多线程
2011-06-02 17:24 9481,多线程 线程或者说 ... -
java面试题解惑 之变量初始顺序,变量覆盖,字符串池,final,finally区别
2011-06-02 16:26 7601,变量初始化顺序 package com.qdu.sun; ... -
java解惑(Map的使用,静态导入方法,线程中断interrupted与线程死锁)
2011-05-17 12:38 1362Map的使用 package other; import ... -
java 继承的一个问题(想不明白)
2011-04-13 17:03 881java中的继承问题,以为是学会了java,结果最简单的一个j ... -
java解惑(谜题76。。)
2011-03-09 11:22 1176谜题76:乒乓public class PingPong { ... -
java解惑(谜题60,65)
2011-03-08 15:52 884一行以毙之 1,编写一个 ... -
java解惑(谜题66。。。)
2011-02-28 20:54 911谜题66:一件私事 class Base{ public ... -
java解惑(谜题61。。。)
2011-02-28 20:17 881谜题61:日期游戏 import java.util.Cal ... -
java解惑(谜题56到。。库之谜)
2011-02-28 19:41 827谜题56:大问题 import jav ... -
java解惑(谜题49。。)
2011-02-27 10:52 920谜题49:比生命更大 import java.util.Cal ... -
java解惑(谜题41到谜题)
2011-02-27 10:18 884谜题41:域和流 下面的 ... -
谜题36-谜题
2011-02-25 10:55 857谜题36:优柔寡断 public ...
相关推荐
12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...
java内部类详解
java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用
Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类
Java内部类总结 学习java的资源
java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码
详细介绍JAVA内部类的用法,用途,基本语法,及匿名类用法
内部类基本概述语法格式成员内部类局部内部类匿名内部类静态嵌套类静态嵌套类和非静态嵌套类的区别 内部类 基本概述 当一个类的定义放在另一个类的实体时,则该类叫做内部类,该类所在的类叫做外部类 在一个类体中...
Java 接口 内部类Java 接口 内部类Java 接口 内部类
16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名内部类.zip16.java匿名...
Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类
Java 的使用 分别介绍了 成员内部类、方法内部类、静态内部类
java 成员内部类使用 内部匿名类 方法参数匿名类 方法匿名类
Java内部类的作用
14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14.java局部内部类(方法中类).zip14...
有关JAVA的内部类的好东西,彻底明白内部类,呵呵
Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;
java 局部内部类的使用规范 java 局部内部类的使用规范
java 成员内部类的使用规范 java 成员内部类的使用规范