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

你可能感兴趣的文章
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>