前言

之前有很多人遇到了关于内部类的问题【主要在android的学习之中会大量的使用到】,内部类是什么,内部类怎么定义,内部类的分类,内部类的好处,内部类如何访问,这里我们来结合代码简单的理解一下

1.内部类是什么?

  当一个类的定义是在另一个类的内部,那么我们就把这个定义在类的内部的类为内部类.

  上代码:

public class Outer{class Inner{public void show(){System.out.println("我是内部类");      } }
}            

  这段代码中Outer类相对Inner是外部类,其中Inner是一个类,它定义在Outer类内部,那它就是内部类.

2.内部类的分类?

  内部类主要通过类在外部类中的位置来区分

  1.成员内部类{成员级别的类}

  位置:类中方法外定义的类

  顾名思义这个类是定义在外部类的成员中

  上代码:

public class Outer{private String aa ;class Inner{public void show(){System.out.println("我是成员内部类");}  }public void show(){System.out.println("Inner类没有定义在我这方法中");}
}

  可以看到,Inner类是与成员aa是一个级别的都是定义在类中方法外的级别,他们统一是成员级别的,像这种情况下定义的类,我们就叫他成员内部类,成员内部类重点就是定义在类中方法外部

  2.方法内部类[局部内部类]

  位置:类中方法内定义的类.

  这个类的定义是在类的内部方法的内部

  上代码:

public class Outer{private String str;public void show(){System.out.println("我是show方法");class Inner{public void InnerMethod(){System.out.prinltn("我是局部内部类");}}}
}    

  我们可以看到代码中内部类的定义位置在类中方法内,这样的类我们称之为局部内部类,有的地方也叫方法内部类

  3.匿名内部类

  特点:是局部内部类的简化形式

  前提:存在一个借口或者类

  格式: new 类名或者接口名称(){

    //要重写接口或者类的方法

  };

  代码:

  提供一个类或者接口,这里我们提供一个接口MyInter:

public interfact MyInter{public void show();
}

  提供一个类Outer来体现匿名内部类:

public class Outer{public void show(){MyInter m = new MyInter(){public void show(){System.out.println("我是匿名内部类");}};}}    

3.内部类的访问和好处

  1.成员内部类的访问和好处

    (1)访问规则

    成员内部类可以访问外部类的资源,包括私有,外部类想要访问内部类成员必须创建对象

    基本语法是 外部类名.内部类名 对象名 = new 外部类名().new 内部类名();

public class Outer{private String s ;class Inner{private String s ;public void show(){System.out.println("你好"); System.out.println(s);                                  //访问外部类的成员
     }  }public static void main(String[] args){Outer.Inner inner = new Outer().new Inner();//这是统一的访问方式  inner.s ="2" ;//外部类访问内部类资源
   }}    

  2.静态内部类的访问规则

  语法:外部类名.内部类名 对象名 = new 外部类名.内部类名();

public class Outer{static class Inner{public void show(){System.out.println("你好");}  }public static void main(String [] args){Outer.Inner inner = new Outer.Inner();//静态内部类的访问方法
        inner.show();}
}                

   3.根据访问修饰符还可以有private,protected修饰的类

    外部类不能被private,protected修饰,但是内部类可以

public class Outer{private class Ts{}protected class Ta{}}

-----------注意:使用private修饰的类为了数据的安全,使用static修饰的类访问更方便--------------

  4.局部内部类的好处和访问语法

  好处:保护数据的安全

  代码:

public class  Outer{public void show(){private final int a ;class Inner{//成员内部类不能被private,public,protected修饰public void meth(){System.out.println("我是局部内部类");
System.out.println("访问show方法变量a"+a+",这个变量必须加final");}}//方法中才能访问InnerInner i = new Inner();i.meth();}
}    

  注意:局部内部类访问的局部变量必须加final修饰,局部内部类的访问只能在方法内部new

  好处是:可以随着方法的调用完毕而销毁

  5.匿名内部类的使用和好处[Android中常见的调用方法]

  1)先看一个例子,简单的多态

       定义一个接口MyInter

public interface MyInter{public void show();
}

  2)此时我们想实现这个接口,调用方法,所以我们可以定义一个类实现MyInterImpl1接口

public class MyInterImpl1 implements Myinter{public void show(){System.out.println("我是实现接口一");}
}

   3)定义测试类MainTest

public class MainTest{public static void main(String[] args){MyInter i = new MyInterImpl1();//根据多态原则我们调用
      i.show();///输出我是实现接口一
   }
}

  4)问题来了:我还想要一个实现类或者说我的某个方法中需要一个MyInter的实现类,根据多态原则,我们需要一个与MyInterImpl1不一样的实现类

    简单,我们在定义一个

public class MyInterImpl2 implements Myinter{public void show(){System.out.println("我是实现接口二");}
}

5)同样调用

public class MainTest{public static void main(String[] args){MyInter i = new MyInterImpl2();//根据多态原则我们调用
      i.show();///输出我是实现接口二
   }
}

   6)但是此时我们有问题了,我们可能有很多的需要实现的地方,当时有的时候这些实现的类可能仅仅只是使用一次,我们就可能不会在调用,

    难道我们都要给他们专门写一个类来描述吗?假设现在MyInterImpl3这个类实现了MyInter,方法描述中提供了一个添加的算法

public class MyInterImpl2 implements Myinter{public void show(){System.out.println(1+2);}
}

    上面的代码我们可能只执行一次,我们只调用一次,这个时候怎么办,java提供了一个概念,匿名内部类

    改变MainTest中的代码:

public class MainTest{public static void main(String[] args){//下面我们使用匿名内部类的语法   MyInter i = new MyInter(){public void show(){System.out.println("你好,我是匿名内部类”);
          }  };i.show();}
}

  上面的代码中,我们可以看到,类名或者接口名 对象名 = new 类名或者接口名(){

      //实现代码

    };这样的语法

    这样的好处第一个可以体现出来,我们可以看到,无需再新建一个类来实现MyInter接口,只需要提供一个匿名内部类,他就像直接实现了MyInter接口一样,

  实现里面的方法,实例化接口,调用接口的方法,根据多态,实则调用实例化类的方法,这就是匿名内部类的第一个好处;

  我们再来看看

public class MainTest{public static void main(String[] args){mainShow(?????);//这里我们可以怎么用到匿名内部类呢?
   }static void mainShow(MyInter i){i.show();}
}

  代码改写:

public class MainTest{public static void main(String[] args){mainShow(new MyInter(){public void show(){System.out.println("我是匿名内部类");}});}static void mainShow(MyInter i){i.show();}
}        

  代码改变后,可以看到,匿名内部类作为参数传递,那么可以大胆的想到参数是随着方法调用完毕由虚拟机回收的,那么匿名内部类作为参数传递,我们可以认为匿名内部类可以减少资源的消耗

以上是我对内部类的一些理解,如果有什么建议,希望大家一起讨论

  

转载于:https://www.cnblogs.com/sunpiaoliang187/p/6069651.html

我的Android第二章相关推荐

  1. 第一行代码Android第二章读书笔记

    第一行代码Android第二章读书笔记 Activity 1.1 手动创建活动 1.2 Toast和Menu/销毁活动 Intent 2.1 显示/隐式 2.2 传递/返回数据 活动的生命周期 3.1 ...

  2. Android 第二章 本地文件的读写

    读写的第一种方式: 使用最初始的IO方式读写到应用包目录下面 package com.example.login;import java.io.BufferedReader; import java. ...

  3. Android深度探索读后感第二章

    第二章 搭建Android开发环境 Android底层开发的环境,主要包括:Android应用程序开发环境,Android  NDK开发环境和交叉编译环境的搭建. Android应用程序开发环境:第一 ...

  4. 第二章:Android游戏开发之前台渲染

    1.布局管理 安卓的四种布局模式: 线性布局 表格布局 相对布局 单帧布局 坐标布局 目前安卓建议不要用坐标布局,容易因屏幕尺寸或者其他问题产生问题.这几种布局我没有展开说,是因为就是拖拽就可以实现, ...

  5. Android 渗透测试学习手册 第二章 准备实验环境

    第二章 准备实验环境 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在上一章中,我们了解了 Android 安全性及其体系结构的基础知识. 在本章中,我们将了解如何 ...

  6. 浅入浅出 Android 安全:第二章 Android Linux 内核层安全

    第二章 Android Linux 内核层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 作为最广为人知的开源项目之一 ...

  7. 从零开始Android游戏编程(第二版) 第二章 创建第一个程序Hello Tank

    第二章 创建第一个程序Hello Tank 难度:容易 现在开始,我们要真正写作Android程序了.虽然前面安装过程那么复杂,但是写起程序来却是非常简单.而且为了让大家有一个直观的认识,本文不会叙述 ...

  8. 第二章:Android之NDK配置与简单使用

    使用Android开发App不只是使用Java,还可以使用C/C++,这就是我们要使用NDK的目的 -- 为了能让Java识别所要调用的C/C++. 第二章 NDK配置与简单使用 前言 对于有过开发跨 ...

  9. Android群英传笔记——第二章:Android开发工具新接触

    Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...

  10. Android性能优化(第二章)

    这章就当填坑了,姑且也算是性能优化吧 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 0x00 集合处理 对一些list和数组的操作其实Java已经帮我们做了不少功课了,回想起来在一些使用场景中笔者还傻乎乎的写一堆f ...

最新文章

  1. C C++编程产生指定范围内的随机数
  2. 华为手机怎么调出云相册_华为云手机引关注!将替代传统手机?华为回应来了...
  3. 变种 背包问题_动态规划入门——传说中的零一背包问题
  4. 【小白学习C++ 教程】九、C++中字符型、字符串和转义字符
  5. java安卓获取mac_android开发分享以编程方式获取Android设备的MAC
  6. jqurey操作radio总结
  7. 前端学习(2262)vue造轮子框架搭建
  8. Method for Discovering Network Topology中文翻译【Z-Stack Home 1.2.0开发文档】
  9. 计算机视觉论文-2021-07-02
  10. JSP页面是否需要重新编译--checkInterval
  11. 【极客学院出品】Cocos2d-X系列课程之六-用户交互事件处理方法
  12. fcpx教程从入门到精通「3」预览窗口的认识
  13. jquery 弹出层
  14. Session过期,跳出iframe框架页显示会话过期页面
  15. BZOJ1397 : Ural 1486 Equal squares
  16. 傻傻分不清桃花,杏花,樱花,梨花,李花,海棠花?
  17. 论文阅读——LSQ:Learned Step Size Quantization
  18. 一年级课程表(4月18日-4月22日)
  19. 2013-1-20·
  20. 专为《巫师3》打造 次世代RedEngine 3引擎公布

热门文章

  1. 《TensorFlow技术解析与实战》——1.1 什么是人工智能
  2. Android深入四大组件(一)应用程序启动过程
  3. Unity游戏画面品质增强,shader和贴图
  4. Json Formatter 1.0 Json格式化工具
  5. gateway nacos注册服务_第二篇 Spring Cloud Alibaba实战(一)Nacos服务注册与发现
  6. mac搭建k8s练习环境
  7. 多线程同步执行,CountDownLatch使用
  8. ReentrantLock可重入锁的使用
  9. springboot的restful接口成功失败返回值设计
  10. osgi java web_在Tomcat中使用Java Web应用程序的OSGi软件包