内部类

定义:

一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类

  1. //外部类
  2. class Outer
  3. {
  4. //内部类
  5. class Inner
  6. {
  7. }
  8. }
  1. package Innerclass;
  2. //外部其他类
  3. public class c1 {
  4. }
  5. class Outer
  6. {
  7. //属性
  8. private int n1 = 100;
  9. //方法
  10. public void m1()
  11. {
  12. System.out.println("m1()");
  13. }
  14. //内部类
  15. class Inner
  16. {
  17. }
  18. }

内部类的分类

1、定义在外部类局部位置上(比如方法内)
(1)局部内部类(有类名)

(2)匿名内部类(没有类名)

2、定义在外部类的成员位置上
(1)成员内部类(没用static修饰)
(2)静态内部类(使用static修饰)

1、局部内部类

1、局部内部类是定义在外部类的方法中的

2、并且局部内部类可以访问外部类的所有成员包括私有的,访问的方法是直接访问,外部类在方法中可以创建内部类的对象,然后通过内部类的对象去调用其方法

3、不能添加访问修饰符,和局部变量一样,可以用final来修饰

4、作用域只在局部类的方法体内

5、外部其他类不能访问局部内部类(因为局部内部类的地位是一个局部变量)

  1. package Innerclass;
  2. public class LocalInnerClass {
  3. public static void main(String []args)
  4. {
  5. Outer02 outer02 = new Outer02();
  6. outer02.m1();
  7. }
  8. }
  9. //外部类
  10. class Outer02
  11. {
  12. //属性
  13. private int n1 = 100;
  14. //私有方法
  15. private void m2()
  16. {
  17. System.out.println("m2");
  18. }
  19. //方法
  20. public void m1()
  21. {
  22. //局部内部类通常定义在外部类的方法中
  23. //局部内部类
  24. class Inner02
  25. {
  26. //局部内部类可以访问外部类的所有成员,包含私有的
  27. public void f1()
  28. {
  29. m2();
  30. System.out.println("n1 = " + n1);
  31. }
  32. }
  33. Inner02 inner02 = new Inner02();
  34. inner02.f1();
  35. }
  36. }

6、如果外部类和内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用(外部类名.this.成员)

  1. Out02.this.n2

匿名内部类

1、本质是类

2、内部类, 但实际是有名字的,只不过用完之后会立即被销毁

3、该类是没有名字

4、同时还是一个对象

匿名内部类创建之后,会立马实例化出来,然后这个匿名类内部类就不能再被使用了,但实例化出来的对象是可以反复调用的

基于接口的匿名内部类使用

  1. package Innerclass;
  2. public class AnonymousInnerClass {
  3. public static void main(String []args)
  4. {
  5. Outer04 outer04 = new Outer04();
  6. outer04.method();
  7. }
  8. }
  9. class Outer04
  10. {
  11. private int n1 = 10;
  12. public void method()
  13. {
  14. //基于接口的匿名内部类
  15. //tiger的编译类型?IA
  16. //tiger的运行类型?就是匿名内部类
  17. /*
  18. 底层是
  19. class XXXX implements IA
  20. {
  21. public void cry()
  22. {
  23. System.out.println("老虎叫唤...");
  24. }
  25. }
  26. */
  27. IA tiger = new IA()
  28. {
  29. public void cry()
  30. {
  31. System.out.println("老虎叫唤...");
  32. }
  33. };
  34. System.out.println("tiger的运行类型 = " + tiger.getClass());
  35. tiger.cry();
  36. }
  37. }
  38. interface IA{
  39. public void cry();
  40. }

基于类的匿名内部类

  1. package Innerclass;
  2. public class AnonymousInnerClass {
  3. public static void main(String []args)
  4. {
  5. Outer04 outer04 = new Outer04();
  6. outer04.method();
  7. }
  8. }
  9. class Outer04
  10. {
  11. private int n1 = 10;
  12. public void method()
  13. {
  14. //基于接口的匿名内部类
  15. //tiger的编译类型?IA
  16. //tiger的运行类型?就是匿名内部类
  17. /*
  18. 底层是
  19. class XXXX implements IA
  20. {
  21. public void cry()
  22. {
  23. System.out.println("老虎叫唤...");
  24. }
  25. }
  26. */
  27. IA tiger = new IA()
  28. {
  29. public void cry()
  30. {
  31. System.out.println("老虎叫唤...");
  32. }
  33. };
  34. System.out.println("tiger的运行类型 = " + tiger.getClass());
  35. tiger.cry();
  36. //正常new一个对象
  37. Father father1 = new Father();
  38. System.out.println("father1对象的运行类型是=" + father1.getClass());
  39. //匿名内部类
  40. Father father = new Father()
  41. {
  42. @Override
  43. public void test() {
  44. System.out.println("匿名内部类重写了test方法");
  45. }
  46. };
  47. System.out.println("father对象的运行类型=" + father.getClass());
  48. father.test();
  49. Animal animal = new Animal()
  50. {
  51. @Override
  52. public void say() {
  53. System.out.println("小狗吃骨头");
  54. }
  55. };
  56. animal.say();
  57. }
  58. }
  59. interface IA{
  60. public void cry();
  61. }
  62. class Father
  63. {
  64. public void test() {}
  65. }
  66. abstract class Animal
  67. {
  68. public void say()
  69. {}
  70. }

匿名内部类的使用细节

匿名内部类的定义比较特殊,本身是一个类同时还是一个对象

先定义一个匿名内部类,接收之后,再用生成的对象

不接收直接调用

  1. package Innerclass;
  2. public class AnonymousInnerClassDetail
  3. {
  4. public static void main(String[] args)
  5. {
  6. Outer05 outer05 = new Outer05();
  7. outer05.f1();
  8. }
  9. }
  10. class Outer05
  11. {
  12. private int n1 = 99;
  13. public void f1()
  14. {
  15. Person person = new Person()
  16. {
  17. @Override
  18. public void hi() {
  19. System.out.println("匿名内部类重写了hi");
  20. }
  21. };
  22. person.hi();
  23. //也可以直接调用
  24. new Person()
  25. {
  26. @Override
  27. public void hi() {
  28. System.out.println("匿名内部类重写了hi");
  29. }
  30. }.hi();
  31. }
  32. }
  33. class Person
  34. {
  35. public void hi()
  36. {
  37. System.out.println("Person hi");
  38. }
  39. }

匿名内部类的实践

匿名内部类主要用于当前类只使用一次,使用过后我们就不会再反复使用,这样我们就没有必要专门再写一个类。

  1. package Innerclass;
  2. public class InnerClassExercise01 {
  3. public static void main(String[]args)
  4. {
  5. f1(new IL() {
  6. @Override
  7. public void show() {
  8. System.out.println("这是一幅名画");
  9. }
  10. });
  11. }
  12. public static void f1(IL il)
  13. {
  14. il.show();
  15. }
  16. }
  17. interface IL
  18. {
  19. void show();
  20. }
  1. package Innerclass;
  2. public class InnerClassExercise02 {
  3. public static void main(String[] args)
  4. {
  5. CellPhone cellPhone = new CellPhone();
  6. cellPhone.alarmclock(new Bell() {
  7. @Override
  8. public void ring() {
  9. System.out.println("懒猪起床了");
  10. }
  11. });
  12. cellPhone.alarmclock(new Bell() {
  13. @Override
  14. public void ring() {
  15. System.out.println("小伙伴们上课");
  16. }
  17. });
  18. }
  19. }
  20. interface Bell
  21. {
  22. void ring();
  23. }
  24. class CellPhone{
  25. public void alarmclock(Bell bell)
  26. {
  27. bell.ring();
  28. }
  29. }

成员内部类

1、成员内部类是定义在外部类的成员位置,并且没有static修饰。

2、成员内部类可以直接访问外部类的所有成员,包括私有成员。

3、外部类访问内部类,就是直接创建一个内部类然后通过类进行访问。

4、我们可以用public、private、protected去修饰,因为它本身就是一个成员

  1. package Innerclass;
  2. public class MemberInnerClass {
  3. public static void main(String [] args) {
  4. Outer08 outer08 = new Outer08();
  5. outer08.t1();
  6. }
  7. }
  8. class Outer08{
  9. private int n1 = 10;
  10. public String name = "张三";
  11. class Inner08{
  12. public void say()
  13. {
  14. System.out.println("n1 = " + n1 + " name = " + name);
  15. }
  16. }
  17. public void t1(){
  18. Inner08 inner08 = new Inner08();
  19. inner08.say();
  20. }
  21. }

外部其他类使用成员内部类的两种方式

1、



2、

静态内部类

比上个内部类多了一个static修饰符

1、静态内部类,在外部类的成员位置,有static修饰

2、可以访问外部类的所有静态成员,非静态不能访问

3、作用域为整个类体

  1. package Innerclass;
  2. public class StaticInnerClass {
  3. public static void main(String[] args) {
  4. Outer10 outer10 = new Outer10();
  5. outer10.m1();
  6. }
  7. }
  8. //外部类
  9. class Outer10{
  10. private int n1 = 10;
  11. private static String name = "张三";
  12. //静态内部类,在外部类的成员位置,有static修饰
  13. //可以访问外部类的所有静态成员,非静态不能访问
  14. //作用域为整个类体
  15. static class Inner10{
  16. public void say(){
  17. System.out.println(name);
  18. }
  19. }
  20. public void m1(){
  21. Inner10 inner10 = new Inner10();
  22. inner10.say();;
  23. }
  24. }

Java内部类与匿名类的更多相关文章

  1. java内部类以及匿名类

    内部类 一个类内部定义的类称为内部类. 内部类允许把逻辑相关的类组织在一起,并控制内部代码的可视性. 内部类与外部类的结构层次如下. 顶层类:最外层的类 外部类:内部类所在的类 内部类:类内部定义的类 ...

  2. Java 内部类和匿名类 实现JButton动作 ActionListener类

    import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ControlCircle2 extend ...

  3. java内部类和异常类的概念

    1.内部类的外嵌类的成员变量在内部类中任然有效,内部类中的方法也可以调用外嵌类中的 方法,内部类中不可以声明类的变量和方法,外嵌的类体可以用内部类声明对象,作为外嵌类的成员.内部类仅供他的外嵌类使用. ...

  4. (转)Java基础——嵌套类、内部类、匿名类

    本文内容分转自博客:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内 ...

  5. Java中的内部类、匿名类的使用

    代码(test.java): interface ie{ public void print(); } class outer{} public class test{ public class in ...

  6. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  7. 【转】Java中的内部类和匿名类

       Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的 ...

  8. [改善Java代码]使用匿名类的构造函数

    建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...

  9. Java 中的 匿名类

    什么是内部类? 在一个类中定义另一个类,这样定义的类称为内部类.包含内部类的类称为内部类的外部类. 如果想要通过一个类来使用另一个类,可以定义为内部类. 内部类的外部类的成员变量在内部类仍然有效,内部 ...

  10. Java中的匿名类

    我们知道接口一般用于定义一种规范或操作协议,然后子类实现接口的所有功能.如下面的简单代码: 定义IMessage接口 package org.lyk.entities; public interfac ...

随机推荐

  1. 【Flyway】初识Flyway,将Flyway集成于Spring项目

    什么是Flyway Flyway官方网站:点击这里 官方描述: Flyway extends DevOps to your databases to accelerate software deliv ...

  2. 即构 SDK 6月迭代:新增拉流画面镜像等功能,为开发者提供更大便利

    即构SDK6月新版本已上线,本月SDK迭代主要新增了拉流画面镜像功能,媒体播放器新增支持缓存相关的设置,新增支持设置对焦模式和曝光模式等功能,多个功能模块的灵活设置,让开发者能更便利的自定义选择,为用 ...

  3. Description Resource Path Location

    解决办法 在项目上右键属性Properties,属性列表中选择Project Facets,在打开的Project Facets页面中的Java下拉列表中,选择相应版本. 有可能是java1.6 改成 ...

  4. nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

    一.插件实现 1.插件目录结构 2.pom依赖 <dependency> <groupId>com.alibaba.nacos</groupId> <arti ...

  5. JVM虚拟机栈

    JVM虚拟机栈 1.概述 1.1背景 由于跨平台性的设计,Java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降 ...

  6. js闭包的一些笔记

    闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...

  7. docker 安装 Influxdb-relay 使用

    转载请注明出处: 1.influxdb relay的作用和特性 数据转发:InfluxDB Relay 可以从一个或多个源(input)接收数据,并将其转发到一个或多个目标(output)的 Infl ...

  8. R2在全渠道业务线的落地

    随着业务的增长,系统的高频率迭代,质量保障工作迫切需要引入更加科学高效的测试方法来助力业务高质量的交付.长城项目一期测试中,全渠道质量团队引入技术平台部R2技术,极大的提升了项目交付的质量.因此,本文 ...

  9. UI获取元素的几种方式

    通过浏览器驱动获取页面元素的8种方式. 定位方法: 通过webdriver对象的find_element方法 通过 id获取元素 el = driver.find_element(By.ID,'id' ...

  10. 21.1 使用PEfile分析PE文件

    PeFile模块是Python中一个强大的便携式第三方PE格式分析工具,用于解析和处理Windows可执行文件.该模块提供了一系列的API接口,使得用户可以通过Python脚本来读取和分析PE文件的结 ...