一、 定义
放在一个类的内部的类我们就叫内部类。
二、 作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
三、 例子
1. 实现隐藏
平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子
接口
Java代码
package insidecategory;
public interface Incrementable
{
void increment();
}
package insidecategory;
public interface Incrementable
{
void increment();
}
具体类
Java代码
package insidecategory;
public class Example {
private class InsideClass implements InterfaceTest
{
public void test()
{
System.out.println("这是一个测试");
}
}
public InterfaceTest getIn()
{
return new InsideClass();
}
}
package insidecategory;
public class Example {
private class InsideClass implements InterfaceTest
{
public void test()
{
System.out.println("这是一个测试");
}
}
public InterfaceTest getIn()
{
return new InsideClass();
}
}
上面加粗的部分是内部类,访问修饰符是private
客户端程序
Java代码
package insidecategory;
public class TestExample {
public static void main(String args[])
{
Example a=new Example();
InterfaceTest a1=a.getIn();
a1.test();
}
}
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.可以无条件地访问外围类的所有元素
Java代码
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();
}
}
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只能继承一个类,它的多重继承在我们没有学习内部类之前是用接口来实现的。但使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。大家看下面的例子。
类一
Java代码
package insidecategory;
public class Example1 {
public String name()
{
return "liutao";
}
}
package insidecategory;
public class Example1 {
public String name()
{
return "liutao";
}
}
类二
Java代码
package insidecategory;
public class Example2 {
public int age()
{
return 25;
}
}
package insidecategory;
public class Example2 {
public int age()
{
return 25;
}
}
类三
Java代码
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());
}
}
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的方法和属性,也就间接地实现了多继承。
四、 避免修改接口而实现同一个类中两种同名方法的调用。
大家假想一下如果,你的类要继承一个类,还要实现一个接口,可是你发觉你继承的类和接口里面有两个同名的方法怎么办?你怎么区分它们??这就需要我们的内部类了。看下面的代码
接口
Java代码
package insidecategory;
public interface Incrementable
{
void increment();
}
package insidecategory;
public interface Incrementable
{
void increment();
}
类 MyIncrement
Java代码
package insidecategory;
public class MyIncrement {
public void increment()
{
System.out.println("Other increment()");
}
static void f(MyIncrement f)
{
f.increment();
}
}
package insidecategory;
public class MyIncrement {
public void increment()
{
System.out.println("Other increment()");
}
static void f(MyIncrement f)
{
f.increment();
}
}
大家看上面加黑的部分,两个方法都是一样的。在看下面这个类要继承这两个类
如果不用内部类
Java代码
package insidecategory;
public class Callee2 extends MyIncrement implements Incrementable
{
public void increment()
{
//代码
}
}
package insidecategory;
public class Callee2 extends MyIncrement implements Incrementable
{
public void increment()
{
//代码
}
}
想问一下大家 increment()这个方法是属于覆盖MyIncrement这里的方法呢?还是Incrementable这里的方法。我怎么能调到 MyIncrement这里的方法?显然这是不好区分的。而我们如果用内部类就很好解决这一问题了。看下面代码
Java代码
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();
}
}
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();
}
}
我们可以用内部类来实现接口,这样就不会与外围类的方法冲突了。
分享到:
相关推荐
虽然ActivityGroup在早期的Android开发中起到了一定作用,但随着Android版本的更新和最佳实践的改变,现在更推荐使用Fragment和FragmentTransaction来实现Tab导航。使用Fragment可以提高代码质量,减少内存泄漏,...
对于代理服务器,通常是一个公共服务器,它的作用是协助两个私有网络内的主机交换信息,建立连接。代理服务器的VB代码可能包括接收来自客户端的数据、解析信息并转发给另一个客户端的部分。 需要注意的是,UDP打洞...
- 使用静态内部类等技术来实现高效的单例模式。 通过遵循以上建议,开发者可以在编写Java代码时,不仅能够写出高质量、高效率的代码,还能够更好地遵循软件工程的最佳实践,从而提高软件的可靠性和可维护性。
综上所述,电容作为电子电路中最基本且重要的元件之一,在各种应用中发挥着不可替代的作用。了解电容的真实模型、寄生参数的影响、频率特性、典型应用及选择时的关键参数,对于设计高效可靠的电路至关重要。
最后,价格走势的分化提示我们,市场内部的竞争环境可能在不断变化,投资者应该密切关注不同物业类型的价格变动趋势,并结合具体项目来做出投资决策。 报告也提醒读者,虽然报告内容力求精确,但仅为参考之用,实际...
存储器层次结构的学习是难点,尤其是Cache-主存-外存的层次,考生需要理解Cache的工作原理、映射方式、替换算法和写策略,以及虚拟存储器的页式、段式、段页式管理和TLB的作用。 最后,中央处理器(CPU)的设计和...
GCC(GNU Compiler Collection)和glibc(GNU C Library)是Linux和类Unix系统中广泛使用的工具,它们提供了丰富的功能来帮助开发者优化程序。这篇文章主要探讨了使用GCC编译器和glibc库进行程序优化的几种策略。 1...
- **用例设计技巧**:熟练掌握各种测试设计技术,如边界值分析、等价类划分等。 - **可读性与可维护性**:确保测试用例易于理解和维护。 - **执行效率**:优化测试用例,提高执行效率。 - **自动化测试**:利用自动...
Bootloader在系统启动过程中承担着桥梁作用,负责硬件初始化和创建正确的软硬件环境,以便操作系统内核能够顺利运行。其操作模式通常分为“启动加载”和“下载”两种: - **启动加载模式**:在此模式下,Bootloader...
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 适用场景:当对一个对象结构中的对象进行很多不同的并且不相关的操作时;当一个对象结构包含很多类对象,它们有不同的接口,而你希望对这些对象...
unity的框架,除了各大公司自己内部使用的,开源并好用的实际并不是很多,我会慢慢挖掘,依次写出自己的一点见解,错误的地方,望各路大神指正。 一、基本概念 控制反转(Inversion of Control,英文缩写为IOC),...
同时,作者也强烈建议尊重知识版权,引用或转载相关内容时注明出处,避免类剽窃行为。 最后,用户在学习GDAL的过程中应当积极提问和交流。如果遇到问题,可以联系作者,通过邮件进行沟通。在不断的学习和实践过程中...
6. 版权声明和使用限制:文档中明确提到了“非经授权,严禁抄袭转载”,“版权由薪酬网所有”,表明该薪酬报告的所有权受到法律保护,任何个人或机构未经允许不得擅自使用或转载。这反映了报告的权威性和原创性,也...
通过对岗位薪酬水平的了解,企业和个人可以根据市场定位自身或企业内部的薪酬标准,从而在招聘、留才和人才发展等方面做出更为合理的决策。 五、报告的版权与使用规定 报告明确声明了版权所有者为薪酬网,严禁未经...
- 建立外链可以加速收录,数量、质量和相关性都起关键作用。 2. **页面收录策略**: - 广度优先策略先抓取重要页面,适合内容层次浅的网站。 - 深度优先策略抓取更多冷门页面,适合多层次结构。 - 用户提交能...
根据提供的文件内容,我们可以生成以下几个重要知识点: ...以上各点体现了薪酬报告在人力资源管理中的重要作用,它不仅为薪酬制定提供了科学依据,还有助于企业在人力资源管理和财务规划上做出更明智的决策。
Scroller 的作用:是一个专门用于处理滚动效果的工具类 Scroller的使用方法 (代码中也会将详细的使用步骤进行注释) 1.创建Scroller实例 2.调用startScroller()方法初始化滚动数据并刷新界面 3.重写computescroll()...
网站优化(SEO)是指通过对网站内部结构、内容以及外部链接等方面的调整,提高网站在搜索引擎中的排名,从而获得更多流量的一种方法。良好的网站优化不仅能够提升用户体验,还能显著增加网站的可见度和访问量。 ###...
主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...