李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
类和接口的嵌套(二) -- 非静态嵌套类
Leefs
2019-10-25 PM
1824℃
0条
# 类和接口的嵌套(二)-- 非静态嵌套类 ### 一、非静态嵌套类的特点 ##### 1. 实例化内部类必须先实例化一个外部类。 ##### 2. 内部类实例与外部类实例相关联,所以不能在内部类中定义任何静态成员。 ##### 3. 内部类是非静态的。 ### 二、成员内部类 概念:在**外部类中**并且在**外部类的方法外**创建的非静态嵌套类 > 代码示例 ```java class Animal{ class Dog{ } } ``` **总结:成员内部类就是外部类的一个非静态成员而已。** 成员内部类代码: ```java public class Animal2 { private String typeDog = "中华田园犬"; //外部类成员方法 public void type(){ System.out.println("犬科类动物......"); } class Dog{ //访问外部类的私有数据成员 void getData(){ System.out.println("Dog type is "+typeDog); } //访问外部类的成员方法 void getType(){ Animal2.this.type(); } } public static void main(String[] args) { //首先必须实例化外部类 Animal2 animal2 = new Animal2(); Animal2.Dog dog = animal2.new Dog(); dog.getData(); dog.getType(); } } ``` > 运行结果 ```java Dog type is 中华田园犬 犬科类动物...... ``` > 代码分析 1. typeDog:外部类的数据成员 2. type:外部类成员方法 3. Dog:非静态内部类 4. 1.在内部类Dog中添加一个getData()和getType()方法,分别访问外部类的数据成员typeDog和成员方法type() 5. 2.实例化外部类Animal2和Dog 6. 3.调用Dog内部类的getData()方法和getType()方法 ### 总结 **访问外部类的成员方法:** 访问外部类的成员方法时,可以直接通过`外部类名.this.外部类成员方法()`来调用,或者直接使用`外部类成员方法()`来调用。 **成员内部类工作方式:** Java 编译器创建了两个`.class`文件,其中一个是成员内部类`Animal2$Dog.class`,成员内部类文件名格式为`外部类名$成员内部类名`。 如果想创建成员内部类的实例,必须先实例化一个外部类,接着,通过外部类的实例来创建成员内部类的实例 。 因此成员内部类的实例必须存在于一个外部类的实例中。另外,由于内部类的实例与外部类的实例相关联,因此它不能定义任何静态成员。 ### 三、局部内部类 局部内部类(Local inner class)通常定义在一个块中。所以通常你会在一个方法块中找到局部内部类。 正如局部变量那样,局部内部类的作用域受到方法的限制。它可以访问**外部类**的所有成员,和它所在的局部方法中所有局部变量。 如果你想调用局部内部类中的方法,你必须先在局部方法中实例化局部内部类。 > 代码示例 ```java public class Animal3 { private String typeDog = "中华田园犬"; //实例方法 void Canine(){//犬科类 //局部内部类 class Dog{ void show(){ System.out.println(typeDog); } } //访问局部内部类中的方法 Dog dog = new Dog(); dog.show(); } public static void main(String[] args) { Animal3 animal3 = new Animal3(); animal3.Canine(); } } ``` > 输出结果 ```java 中华田园犬 ``` > 局部内部类规则 + 1.无法从方法外部调用局部内部类 + 2.局部内部类不能被声明为`private, public, protected` + 3.在`JDK1.7`之前局部内部类不能访问非`final`的局部变量,但是在`JDK1.8`及之后是可以访问非`final`的局部变量的。 ### 四、匿名内部类 概念: 在 Java 中没有命名的内部类称为匿名内部类,当我们需要重写类或接口中的方法时,都会使用到它。匿名内部类在使用的时候将同时声明和实例化。 匿名内部类的创建方式 1. 1.通过`类`进行创建(抽象类或其他类) 2. 2.通过`接口`进行创建 > 代码示例 通过类创建匿名内部类 ```java abstract class Animl4{ abstract void Dog(); } public class mainTest { public static void main(String[] args) { //使用匿名内部类实例化抽象类Animl4 Animl4 animl4 = new Animl4() { @Override void Dog() { System.out.println("中华田园犬"); } }; animl4.Dog(); } } ``` > 输出结果 ```java 中华田园犬 ``` > 代码分析 ```java Animl4 animl4 = new Animl4() { void Dog() {System.out.println("中华田园犬");} }; ``` 上方代码的作用: 1. 1.创建一个匿名内部类,它的名称由编译器决定,并给出了`Animl4`类中`Dog()`方法的实现。 2. 2.创建匿名类的对象,并使用了类型为`Animl4`的引用变量`animl4`来引用。 通过接口创建匿名内部类 ```java interface Animl4{ void Dog(); } public class mainTest { public static void main(String[] args) { //使用匿名内部类实例化接口Animl4 Animl4 animl4 = new Animl4() { @Override public void Dog() { System.out.println("中华田园犬"); } }; animl4.Dog(); } } ``` > 输出结果 ```java 中华田园犬 ``` > 代码分析 ```java Animl4 animl4 = new Animl4() { public void Dog() {System.out.println("中华田园犬");} }; ``` 上方代码的作用: + 1.创建一个匿名类,它的名称由编译器决定,并给出了`Dog()`方法的实现。 + 2.创建匿名类的对象,并使用了类型为`Animl4`的引用变量`animl4`来引用。 *附:[参考原文链接]( https://www.cnblogs.com/nwgdk/p/8661442.html )*
标签:
Java
,
Java编程思想
,
JavaSE
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/61.html
上一篇
类和接口的嵌套(一)
下一篇
接口中的工厂方法设计模式
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Livy
Golang
哈希表
排序
MySQL
VUE
pytorch
散列
Spark
JavaWeb
nginx
Flink
Thymeleaf
Java编程思想
链表
前端
Golang基础
Nacos
Kafka
Http
MyBatis-Plus
Spark Streaming
并发线程
微服务
Hadoop
Python
Java工具类
Stream流
查找
JavaScript
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭