`
ldzyz007
  • 浏览: 716583 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java内部类有什么好处

    博客分类:
  • java
阅读更多
内部类:一个内部类的定义是定义在另一个内部的类。

  原因是:

  1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。

  2.对于同一个包中的其他类来说,内部类能够隐藏起来。

  3.匿名内部类可以很方便的定义回调。

  4.使用内部类可以非常方便的编写事件驱动程序。


     首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你 可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。

     不过你可能要质疑,更改一下方法的不就行了吗?

     的确,以此作为设计内部类的理由,实在没有说服力。

     真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题——没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

如果没有final的话,那么内部类使用的外部类局部变量要用哪个值呢?
使用内部类经常是用在Listener这样的。
而Listener中的监听函数被调用时,大部分情况,new内部类所在的函数早就执行完了,此时外部类局部变量早就不存在了。

而加上final后,编译器是这样处理内部类的。如果这个外部局部变量是常量,则在内部类代码中直接用这个常量。如果是类的实例,则编译器将产生一个内部类的构造参数,将这个final变量传到内部类里,这样即使外部局部变量无效了,还可以使用。

另外引用别人的一段话:
内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。
这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是 final来规避这种莫名其妙错误的存在
分享到:
评论

相关推荐

    Java内部类.pdf

    Java内部类是指定义在另一个类内部的类,它可以访问外部类的属性和方法。在Java中,内部类提供了更精细的控制,可以使得类的封装性更强,设计更为隐蔽和安全。以下是对标题中"Java内部类.pdf"文件的知识点进行的详细...

    Java中的内部类和匿名类

    Java 中的内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在 C++ 里也有,那就是嵌套类(Nested Class)。内部类从表面上看,就是在类中又定义了一个类,而实际上并没有那么简单。内部类的使用可以让你...

    Java 中的内部类和匿名类

    Java 内部类有什么好处?为什么需要内部类?  首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类...

    讲述java中内部类的研究

    JAVA从JDK1.1开始引入了内部类,可以参见代码,感觉好处就是设计类的时候可以偷懒,呵呵。主要是可以引用类的内部其他元素,差不多是把这个内部类当成原类的元素。还有可以隐藏类的一些设计细节,好处还是很多的。

    JAVA内嵌类代码.rar

    Java内嵌类,也称为内部类,是Java编程语言中一个独特且强大的特性。它允许我们在一个类的定义内部创建另一个类,这种设计模式在处理复杂逻辑和封装方面提供了很大的灵活性。内嵌类分为四种主要类型:静态内嵌类、...

    idea-plugin-generator-properties:生成器内部类按类字段

    例如,当一个类有多个属性需要在用户界面中展示或编辑时,这个生成器可以帮助创建适配的内部类,使得这些属性可以直接与GUI组件关联,如JTable或JFormDesigner等。此外,它还可以帮助遵循良好的编程实践,如强制数据...

    BroadcastReceiver 最好作为内部类

    1. **范围限制**:内部类只能接收与宿主组件有直接关联的广播,如果需要全局监听,应使用静态内部类或单独的`BroadcastReceiver`。 2. **启动限制**:内部类`BroadcastReceiver`不能在Manifest中声明,因此只能通过...

    关于java的类机制

    封装的好处在于可以防止外部代码对内部状态的非法访问和修改。 ```java public class BankAccount { private double balance; // 私有成员变量 public void deposit(double amount) { balance += amount; } ...

    java中的多线程内部类实现数据共享和Runnable实现数据共享归类.pdf

    本篇文档主要探讨了两种实现Java多线程的数据共享方式:通过内部类和实现Runnable接口。以下是对这两种方法的详细解释: 1. **实现Runnable接口**: - **好处**:Java中的`Runnable`接口允许我们将线程逻辑(run()...

    清华IT深入Java类高级PPT学习教案.pptx

    总结来说,这份清华IT深入Java类高级PPT教程涵盖了Java编程中的核心概念,包括类的访问控制、封装、嵌套类(内部类)以及类的继承和方法的重写。通过学习这些知识点,开发者能够更好地理解和运用面向对象设计原则,...

    Java常见问题演示

    4. **静态内部类**:静态内部类与外部类的关系较松散,它可以访问外部类的静态成员,但不能直接访问非静态成员。 **需要注意的是**:`static`关键字不能用于修饰构造方法。这是因为构造方法的主要职责是初始化对象...

    第8周 内部类、lambda表达式、比较器.pdf

    内部类的使用场景和好处有四点: 1. 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整。 2. 方便将存在一定...

    java实体类代码生成器 带注释

    Java实体类代码生成器是一种工具,它能够自动化创建Java编程中的数据访问对象(DAO)或实体类,大大节省了开发人员编写重复性代码的时间。实体类通常用于表示数据库中的表或者服务接口的数据结构,它们是ORM(对象...

    面向对象编程(Java).pdf

    内部类分为成员内部类和局部内部类,成员内部类可以被静态化,而局部内部类只能访问其所在方法的局部变量,但必须被声明为final或实际上final。 Java中的封装、继承和多态是面向对象编程的核心特性,它们共同构成了...

    徐葳《40小时掌握java语言之03面向对象》内部教材

    封装的好处是隐藏了对象的内部实现细节,降低了编程复杂性,提高了安全性。 继承(Inheritance)是面向对象编程中实现代码复用的一种机制。通过继承,子类(Subclass)可以继承父类(Superclass)的属性和行为,...

    JAVA集合类用法总结

    Java集合类是Java编程语言中不可或缺的一部分,它们提供了一种高效、灵活的方式来存储和操作对象。集合类的主要接口包括Collection、List、Set和Map,这些接口定义了各种操作集合对象的方法,比如添加、删除、修改和...

    个人整理java笔记

    - 内部类有两种主要类型:非静态内部类和静态内部类。 - 非静态内部类只能定义非静态成员,而静态内部类可以定义静态成员。 - 局部内部类是在方法内部定义的类,只能访问该方法中的`final`变量。 ### 六、异常...

Global site tag (gtag.js) - Google Analytics