我的Android第二章

时间:2023-02-07 10:40:43

前言

之前有很多人遇到了关于内部类的问题【主要在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");
}
}
//方法中才能访问Inner
Inner 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();
}
}

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

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

  

我的Android第二章的更多相关文章

  1. 疯狂Android第二章:Adapter以及部分控件使用

    第二章 重点:1.理解View以及各种布局的优缺点,适用场景. 2.熟练掌握adapter原理与用法. 3.熟悉其它控件的基本使用方法. /////////////////////////////// ...

  2. 我的Android第二章:Android目录结构

    嗨!各位,小编又和大家分享知识啦,在昨天的博客笔记中小编给大家讲解了如何去配置Android工具以及SDK中的一些配置,那在今天的学习小编会带给大家哪些Android知识呢?首先我们看一下今天的学习目 ...

  3. [Learn Android Studio 汉化教程]第二章:Android Studio概述(一)

    [Learn Android Studio ]第二章:Android Studio概述(一) Android Studio是一个视窗化的开发环境.为了充分利用有限的屏幕空间,不让你束手束脚,Andro ...

  4. Android群英传》读书笔记 (1) 第一章 Android体系与系统架构 + 第二章 Android开发工具新接触

    第一章 Android体系与系统架构 1.Dalvik 和 ARTDalvik好比是一辆可折叠的自行车,平时是折叠的,只有骑的时候,才需要组装起来用.ART好比是一辆组装好了的自行车,装好就可以骑了. ...

  5. Android 系统移植与驱动开发--第二章搭建Android环境核心步骤及心得

    第二章 搭建Android 开发环境 虽然在这一章中讲的是Android底层开发环境,但是相应伴随的还有Android NDK程序来测试Linux驱动,HAL程序库.底层开发不仅需要交叉编译环境,还要 ...

  6. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  7. Android开发艺术探索——第二章:IPC机制(中)

    Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开 ...

  8. Android开发艺术探索——第二章:IPC机制(上)

    Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...

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

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

随机推荐

  1. git流程及操作

    一.git认识 git是什么?Git是目前世界上最先进的分布式版本控制系统 二.git安装 三.git创建本地库 1.首先选择e盘新建一个文件夹如douban 2.点击鼠标右键,执行Git Bash ...

  2. <context:component-scan>配置解析(转)

    在xml配置了这个标签后,spring可以自动去扫描base-pack下和其子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注 ...

  3. 图片ppm编码格式

    ppm图片有2种格式, ASCII格式和binary格式. (1)ppm头部分 由三部分组成,这三部分由回车或换行分割,但PPM的标准中是要求空格. 第一行通常是P3或P6,说明是PPM格式: 第二行 ...

  4. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

  5. 编译Uboot时提示error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

    在Ubuntu14.04 64位系统中已经安装了libc6:i386的库,编译Uboot时提示error while loading shared libraries: libz.so.1: cann ...

  6. 洛谷 P3616 富金森林公园 [树状数组]

    传送门 维护一个山脉,单点修改,查询有多少山峰高出水面 我是沙茶沙茶题都不会做只想到无修改可以用扫描线 答案就是所有比水面高的-相邻都比水面高的啊 因为没有区间询问写个$BIT$都可以 有区间询问?可 ...

  7. canvas生成海报

    虽然之前也做过类似的生成海报的项目,但是这个项目我又网上查找了一下,发现一个插件挺好用的  html2canvas.js http://html2canvas.hertzen.com/这里可以下载这个 ...

  8. JMeter 脚本开发(五)

    一.JMeter 元件运行顺序 执行顺序逻辑如下: 1.配置元件(如果存在) 2.前置处理器(如果存在) 3.定时器(如果存在) 4.取样器(如果存在) 5.后置处理器(如果存在且取样器的结果不为空) ...

  9. C# 无法在发送 HTTP 标头之后进行重定向

    在调试中发现错误如下: Response.Redirect引起的“无法在发送HTTP标头之后进行重定向” 跳转失败 解决方案如下: 使用js方法来跳转地址 const string url=&quot ...

  10. Function学习

    ---恢复内容开始--- Function的定义: 1.函数声明 function sum1(){ alert("sum1") } 2.函数表达式 var sum2 = funct ...