四种内部类

在Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的 内部类一般来说包括这四种:静态内部类、匿名内部类、成员内部类和局部内部类,下面我们一一介绍。

目录

四种内部类

一. 成员内部类

二. 静态内部类

三. 匿名内部类

四. 局部内部类

一. 成员内部类

成员内部类,顾名思义,是作为对象的一个成员来定义的类。

下面给出代码例子:

public class Test2 {

public int a = 0;

public double b = 0.0;

//成员内部类

class T1{

public int i;

}

public static void main(String[] args) {

//成员内部类依赖外部类的对象,因为他是一个外部类的一个成员

//T1 t = new T();

Test2 test2 = new Test2();

//这样也是不行的,没办法new T1();

//new T1();

}

}

成员内部类作为外部类的一个属性是不能脱离外部类实例化的所以可见上面代码中的 new T() 都无法成功。

二. 静态内部类

我们直接给出代码例子

public class Test2 {

public int a = 0;

public double b = 0.0;

//静态内部类 == 成员内部类 + static

static class T2{

public int i;

}

public static void main(String[] args) {

// 静态内部类

// 静态内部类类似于类属性,可以直接初始化

T2 t2 = new T2();

}

}

静态内部类 == 成员内部类 + static

静态内部类相当于外部类的一个类属性,可以脱离外部类实例,直接初始化。

三. 匿名内部类

匿名内部类的定义,是在一个方法或是代码块中定义的类,并且没有显示申明类的名称,比如这样:

public class Test2 {

public int a = 0;

public double b = 0.0;

public void fun(){

System.out.println("哈哈哈");

}

public void fun1(){

System.out.println(a);

}

public static void main(String[] args) {

// 匿名内部类

// 定义在方法或者代码块里

// 这个类没有名字,是Test2类的一个子类,继承于Test2

Test2 test2 = new Test2() {

//可以重写方法

@Override

public void fun(){

System.out.println("内部类");

}

//也可以添加属性,但是这个属性想在外部访问的时涉及向下转型

//在外部访问的时候是通过指向父类的引用访问的

//就不可以向下转型,因为向下转型需要子类引用(但是子类的名字不知道)

//所以在外部访问没有太大意义

//但是可以在这个类的内部访问这个属性

public int c = 1;

//在类内部访问该属性

@Override

public void fun1(){

System.out.println("访问内部类新添加的属性 c " + c);

}

};

System.out.println("通过内部类访问外部类的属性" + test2.a);

//直接外部访问不可行

//System.out.println(test2.c);

//调用方法在类内部访问该属性

test2.fun1();

//调用重写后的方法

test2.fun();

}

}

参考上面代码,匿名内部类没有名字,它是外部类的一个子类,所以它继承了外部类的所有的属性和方法。

我们可以在这个内部类中重写外部类的方法,这是匿名内部类的主要用途。

我们也可以在这个内部类中添加新的属性和方法,但是在外部访问就没有那么容易了。

由于我们不知道内部类的名字,所以无法用内部类引用的类型指向内部类实例(内部类 引用 = new 内部类() 向这样的代码无法办到),所以只能用父类引用指向子类实例,就是所谓的向上转型,根据 Java 多态的语法,无法用父类的引用访问到子类新添加的属性和方法。

我们现在来解释一下上面的代码:

匿名内部类是外部类的一个子类,我们在这个内部类中重写 fun() 和 fun1() 方法,而且添加了新的属性 c ,

根据 Java 中多态的语法( Test2 test2 = new Test2(){......} 这一句涉及到向上转型),我们通过指向内部类(这个内部类同时是子类)的引用来调用重写后的 fun() 和 fun1() 方法,而在 fun1() 中,我们访问了新添加的属性,所以代码的执行结果为:

四. 局部内部类

联想到局部变量,局部内部类的作用域也是和局部变量类似,是在方法或是代码块中定义。

下面给出代码例子:

public class Test2 {

public int a = 0;

public double b = 0.0;

public void fun(){

System.out.println("哈哈哈");

}

public static void main(String[] args) {

//局部内部类 定义到方法内部作为局部变量

class T3{

//属性,方法等

public int a = 10;

public void fun(){

System.out.println("hahaha");

}

}

T3 t3 = new T3();

t3.fun();

System.out.println(t3.a);

}

}

局部内部类 定义到方法内部作为局部变量,可以在它的作用域范围进行实例化。

上面代码中,我们在类 T3 中写的一个 fun() 方法,注意这里不是方法重写,因为 T3 和 Test2 没有父子关系。

代码的运行结果为:

今天的分享就到这里,需要重点掌握的是匿名内部类,这在今后的开发中也比较常用。希望大家多多评论,相互提高。

java中有几种内部类,Java中的四种内部类相关推荐

  1. java object 引用类型_java中的四种引用类型

    java中的四种引用类型 一.强引用 强引用是最常见的,把一个对象赋给一个引用变量,这个引用变量就是一个强引用.当一个对象被强引用变量引用时,他处于可达状态,它是不会被GC回收的,即使该对象以后永远不 ...

  2. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  3. java正则校验密码 长度不少于8位且至少包含大写字母、小写字母、数字和特殊符号中的四种组合 或者 其中任意三种组合

    java正则校验密码必须是包含大小写字母.数字.特殊符号的8位以上四种组合 或者 其中任意三种组合 一.排除法和详细解释 1.排除大写字母.小写字母.数字.特殊符号中1种组合.2种组合.3种组合,那么 ...

  4. java中的四种代码块

    原文链接: java中的四种代码块_Munt的博客-CSDN博客_java中代码块 在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造 ...

  5. java级别_Java中的四种访问级别

    在Java中,针对类.成员方法和属性提供了四种访问级别,分别是private.default.protected和public.接下来通过一个图将这四种控制级别由小到大依次列出,如图1所示. 图1 访 ...

  6. java中的json_JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  7. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  8. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  9. 后台CS代码中创建四种常用的SL动画效果

    http://www.cnblogs.com/chengxingliang/archive/2011/03/07/1974436.html后台CS代码中创建四种常用的动画效果[附带源码实例] 转载于: ...

最新文章

  1. 王建民做客第六期青年学者月度沙龙 分享工业软件的开源创新发展模式
  2. leetcode C++ 2. 两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数
  3. 【mysql问题】foreign key without name 解决方法
  4. 实现input框的全选和清空
  5. for(;;)函数中判断条件执行顺序
  6. pmtk3怎样离线安装
  7. kdj超卖_【教你一招】KDJ超买超卖指标
  8. python为什么保存不了_python文件无法保存怎么解决
  9. 多线程编程下单例模式与多例模式的使用总结
  10. LeetCode 776. Split BST
  11. POI设置单元格颜色及枚举颜色对照
  12. CWE ID 259:Use of Hard-coded Password
  13. android判断网络类型5G,iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi
  14. Win32_DiskDrive 硬盘 参数说明
  15. matlab 图片RGB颜色提取0-255版
  16. tensorflow出现如下错误:AttributeError: ‘module’ object has no attribute ‘merge_all_summaries’
  17. 基于 OE、Yocto、Arago 构建 TI 板卡的定制文件系统
  18. elasticsearch和elasticsearch-sql安装教程
  19. 计算机主机突然断电有什么影响,台式机突然断电有什么危害
  20. ublox8 M8协议介绍

热门文章

  1. 重命名某文件夹下所有文件的名字 python3
  2. LeetCode-链表-203. 移除链表元素
  3. Python编程基础:第十六节 元组Tuple
  4. c#中WebBrowser控件的使用方法
  5. 美团配送资金安全治理之对账体系建设
  6. 机器学习算法基础——k近邻算法
  7. Ubuntu 18.04安装CUDA(版本10.2)和cuDNN
  8. RocketMQ控制台安装教程
  9. Spring Boot实战系列《六》:人事管理系统的登录设计
  10. 亚马逊外包平台的50万劳工:人工智能的背后,无尽数据集的建造