内部类的概念

一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。

内部类可以使用public、default、protected 、private以及static修饰。

外部顶级类(我们以前接触的类)只能使用public和default修饰。

注:内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在,其成员变量/方法名可以和外部类的相同。

内部类介绍

package cn.dym05;class Outer{private int age=10;public void show() {System.out.println(age);}public class Inner{//内部类中可以声明与外部类同名的属性与方法private int age=20;public void show() {System.out.println(age);}}
}public class Test01 {public static void main(String[] args) {}
}

内部类的作用:

1. 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。

2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。

3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整。

内部类的使用场合:

1. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在只为外部类提供服务的情况下可以优先考虑使用内部类。

2.  使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响。


内部类的分类

在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类

成员内部类(可以使用private、default、protected、public任意进行修饰。 类文件:外部类$内部类.class)

非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)

i. 非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。

ii. 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。

iii. 非静态内部类不能有静态方法、静态属性和静态初始化块。

iv. 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。

成员变量访问要点:

1. 内部类里方法的局部变量:变量名。

2. 内部类属性:this.变量名。

3. 外部类属性:外部类名.this.变量名。

内部类的访问

package cn.dym05;class Outer{private int age=10;class Inner{int age=20;public void show() {int age=30;System.out.println("内部类方法里的局部变量age:"+age); //30System.out.println("内部类的成员变量age:"+this.age);//20System.out.println("外部类的成员变量age:"+Outer.this.age); //10  }}
}public class Test02 {public static void main(String [] args) {//先创建外部类实例,然后使用该外部类实例创建内部类实例Outer.Inner inner=new Outer().new Inner();inner.show();Outer outer=new Outer();Outer.Inner inn=outer.new Inner();inn.show();}
}

//先创建外部类实例,然后使用该外部类实例创建内部类实例

静态内部类

 使用要点:

1. 当一个静态内部类对象存在,并不一定存在对应的外部类对象。 因此,静态内部类的实例方法不能直接访问外部类的实例方法。

2. 静态内部类看做外部类的一个静态成员。 因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过 new 静态内部类()访问静态内部类的实例。

静态内部类的访问

静态内部类相当于外部类的一个静态成员,通过 new 外部类名.内部类名() 来创建内部类对象

package cn.dym05;class Outer{private int age=10;static class Inner{int age=20;public void show() {int age=30;System.out.println("内部类方法里的局部变量age:"+age); //30System.out.println("内部类的成员变量age:"+this.age);//20//System.out.println("外部类的成员变量age:"+Outer.this.age); //不能访问   }}
}public class Test02 {public static void main(String [] args) {//通过 new 外部类名.内部类名() 来创建内部类对象Outer.Inner inner=new Outer.Inner();inner.show();}
}

匿名内部类

匿名内部类适合那种只需要使用一次的类。比如:键盘监听操作等等

注:1. 匿名内部类没有访问修饰符。

2. 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢。

局部内部类

还有一种内部类,它是定义在方法内部的,作用域只限于本方法,称为局部内部类。

方法中的内部类

package cn.dym05;public class Test04 {public void show() {//作用域仅限于该方法class Inner{public void fun() {System.out.println("helloworld");}}new Inner().fun();}public static void main(String[] args) {new Test04().show();}
}

Java的知识点14——内部类的概念、内部类的分类相关推荐

  1. Java面试知识点:多态、内部类

    问题:Java面试知识点:多态.内部类 答案:  多态中成员访问特点 • 构造方法:同继承一样,子类会通过super访问父类构造方法 • 成员变量:编译看左边(父类),执行看左边(父类) • 成员方 ...

  2. Java静态内部类、匿名内部类、成员式内部类和局部内部类

    内部类可以是静态(static)的,可以使用 public.protected 和 private 访问控制符,而外部类只能使用 public,或者默认. 成员式内部类 在外部类内部直接定义(不在方法 ...

  3. java嵌套类型 无法隐藏外层类型_java内部类深入详解 内部类的分类 特点 定义方式 使用...

    java内部类 内部类的分类 特点  定义方式 使用   外部类调用内部类 多层嵌套内部类  内部类访问外部类属性  接口中的内部类  内部类的继承  内部类的覆盖  局部内部类 成员内部类 静态内部 ...

  4. java 内部类调用_Java内部类使用总结

    1.定义 内部类是指在一个外部类的内部再定义一个类. 内部类作为外部类的一个成员,并且依附于外部类而存在的. 内部类可为static,可用public.protected.private修饰.(而外部 ...

  5. Java学习笔记⑩(final关键字、内部类)

    一.final关键字 final关键字代表最终.不可改变的. 常用的四种方法: 可以用来修饰一个类 可以用来修饰一个方法 还可以用来修饰一个局部变量 还可以用来修饰一个成员变量 不能使用一个final ...

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

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

  7. 第三次学JAVA再学不好就吃翔(part42)--内部类概述

    学习笔记,仅供参考 文章目录 面向对象 内部类 内部类概述和访问特点 成员内部类私有使用 静态成员内部内 面向对象 内部类 内部类概述和访问特点 内部类概述 在类中定义类,就叫做内部类 内部类访问特点 ...

  8. 【重难点】【Java基础 07】变量类型、内部类、处理器指令优化

    [重难点][Java基础 07]变量类型.内部类.处理器指令优化 文章目录 [重难点][Java基础 07]变量类型.内部类.处理器指令优化 一.变量类型 1.对比 二.内部类 1.介绍 三.处理器指 ...

  9. java 内部类_java的内部类和静态内部类(嵌套类)

    背景 开发新项目,写Swager的mode的时候用到了嵌套Model,于是在代码中,出现了静态内部类.在codeReview的时候稍微和大家聊了一下.尤其是Static 修饰类和修饰对象和变量不一样呢 ...

最新文章

  1. Simple Dynamic Strings(SDS)源码解析和使用说明二
  2. HDU 2865 Birthday Toy [Polya 矩阵乘法]
  3. C 语言 malloc用法实验
  4. 没有任何基础学编程从哪开始_没有编程基础的朋友,学Python还是C/C++好,看了这个就明白了...
  5. 【本站作品】机器学习数学基础专辑
  6. 推荐系统--矩阵分解(5)
  7. hive 如何将数组转成字符串_hive详细笔记(八)-Hive之列转行和行转列(附带讲解视频 )...
  8. java 有序容器_Java 容器集合框架概览
  9. Svn、Git、GitHub、GitLab、码云 区别
  10. mysql分布式插入_添砖加瓦:MySQL分布式部署
  11. 网络通信基础知识简介
  12. (附源码)ssm财务管理系统 毕业设计 282251
  13. 批量提取html文字,批量提取网页内容(全自动)
  14. 基于 Self-hosted Debug 的调试
  15. C++程序员的发展前景,老程序员:早知道当初就学C++了!
  16. 精辟!(/usr/bin/ld: cannot find -lxxx)可能出现的问题和原因
  17. 【Windows】修改已连接的蓝牙设备名称
  18. 【转】西门子数控系统中MMC、PCU、NCU、CCU简略介绍
  19. Android App工程结构
  20. 求n以内的所有素数(质数)个数

热门文章

  1. 阿里云服务器被挖矿程序minerd入侵的终极解决办法[转载]
  2. .NET中DLL“没有可放置在工具箱的组件”—FreeTextBox
  3. sql 定时同步两个数据库
  4. 20131005第四章,第五章内容整理与归纳。
  5. [转]学校的统一订书80%该烧掉——IT推荐书单
  6. 【HNOI2011】数学作业(BZOJ 2326)
  7. CoreAnimation编程指南(六)动画 转自:http://www.dreamingwish.com/
  8. VMware-workstation-6.0 安装系统前必须映射光驱盘符
  9. 数据恢复,恢复丢失的数据,突破1G限制!
  10. 云计算之KVM虚拟化实战