我的Android第二章
前言
之前有很多人遇到了关于内部类的问题【主要在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第二章相关推荐
- 第一行代码Android第二章读书笔记
第一行代码Android第二章读书笔记 Activity 1.1 手动创建活动 1.2 Toast和Menu/销毁活动 Intent 2.1 显示/隐式 2.2 传递/返回数据 活动的生命周期 3.1 ...
- Android 第二章 本地文件的读写
读写的第一种方式: 使用最初始的IO方式读写到应用包目录下面 package com.example.login;import java.io.BufferedReader; import java. ...
- Android深度探索读后感第二章
第二章 搭建Android开发环境 Android底层开发的环境,主要包括:Android应用程序开发环境,Android NDK开发环境和交叉编译环境的搭建. Android应用程序开发环境:第一 ...
- 第二章:Android游戏开发之前台渲染
1.布局管理 安卓的四种布局模式: 线性布局 表格布局 相对布局 单帧布局 坐标布局 目前安卓建议不要用坐标布局,容易因屏幕尺寸或者其他问题产生问题.这几种布局我没有展开说,是因为就是拖拽就可以实现, ...
- Android 渗透测试学习手册 第二章 准备实验环境
第二章 准备实验环境 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在上一章中,我们了解了 Android 安全性及其体系结构的基础知识. 在本章中,我们将了解如何 ...
- 浅入浅出 Android 安全:第二章 Android Linux 内核层安全
第二章 Android Linux 内核层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 作为最广为人知的开源项目之一 ...
- 从零开始Android游戏编程(第二版) 第二章 创建第一个程序Hello Tank
第二章 创建第一个程序Hello Tank 难度:容易 现在开始,我们要真正写作Android程序了.虽然前面安装过程那么复杂,但是写起程序来却是非常简单.而且为了让大家有一个直观的认识,本文不会叙述 ...
- 第二章:Android之NDK配置与简单使用
使用Android开发App不只是使用Java,还可以使用C/C++,这就是我们要使用NDK的目的 -- 为了能让Java识别所要调用的C/C++. 第二章 NDK配置与简单使用 前言 对于有过开发跨 ...
- Android群英传笔记——第二章:Android开发工具新接触
Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...
- Android性能优化(第二章)
这章就当填坑了,姑且也算是性能优化吧 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 0x00 集合处理 对一些list和数组的操作其实Java已经帮我们做了不少功课了,回想起来在一些使用场景中笔者还傻乎乎的写一堆f ...
最新文章
- C C++编程产生指定范围内的随机数
- 华为手机怎么调出云相册_华为云手机引关注!将替代传统手机?华为回应来了...
- 变种 背包问题_动态规划入门——传说中的零一背包问题
- 【小白学习C++ 教程】九、C++中字符型、字符串和转义字符
- java安卓获取mac_android开发分享以编程方式获取Android设备的MAC
- jqurey操作radio总结
- 前端学习(2262)vue造轮子框架搭建
- Method for Discovering Network Topology中文翻译【Z-Stack Home 1.2.0开发文档】
- 计算机视觉论文-2021-07-02
- JSP页面是否需要重新编译--checkInterval
- 【极客学院出品】Cocos2d-X系列课程之六-用户交互事件处理方法
- fcpx教程从入门到精通「3」预览窗口的认识
- jquery 弹出层
- Session过期,跳出iframe框架页显示会话过期页面
- BZOJ1397 : Ural 1486 Equal squares
- 傻傻分不清桃花,杏花,樱花,梨花,李花,海棠花?
- 论文阅读——LSQ:Learned Step Size Quantization
- 一年级课程表(4月18日-4月22日)
- 2013-1-20·
- 专为《巫师3》打造 次世代RedEngine 3引擎公布
热门文章
- 《TensorFlow技术解析与实战》——1.1 什么是人工智能
- Android深入四大组件(一)应用程序启动过程
- Unity游戏画面品质增强,shader和贴图
- Json Formatter 1.0 Json格式化工具
- gateway nacos注册服务_第二篇 Spring Cloud Alibaba实战(一)Nacos服务注册与发现
- mac搭建k8s练习环境
- 多线程同步执行,CountDownLatch使用
- ReentrantLock可重入锁的使用
- springboot的restful接口成功失败返回值设计
- osgi java web_在Tomcat中使用Java Web应用程序的OSGi软件包