(转)Java基础——嵌套类、内部类、匿名类
本文内容分转自博客:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html
将相关的类组织在一起,从而降低了命名空间的混乱。
一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。
Java中的内部类共分为四种:
静态内部类static inner class (also called nested class)
成员内部类member inner class
局部内部类local inner class
匿名内部类anonymous inner class
静态内部类Static Inner Class
最简单的内部类形式。
类定义时加上static关键字。
不能和外部类有相同的名字。
被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
静态内部类使用代码:
- 静态内部类使用测试
- package com.learnjava.innerclass;
- class StaticInner
- {
- private static int a = 4;
- 9 // 静态内部类
- 10 public static class Inner
- 11 {
- 12 public void test()
- 13 {
- 14 // 静态内部类可以访问外部类的静态成员
- 15 // 并且它只能访问静态的
- 16 System.out.println(a);
- 17 }
- 18
- 19 }
- }
- public class StaticInnerClassTest
- {
- public static void main(String[] args)
- {
- 27 StaticInner.Inner inner = new StaticInner.Inner();
- inner.test();
- }
- }
成员内部类Member Inner Class
成员内部类也是定义在另一个类中,但是定义时不用static修饰。
成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。
成员内部类就像一个实例变量。
它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
在外部类里面创建成员内部类的实例:
this.new Innerclass();
在外部类之外创建内部类的实例(必须通过外部类的实例去创建):
(new Outerclass()).new Innerclass();
在内部类里访问外部类的成员:
Outerclass.this.member
详情见代码例子:
- 成员内部类使用测试
- package com.learnjava.innerclass;
- class MemberInner
- {
- private int d = 1;
- private int a = 2;
- 10 // 定义一个成员内部类
- 11 public class Inner2
- 12 {
- 13 private int a = 8;
- 14
- 15 public void doSomething()
- 16 {
- 17 // 直接访问外部类对象
- 18 System.out.println(d);
- 19 System.out.println(a);// 直接访问a,则访问的是内部类里的a
- 20
- 21 // 如何访问到外部类里的a呢?
- 22 System.out.println(MemberInner.this.a);
- 23 }
- 24
- 25 }
- }
- public class MemberInnerClassTest
- {
- public static void main(String[] args)
- {
- // 创建成员内部类的对象
- // 需要先创建外部类的实例
- 37 MemberInner.Inner2 inner = new MemberInner().new Inner2();
- inner.doSomething();
- }
- }
局部内部类Local Inner Class
局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
像局部变量一样,不能被public, protected, private和static修饰。
只能访问方法中定义的final类型的局部变量。
局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
- 成员内部类使用测试
- package com.learnjava.innerclass;
- class LocalInner
- {
- int a = 1;
- public void doSomething()
- {
- int b = 2;
- final int c = 3;
- 13 // 定义一个局部内部类
- 14 class Inner3
- 15 {
- 16 public void test()
- 17 {
- 18 System.out.println("Hello World");
- 19 System.out.println(a);
- 20
- 21 // 不可以访问非final的局部变量
- 22 // error: Cannot refer to a non-final variable b inside an inner
- 23 // class defined in a different method
- 24 // System.out.println(b);
- 25
- 26 // 可以访问final变量
- 27 System.out.println(c);
- 28 }
- 29 }
- 31 // 创建局部内部类的实例并调用方法
- 32 new Inner3().test();
- }
- }
- public class LocalInnerClassTest
- {
- public static void main(String[] args)
- {
- // 创建外部类对象
- LocalInner inner = new LocalInner();
- // 调用外部类的方法
- inner.doSomething();
- }
- }
匿名内部类Anonymous Inner Class
匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
匿名内部类隐式地继承了一个父类或者实现了一个接口。
生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。
匿名内部类使用得比较多,通常是作为一个方法参数。
- 匿名内部类使用测试
- package com.learnjava.innerclass;
- import java.util.Date;
- public class AnonymouseInnerClass
- {
- @SuppressWarnings("deprecation")
- public String getDate(Date date)
- {
- return date.toLocaleString();
- }
- public static void main(String[] args)
- {
- AnonymouseInnerClass test = new AnonymouseInnerClass();
- // 打印日期:
- String str = test.getDate(new Date());
- System.out.println(str);
- System.out.println("----------------");
- 26 // 使用匿名内部类
- 27 String str2 = test.getDate(new Date()
- 28 {
- 29 });// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
- 30 // 生成了一个继承了Date类的子类的对象
- System.out.println(str2);
- System.out.println("----------------");
- 34 // 使用匿名内部类,并且重写父类中的方法
- 35 String str3 = test.getDate(new Date()
- 36 {
- 37
- 38 // 重写父类中的方法
- 39 @Override
- 40 @Deprecated
- 41 public String toLocaleString()
- 42 {
- 43 return "Hello: " + super.toLocaleString();
- 44 }
- 45
- 46 });
- System.out.println(str3);
- }
- }
Swing中使用内部类的例子如下:
- Swing中使用匿名内部类
- package com.learnjava.innerclass;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- public class SwingTest
- {
- public static void main(String[] args)
- {
- JFrame frame = new JFrame("JFrame");
- JButton button = new JButton("JButton");
- 20 button.addActionListener(new ActionListener()
- 21 {
- 22 // new出来一个实现了ActionListener接口的类的实例
- 23
- 24 @Override
- 25 public void actionPerformed(ActionEvent arg0)
- 26 {
- 27 System.out.println("Hello World");
- 28
- 29 }
- 30 });
- //加入按钮
- frame.getContentPane().add(button);
- //设置关闭行为
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setSize(200, 200);
- 40 frame.addWindowListener(new WindowAdapter()
- 41 {
- 42 //也可以使用继承了适配器类的匿名内部类
- 43 @Override
- 44 public void windowClosing(WindowEvent e)
- 45 {
- 46
- 47 System.out.println("Closing");
- 48 System.exit(0);
- 49 }
- 50 });
- frame.setVisible(true);
- }
- }
(转)Java基础——嵌套类、内部类、匿名类的更多相关文章
- Java基础-类加载机制与自定义类Java类加载器(ClassLoader)
Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...
- Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...
- 学习android学习必备的java基础知识--四大内部类
学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...
- Java基础教程:内部类
Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass { . . . public class Nest ...
- Java基础 -- 嵌套类(非静态嵌套类、静态嵌套类)
可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested ...
- Java入门教程十(抽象类接口内部类匿名类)
抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
- Java基础——数组应用之StringBuilder类和StringBuffer类
接上文:Java基础——数组应用之字符串String类 一.StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和 ...
- Java基础之处理事件——使用适配器类(Sketcher 3 using an Adapter class)
控制台程序. 适配器类是指实现了监听器接口的类,但监听器接口中的方法没有内容,所以它们什么也不做.背后的思想是:允许从提供的适配器类派生自己的监听器类,之后再实现那些自己感兴趣的类.其他的空方法会从适 ...
随机推荐
- javascript实现继承的几种方式
原型链方式实现继承 function SuperType(){ this.property = true; this.colors = ['red','blue','green']; } SuperT ...
- ubuntu配置DNS
众所周知,centos配置DNS很简单,修改下/etc/resolv.conf,就可以生效.但是ubuntu中,resolv.conf文件却说明写入会被覆盖,不能写在这里. 方法一: 修改/etc/n ...
- poj 1251 统计难题(字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 AC代码: #include<iostream> #include<algor ...
- 在windows下添加php的Imagick扩展
安装ImageMagick-6.9.2-6-Q16-x64-dll.exe 将安装目录下的CORE_开头的dll文件和X11.dll文件复制到c:\windows\system32\下, 在windo ...
- 转载__Android-屏幕适配需要注意的地方
1.尽量使用线性布局(LinearLayout)和相对布局(RelativeLayout),不要使用绝对布局. 2.尽量使用dip和sp,不要使用px. 3.为不同的分辨率提供不同的布局文件和图片. ...
- struts2请求过程源码分析
Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相 ...
- OperationResult
public class OperationResult<T> { private readonly ConcurrentDictionary<string, T> _valu ...
- Opencv 2.4.9在Ubuntu下的配置与安装
[原]Opencv 2.4.9在Ubuntu下的配置安装 Opencv 2.4.9在Ubuntu下的配置与安装 surgewong@gmail.com http://blog.csdn.net/su ...
- [ActionScript 3.0] Away3D 非skybox的全景例子
package { import away3d.containers.View3D; import away3d.controllers.HoverController; import away3d. ...
- SelectedValue 失效
/// <summary> /// 绑定代表下拉选项 /// </summary> public void BindOwnerDataII(string unitId, str ...