一、内部类的概念

  所谓内部类(Inner Class),顾名思义,就是将一个类定义在另一个类的内部。

内部的类称之为内部类

        pubic class Outer{

                        class Inner{

                        //省略

        }

}

内部类的主要特点:

        内部类可以很好的实现隐蔽,可以使用protected  private修饰符

        内部类可以直接访问外部类的所有成员,包括私有成员

        外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问

内部类可以很好的实现隐蔽,可以使用protected  private修饰符:

里面的类可以做成private供外面的类使用

成员内部类及应用

        成员内部类属于外部类的实例成员,成员内部类可以有public        private         default        protected权限修饰符。在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”         和        “外部类名.this.成员属性”的形式

        创建成员内部类的实例使用“外部类名.内部类名      实例   =     外部类实例名.new        内部类构造方法(参数)” 的形式

(内部类其实也分好几种,成员内部类其实是其中经常用的一种使用方式)

新建一个工程

那我们做一个内部类,一个类里面又有一个类

那我们如何使用呢?比如我现在要调用System.out.println("内部类打印");如何调用

  创建成员内部类的实例使用“外部类名.内部类名      实例   =     外部类实例名.new        内部类构造方法(参数)” 的形式

先要把外部化实例出来

Outer      o   =  new      Outer();

外部类名.内部类名      实例   =     外部类实例名.new        内部类构造方法(参数)

Outer.          Inner         test    =         o            .new          Inner();

这样才能调用test  里面的InnerPrint();

运行结果

也就是说你调用内部类里面的某个方法,必须先提供一个外部类的对象,先实例化一个外部类的对象,然后通过已经存在的对象调用new,通过已经存在的对象,来创建一个内部类的实例

所以先要有外部类的对象,才能有内部类的对象

最终才能调用内部类对象的函数去做一些事情

成员内部类属于外部类的实例成员,成员内部类可以有public        private         default        protected权限修饰符。在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”         和        “外部类名.this.成员属性”的形式

我们看一下能不能在void InnerPrint()   调用 void printData()

外部类名.this.成员方法

Outer     .this.    printData();

运行结果

那我能不能在内部类访问外部类的变量         第12行

我实例化的时候给data加上一个初值       o.data=100;

运行结果

那么外部类可不可以访问内部类里面的东西呢?

外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问

不可以上面这样用,需要先建立内部类的对象才能访问

Inner i = new Inner();

运行结果

修改一下

运行结果

一般来说在内部类去访问外部类的变量或函数  多一点

外部类访问内部类没什么特别大的意义

二、匿名内部类及应用

匿名内部类的特点:

       · 匿名内部类是没有名称的内部类,没有办法引用他们。必须在创建的时,作为new语句的一部分来声明并创建他们的实例

       · 匿名内部类必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口,所有父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法

 语法:实例 

                new interface/superclass(){类体}

        这种形式的new 语句声明一个新的匿名类,它对一个给定的类进行拓展,或者实现一个给定的接口,并同时创建改匿名类的一个新实例

我们前面写的内部类有个Inner和Outer,Inner就是内部类的名称,匿名内部类是没有这个东西的

那匿名内部类是干什么的?没办法给他赋个属性

int data;

没办法实现里面的方法体

void InnerPrint(){
                                                            System.out.println("内部类打印");
                                                                    Outer.this.printData();
                                                                    System.out.println("外部类data="+Outer.this.data);
                                                                        }

新建一个工程,匿名内部类其中的一个用法就是一个抽象类

我们new 一个Demo1它会有错误

Cannot instantiate the type Demo1

不能初始化Demo1

什么时候可以呢?我们即初始化它,又实现里面的方法

这就不是我们说的真正意义上的实例化Demo1,而是创建了一个匿名的内部类,同时给匿名内部类做了一个实例

那我么如何执行里面的 printInfo()

直接.

因为new Demo1() 的返回值就是一个对象嘛

对象的尾巴这面可以直接调用printInfo();

这就是做了一个匿名内部类,同时创建了一个匿名内部类的实例,实例可以调用

还有一种方法就是用多态的方式了

new Demo1() 是一个对象 我可以把他的父对象的声明给他

Demo1 d = new Demo1()

这样看下去像是实例化了一个Demo1 ,其实不是的,这个new Demo1 实际上是它的子类,是一个匿名内部类,属于抽象类的子类

d.printInfo为什么可以呢?这是多态的东西

运行结果

同样的我们定义一个接口也是一样的

你去new 一个接口的时候也是一样的,也是做了一个匿名内部类,去实现里面的interprint

同样的我们可以通过.来调用

运行结果

注意:匿名内部类是new 了一个抽象或者new 了一个接口,

我们在新创建了一个匿名内部类的时候,也创建了一个实例

Java:内部类之成员内部类,内部类之匿名内部类相关推荐

  1. java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...

    1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...

  2. java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

    final关键字: final表示最终的不可变的,在java中可以用来修饰类或方法.局部变量.成员变量. // 1.final关键字修饰类需要放在class关键字前面,表示不可变的类,需要注意,这里表 ...

  3. java内部类之成员内部类、局部内部类和匿名内部类

    内部类概念 一个类中包含另外一个类. 分类 成员内部类. 局部内部类(包含匿名内部类). 成员内部类 定义格式: 修饰符 class 类名称 {修饰符 class 类名称 {//...}//... } ...

  4. 【java笔记】成员内部类 局部内部类 匿名内部类

    内部类:一个类的内部包含另一个类 如:身体和心脏的关系,汽车和发动机的关系 分类:(1)成员内部类 (2)局部内部类(包含匿名内部类) 成员内部类: 定义格式:修饰符 class 外部类名称{ 修饰符 ...

  5. JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类   作用 要想 ...

  6. java局部内部类_Java 局部内部类、匿名内部类详解

    外部类与内部类 众所周知,每个java文件必须有一个与这个java文件同名的外部类,这个外部类可以是public或default的.而除了这个同名外部类,还可以有与这个同名外部类平级的其他外部类,但它 ...

  7. 面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?

    1 内部类的概念 内部类是定义在另一个类中的类:下面类B是类A的内部类.即内部类对象引用了实例化该内部对象的外围类对象. public class A{class B {} } 2 为什么需要内部类? ...

  8. Java的(((φ(◎ロ◎;)φ))) 实例(成 员)内部类、局部内部类、匿名内部类和静态内部类。

    关于让你晕头的Java类 总结 2.细枝末节 小试牛刀 Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia! # 梳理一下 # 前言 Java里有各种各样 ...

  9. 内部类(成员内部类+局部内部类+静态内部类+匿名内部类)

    内部类的定义:在java中,允许在一个类的内部定义类,称为内部类,这个内部类所在的类称为外部类.内部类定义在外部内的内部,通常只服务于外部类,对于其他外部是不具备可见性的. 内部类应用场景:1.当某个 ...

  10. Java学习第十二天----方法参数类型以及返回值类型问题、链式编程、package包、权限修饰符、内部类、成员内部类

    Java学习第十二天----方法参数类型以及返回值类型问题.链式编程.package包.权限修饰符.内部类.成员内部类 1.方法参数类型: (1)类名作为形式参数: public class MyTe ...

最新文章

  1. 2020考研 统考英语 核心词汇:社会生活(1)(苗嘉)
  2. python整数类型-Python 的数值类型(整数、长整数、浮点数和复数)
  3. kettle使用数据库来生成序列_Kettle的安装和使用
  4. 编译成功但链接失败的原因
  5. 在往sql server 插入数据时 报此错误“ 消息 8152,级别 16,状态 14,第 1 行 将截断字符串或二进制数据。”...
  6. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析
  7. 可以在没有main()的情况下编写C程序吗?
  8. 关于java.net.URLEncoder.encode编码问题
  9. JDK 11 还有一个处于计划阶段的 JEP:让其支持 TLS 1.3
  10. 【新年礼物】阿里资深p8教你学习Web全栈架构师!
  11. Android程序设置软件图标
  12. 7.20-7.24(2)
  13. 好的架构不是设计出来的,而是演进出来的
  14. SelfUpdate 树不起作用
  15. niceScroll相关配置参数
  16. java详细教程_java超详细教程适合初学者深入掌握Java知识.ppt
  17. 佳能Canon PIXMA MP492 打印机驱动
  18. 2021张家界五一出行攻略
  19. 数学思维导图学习方法
  20. uniapp调用c语言方法,使用uniapp开发的app/小程序需要注意:

热门文章

  1. 在编译内核时出现uudecode错误
  2. 华为的鸿蒙系统营销,全球第一款搭载华为鸿蒙系统的荣耀智慧屏终端在万众期待中正式上线销售...
  3. Vivo FunTouch OS 手机系统内置铃声免费下载
  4. linux下配置jdk+tomcat
  5. 12月20日学习内容整理:博客系统之media配置
  6. vector基础操作
  7. 克服大数据技能差距的策略
  8. Java总结第一次//有些图片未显示,文章包含基础java语言及各种语句
  9. java 线程的几种状态(转载)
  10. mysql_result()函数的简单使用