博客
关于我
成员内部类、局部内部类、匿名内部类_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/

你可能感兴趣的文章
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
查看>>
localhost:5000在MacOS V12(蒙特利)中不可用
查看>>
logstash mysql 准实时同步到 elasticsearch
查看>>
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现< 以及> 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>