- 浏览: 156328 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
atgfss:
采用在cookies中保存用户名和sessionid的这种方式 ...
自动登录 -
liumm19870913:
对有输入参数过程的调用
我试过那代码 , 有问题呀,funct ...
oracle 存储过程调用 -
zdsyouxiang:
内容很全面!
认识多任务、多进程、单线程、多线程
java内部类的作用
推荐一、 定义
放在一个类的内部的类我们就叫内部类。
二、 作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
三、 例子
1.实现隐藏
平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子
接口
上面加粗的部分是内部类,访问修饰符是private
客户端程序
package insidecategory;
加粗的那部分就是客户端调用的代码,从这段代码里面我只知道Example的
getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。
2.可以无条件地访问外围类的所有元素
看上面加粗部分,name这个变量是在TagBean里面定义的私有变量。这个变量在内部类中可以无条件地访问System.out.println(name);
3.可以实现多重继承
个特点非常重要,个人认为它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。大家看下面的例子。
类一
类二
类三
大家注意看类三,里面分别实现了两个内部类 test1,和test2 ,test1类又继承了Example1,test2继承了Example2,这样我们的类三MainExample就拥有了Example1和Example2的方法和属性,也就间接地实现了多继承。
四、 避免修改接口而实现同一个类中两种同名方法的调用。
大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码
接口
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了。
转自:http://blog.csai.cn/user1/42856/archives/2008/29228.html
推荐一、 定义
放在一个类的内部的类我们就叫内部类。
二、 作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
三、 例子
1.实现隐藏
平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子
接口
package insidecategory; public interface Incrementable { void increment(); } 具体类 package insidecategory; public class Example { private class InsideClass implements InterfaceTest { public void test() { System.out.println("这是一个测试"); } } public InterfaceTest getIn() { return new InsideClass(); } }
上面加粗的部分是内部类,访问修饰符是private
客户端程序
package insidecategory;
public class TestExample { public static void main(String args[]) { Example a=new Example(); InterfaceTest a1=a.getIn(); a1.test(); } }
加粗的那部分就是客户端调用的代码,从这段代码里面我只知道Example的
getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。
2.可以无条件地访问外围类的所有元素
package insidecategory; public class TagBean { private String name="liutao"; private class InTest { public InTest() { System.out.println(name); } } public void test() { new InTest(); } public static void main(String args[]) { TagBean bb=new TagBean(); bb.test(); } }
看上面加粗部分,name这个变量是在TagBean里面定义的私有变量。这个变量在内部类中可以无条件地访问System.out.println(name);
3.可以实现多重继承
个特点非常重要,个人认为它是内部类存在的最大理由之一。正是由于他的存在使得Java的继承机制更加完善。大家都知道Java只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。大家看下面的例子。
类一
package insidecategory; public class Example1 { public String name() { return "liutao"; } }
类二
package insidecategory; public class Example2 { public int age() { return 25; } }
类三
package insidecategory; public class MainExample { private class test1 extends Example1 { public String name() { return super.name(); } } private class test2 extends Example2 { public int age() { return super.age(); } } public String name() { return new test1().name(); } public int age() { return new test2().age(); } public static void main(String args[]) { MainExample mi=new MainExample(); System.out.println("姓名:"+mi.name()); System.out.println("年龄:"+mi.age()); } }
大家注意看类三,里面分别实现了两个内部类 test1,和test2 ,test1类又继承了Example1,test2继承了Example2,这样我们的类三MainExample就拥有了Example1和Example2的方法和属性,也就间接地实现了多继承。
四、 避免修改接口而实现同一个类中两种同名方法的调用。
大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码
接口
package insidecategory; public interface Incrementable { void increment(); } 类 MyIncrement package insidecategory; public class MyIncrement { public void increment() { System.out.println("Other increment()"); } static void f(MyIncrement f) { f.increment(); } }
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
package insidecategory; public class Callee2 extends MyIncrement implements Incrementable { public void increment() { //代码 } }
想问一下大家increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
package insidecategory; public class Callee2 extends MyIncrement { private int i=0; private void incr() { i++; System.out.println(i); } private class Closure implements Incrementable { public void increment() { incr(); } } Incrementable getCallbackReference() { return new Closure(); } }
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了。
转自:http://blog.csai.cn/user1/42856/archives/2008/29228.html
发表评论
-
java 线程池分析
2015-01-19 17:34 642转自 http://www.cnblogs.com/evilr ... -
JCA 综述
2011-08-25 15:01 1144什么是JCA?它最吸引人 ... -
web.xml 配置详解
2011-08-25 14:14 7101 定义头和根元素 部署描述符文件就像所有XML文件一样, ... -
xpath查询xml
2011-08-23 09:46 2065类似于使用SQL从数据库从查询数据。XPath可以方便的在XM ... -
自动登录
2011-08-17 14:42 1769一、什么是用户自动登录? 对于我们的网站向已注册用户提供 ... -
jad 安装
2011-08-11 14:47 1708Eclipse反编译工具Jad及插件JadClipse配置 ... -
LinkedHashMap 和 HashMap的区别
2011-08-11 10:13 943顾名思义LinkedHashMap是比HashMap多了一个链 ... -
cookie & session
2011-08-10 09:31 552二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小 ... -
java异常处理之throw, throws,try和catch
2011-08-05 10:10 1388转载 http://blog.csdn.net/zhouyon ... -
servlet/jsp线程安全
2011-08-05 09:56 1570转自 http://www.newasp.net/tech/ ... -
Static Nested Class 和 Inner Class
2011-07-26 21:54 1115【转】Static Nested Class 和 Inner ... -
servlet 变量范围
2011-07-02 16:19 855如果要在整个应用范围可以用: request.getSessi ... -
tomcat outofmemoryerror permgen space java heap space
2011-06-28 15:07 1334windows 下 tomcat 虚拟内存 ... -
newInstance() 和 new 有什么区别?
2011-06-25 15:51 742在初始化一个类,生成一个实例的时候;newInstance() ... -
几种类加载方式的区别
2011-06-25 15:41 931虚拟机加载类的途径: 1、Dog dog = new Do ... -
运行时异常与一般异常
2011-06-25 15:39 1072Java提供了两类主要的异常:runtime exceptio ... -
ConcurrentHashMap实现原理
2011-06-25 15:14 1953ConcurrentHashMap是Java 5中 ... -
java集合
2011-06-25 15:00 778转载 当你事先不知道要存放数据的个数,或者你需要一种比数组下标 ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2011-06-25 14:21 814转载http://hi.baidu.com/suofang/b ... -
Servlet中listener和filter的总结
2011-06-25 14:04 1419转载 Listener我是这样理 ...
相关推荐
扩大内部类作用域的2种方法、内部类获取外部类引用扩大内部类作用域的2种方法内部类的作用域:外部类对象val students = new ArrayBuffer
### Java内部类的作用 #### 一、定义及概念 内部类,顾名思义,指的是一个定义在另一个类内部的类。这样的结构让内部类能够访问外部类的成员(包括私有成员),并且允许内部类拥有不同的访问级别,如`private`、`...
本篇文章将深入探讨Java内部类的作用,包括其分类、访问权限、以及如何创建和使用。 首先,Java内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类类似于类的成员变量,可以在类的...
局部内部类只存在于某个方法内,它的作用范围更小,通常用于实现特定逻辑。匿名内部类是无名的,通常用于创建一次性使用的简洁实现,比如作为接口的实例。静态内部类则与普通的静态成员类似,不依赖于外部类的实例,...
在Java编程语言中,内部类和匿名内部类是两种特殊类型的类,它们为代码的组织和功能实现提供了独特的灵活性。本教程"Java4Android 35_内部类和匿名内部类"深入探讨了这两个概念,旨在帮助开发者更好地理解和运用它们...
内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...
- **局部内部类**:定义在方法、构造器或块中的类称为局部内部类,它的作用域仅限于该方法、构造器或块。 - **匿名类**:没有名字的内部类,通常用于一次性实现某个接口或父类的简单功能。 2. **内部类继承** - ...
成员内部类可以使用final、abstract、public和private四种修饰符,它们的作用与普通类的修饰符相同。 静态嵌套类 静态嵌套类是指使用static关键字定义的内部类。静态嵌套类不能访问外部类的非静态成员变量和方法,...
局部内部类定义在方法或代码块内,其作用域仅限于该方法或代码块。它们通常用于实现特定方法的功能,且只能在该方法内部使用。由于其局部性,局部内部类可以访问方法内的所有局部变量和参数,但这些变量必须是 ...
局部内部类是在方法或构造器的内部定义的类,它的作用域仅限于该方法或构造器内部。局部内部类可以访问方法或构造器中的所有局部变量,但这些变量必须声明为`final`(最终的)。局部内部类的主要用途是为某个特定的...
2. **局部内部类**:局部内部类只存在于某个方法、构造器或者代码块中,它的作用域仅限于该方法、构造器或代码块。下面是一个局部内部类的例子: ```java public class Test1 { public void display() { class ...
根据定义和作用域的不同,Java内部类主要分为四类: 1. **嵌套顶级类(Nested Top-Level Classes)**:这种内部类类似于普通的类,但它们被定义在另一个类的内部。它们没有访问外部类的实例变量或方法的能力,除非...
局部内部类只在方法、构造器或者块中定义,其作用域仅限于该方法、构造器或块。这使得局部内部类可以访问它所在范围内的所有变量,包括局部变量,但这些变量必须是final的。局部内部类主要用来实现某个特定功能,其...
本示例源码提供了关于内部类的全面理解,包括它的三种形式:成员内部类、局部内部类和匿名内部类,以及它们的实现方式和使用注意事项。 首先,我们来看成员内部类。成员内部类就像普通的类成员,可以是静态的或非...
1.接口-简介 2.接口-作用 3.接口-定义方式 4....内部类-作用 9.内部类-特殊语法规则 10.内部类-安全性 11.内部类-局部内部类 12.内部类-匿名内部类 13.内部类-静态内部类 14.综述
局部内部类则定义在方法或作用域内,它的生命周期仅限于该方法的执行。匿名内部类通常用于快速实现一个接口或继承一个类,不需要显式命名。静态内部类虽然在形式上类似于成员内部类,但可以独立于外部类实例存在,...
这种特性使得静态内部类在多种场景下都能发挥重要作用,例如在提高性能、优化内存使用以及简化API设计等方面。理解静态内部类的工作原理及其与其他类型内部类的区别对于编写高效且易于维护的Java代码至关重要。
内部类(Inner Class)是Java语言中一个独特的特性,它允许在一个类的内部定义另一个类。这种设计模式在处理特定问题时提供了更大的灵活性,比如实现事件监听器、封装复杂逻辑或者创建私有的辅助类。本章我们将深入...
内部类的作用域仅限于其外部类,可以访问外部类的成员,同时又能保护类的封装性。 目标: 通过这个源码资源,你将学会以下内容: - 内部类的定义和语法 - 如何在外部类中访问和操作内部类 - 不同类型的内部类(静态...
### C++内部类详细分析 #### 一、引言 面向对象编程(OOP)自诞生以来,便成为了软件工程领域的重要组成部分。C++作为一种广泛使用的编程语言,支持面向对象编程特性,包括多重继承。多重继承是指一个类可以从多个...