博客
关于我
成员内部类、局部内部类、匿名内部类_hehe.base.11.3_over
阅读量:393 次
发布时间:2019-03-05

本文共 3451 字,大约阅读时间需要 11 分钟。

11.6 内部类的概念与分类

  • 分类:
    成员内部类
    局部内部类(包含匿名内部类
  • 成员内部类的定义格式:
修饰符 class 外部类名称 {    修饰符 class 内部类名称{    }}
package com.xww.day11.demo02;public class Body {    public class Heart{        //内部类的方法        public void beat(){            System.out.println("内部类方法");            System.out.println(name);//内部类使用外部类成员变量            method();//内部类使用外部类成员方法        }    }    //外部类成员变量    private String name;    //外部类方法    public void method(){        System.out.println("外部类方法");        new Heart().beat();//外部类使用内部类方法    }}

11.7 成员内部类的使用

  • 间接方式:在外部类的方法中,使用内部类,然后main只是调用外部类的方法
  • 直接方式外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
public static void main(String[] args) {        Body body = new Body();//定义外部类对象        body.method();//通过外部类对象,调用外部类的方法,里面间接使用内部类Heart        Body.Heart heart = new Body().new Heart();//定义内部类对象        heart.beat();    }

11.8 内部类的同名变量访问

  • 重名下内部类调用外部类成员变量格式外部类名称.this.外部类成员变量
public class Out {    int num = 10;//外部类成员变量    public class inner{        int num = 20;//内部类成员变量        public void method(){            int num = 30;//内部类局部变量            System.out.println(num);//30,局部            System.out.println(this.num);//20,内部            System.out.println(Out.this.num);//10,外部        }    }}

11.9 局部内部类定义

  • 定义:定一在方法内部的类
  • 局部:只有当前所属的方法才能使用它,出了这个方法,就不能使用
  • 格式
修饰符 class 外部类名称 { 	修饰符 返回值类型 外部类方法名(参数) {		class 局部内部类名称 {			//其他代码		}	}}
  • 定义一个类的时候,权限修饰符规则
    外部类:public/(default)
    成员内部类:public/protected/(default)/private
    局部内部类:什么都不写
public class Outer {    public void method(){        class Iner{            public void methodIner(){                System.out.println("局部内部类方法");            }        }        Iner iner = new Iner();//局部方法中定义局部类对象        iner.methodIner();//局部方法中调用局部类方法    }}

11.10 局部内部类的 final 问题

  • 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须final
  • 备注:从Java 8+开始,只要局部变量事实不变,那么final关键字可以省略。
  • 原因
    new出来的对象在堆内存当中。
    局部变量是跟着方法走的,在栈内存当中。
    方法运行结束之后,立刻出栈,局部变量就会立刻消失。
    但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。
public class MyOuter {    public void methodOuter() {       final int num = 10; // 所在方法的局部变量        class MyInner {            public void methodInner() {                System.out.println(num);            }        }    }}

11.11 匿名内部类

  • 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况就可以省略掉该类的定义,改为使用匿名内部类
  • 格式:
接口名称 对象名 = new 接口名称() {	//覆盖重写所有抽象方法;        };
package com.xww.day11.demo02;public class Demo02N {    public static void main(String[] args) {        //使用匿名内部类        MyInterface obj = new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        obj.method();    }}

11.12 匿名内部类的注意事项

  • 对格式“new 接口名称(){}"进行解析:
    new代表创建对象的动作
    接口名称就是匿名内部类需要实现哪个接口
    {} 这才是匿名内部类的内容
  • 匿名内部类,在创建对象的时候,只能使用唯一一次
  • 如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义实现类匿名对象,在调用方法的时候,只能调用唯一一次
  • 如果希望同一个对象,调用多次方法,那么必须给对象起个名字匿名内部类是省略了实现类/子类名称,但是匿名对象省略了对象名称
package com.xww.day11.demo02;public class Demo02N {    public static void main(String[] args) {        //使用匿名内部类        MyInterface obja= new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        obja.method();        MyInterface objb= new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        objb.method();                new MyInterface(){            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        }.method();    }}

转载地址:http://trrwz.baihongyu.com/

你可能感兴趣的文章
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>