Java:内部类之成员内部类,内部类之匿名内部类
一、内部类的概念
所谓内部类(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:内部类之成员内部类,内部类之匿名内部类相关推荐
- java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...
1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...
- java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)
final关键字: final表示最终的不可变的,在java中可以用来修饰类或方法.局部变量.成员变量. // 1.final关键字修饰类需要放在class关键字前面,表示不可变的类,需要注意,这里表 ...
- java内部类之成员内部类、局部内部类和匿名内部类
内部类概念 一个类中包含另外一个类. 分类 成员内部类. 局部内部类(包含匿名内部类). 成员内部类 定义格式: 修饰符 class 类名称 {修饰符 class 类名称 {//...}//... } ...
- 【java笔记】成员内部类 局部内部类 匿名内部类
内部类:一个类的内部包含另一个类 如:身体和心脏的关系,汽车和发动机的关系 分类:(1)成员内部类 (2)局部内部类(包含匿名内部类) 成员内部类: 定义格式:修饰符 class 外部类名称{ 修饰符 ...
- JAVA基础——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
成员内部类 静态内部类 局部内部类 匿名内部类 1.成员内部类(实例内部类.非静态内部类) 成员内部类中不能写静态属性和方法 实例化内部类,首先需要实例化外部类,通过外部类去调用内部类 作用 要想 ...
- java局部内部类_Java 局部内部类、匿名内部类详解
外部类与内部类 众所周知,每个java文件必须有一个与这个java文件同名的外部类,这个外部类可以是public或default的.而除了这个同名外部类,还可以有与这个同名外部类平级的其他外部类,但它 ...
- 面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?
1 内部类的概念 内部类是定义在另一个类中的类:下面类B是类A的内部类.即内部类对象引用了实例化该内部对象的外围类对象. public class A{class B {} } 2 为什么需要内部类? ...
- Java的(((φ(◎ロ◎;)φ))) 实例(成 员)内部类、局部内部类、匿名内部类和静态内部类。
关于让你晕头的Java类 总结 2.细枝末节 小试牛刀 Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia! # 梳理一下 # 前言 Java里有各种各样 ...
- 内部类(成员内部类+局部内部类+静态内部类+匿名内部类)
内部类的定义:在java中,允许在一个类的内部定义类,称为内部类,这个内部类所在的类称为外部类.内部类定义在外部内的内部,通常只服务于外部类,对于其他外部是不具备可见性的. 内部类应用场景:1.当某个 ...
- Java学习第十二天----方法参数类型以及返回值类型问题、链式编程、package包、权限修饰符、内部类、成员内部类
Java学习第十二天----方法参数类型以及返回值类型问题.链式编程.package包.权限修饰符.内部类.成员内部类 1.方法参数类型: (1)类名作为形式参数: public class MyTe ...
最新文章
- 2020考研 统考英语 核心词汇:社会生活(1)(苗嘉)
- python整数类型-Python 的数值类型(整数、长整数、浮点数和复数)
- kettle使用数据库来生成序列_Kettle的安装和使用
- 编译成功但链接失败的原因
- 在往sql server 插入数据时 报此错误“ 消息 8152,级别 16,状态 14,第 1 行 将截断字符串或二进制数据。”...
- [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析
- 可以在没有main()的情况下编写C程序吗?
- 关于java.net.URLEncoder.encode编码问题
- JDK 11 还有一个处于计划阶段的 JEP:让其支持 TLS 1.3
- 【新年礼物】阿里资深p8教你学习Web全栈架构师!
- Android程序设置软件图标
- 7.20-7.24(2)
- 好的架构不是设计出来的,而是演进出来的
- SelfUpdate 树不起作用
- niceScroll相关配置参数
- java详细教程_java超详细教程适合初学者深入掌握Java知识.ppt
- 佳能Canon PIXMA MP492 打印机驱动
- 2021张家界五一出行攻略
- 数学思维导图学习方法
- uniapp调用c语言方法,使用uniapp开发的app/小程序需要注意: