高级类特性-(类的成员之一:内部类)

内的成员之一:内部类(属性、方法、构造器、代码块) 可以有四种权限访问修饰符

注意:外部类 只有两种 public 和 default

定义 : 可以将一个类的定义放在另一个类定义的内部,这就是内部类 -thinking in Java

用法:如果一个类 仅跟本类关系密切的话 对于其他类希望隐藏 就可以使用内部类 例ArrayList中的 Itr

1. 成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员。

在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

  1. public class TestInnerClass {
  2. public static void main(String[] args) {
  3. //创建非静态内部类的对象
  4. Person p = new Person();
  5. Person.Computer pc = p.new Computer();
  6. pc.setName("IBM");
  7. //System.out.println(pc.getName());
  8. }
  9. }
  10. class Person {
  11. private String name = "张三";
  12. private int age;
  13. public Person() {
  14. super();
  15. }
  16. public Person(String name, int age) {
  17. super();
  18. this.name = name;
  19. this.age = age;
  20. }
  21. public class Computer{
  22. private String name = "lenovo";
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. System.out.println("setName 方法局部变量name: " + name);
  28. System.out.println("Computer 的属性name:" + this.name);
  29. System.out.println("外部内Person 属性的name:" + Person.this.name);
  30. this.name = name;
  31. }
  32. }
  33. }

 

2. 局部内部类

有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。(做Java后端 用法极少见 本人三年开发 从没见过有人用过)

  1. public class TestInnerClass2 {
  2. //局部内部类:如下方式使用非常的少
  3. private void show(){
  4. class Inner{
  5. }
  6. }
  7. //如果一个类仅适用于当前方法时,可以声明如下方式
  8. public static Comparator getComparator(){
  9. class MyComparator implements Comparator{
  10. @Override
  11. public int compare(Object o1, Object o2) {
  12. return 0;
  13. }
  14. }
  15. return new MyComparator();
  16. }
  17. public static void main(String[] args) {
  18. Comparator comparator = TestInnerClass2.getComparator();
  19. }
  20. }

 

3. 匿名内部类

注意:

  • 1.匿名内部类是没有访问修饰符的
  • 2.想使用外部的一个变量 该变量要用final修饰 -java8开始不需要
  1. public class TestInnerClass2 {
  2. public static Comparator getComparator1(){
  3. Comparator com = new Comparator(){ //匿名内部类实现的Comparator接口,new的是匿名内部类的构造器
  4. @Override
  5. public int compare(Object o1, Object o2) {
  6. // TODO Auto-generated method stub
  7. return 0;
  8. }
  9. };
  10. return com;
  11. }
  12. public static void main(String[] args) {
  13. Comparator comparator = TestInnerClass2.getComparator1();
  14. /* comparator.compare(o1, o2);*/
  15. }
  16. }

 

4. 静态内部类

在java提高篇-----关键字static中提到Static可以修饰成员变量、方法、代码块,其他它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,它是属于类本身,而不是某个对象

  1. public class TestInnerClass {
  2. public static void main(String[] args) {
  3. //创建静态内部类的实例
  4. Person.Mobile pm = new Person.Mobile();
  5. pm.show();
  6. }
  7. }
  8. class Person {
  9. //静态内部类
  10. static class Mobile{
  11. public void show(){
  12. System.out.println("这是静态内部类的方法");
  13. }
  14. }
  15. }

 

五.内部类标识符

由于每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。您可能猜到了,内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上$,再加上内部类的名字。

如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。

java核心技术-内部类的更多相关文章

  1. Java核心技术点之内部类

    1. 为什么要使用内部类     内部类就是定义在一个类内部的类,那么为什么要使用内部类呢?主要原因有以下几点:第一,内部类中定义的方法能访问到它所在外部类的私有属性及方法:第二,外部类无法实现对同一 ...

  2. 对《Java核心技术卷一》读者的一些建议

    <Java核心技术卷一>是唯一可以和<Java编程思想>媲美的一本 Java 入门书.单从技术的角度来看,前者更好一些.但上升到思想层面嘛,自然后者更好,两者的偏重点不同. 思 ...

  3. 面试必备!Java核心技术100+面试题

    一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...

  4. 《Java核心技术卷I》观赏指南

    Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在 ...

  5. 【阅读笔记】Java核心技术卷一 #0

    这是一篇备忘性质的读书笔记,仅记录个人觉得有用的知识点 本文作为一个目录索引,部分章节跳过 吐槽:此书中文翻译有不少地方不太通顺,这种情况我要把英文版对应的部分也读一遍才能明白(说实话,英文里的从句表 ...

  6. Java学习--内部类(一)

    Java学习--内部类(一) 一. 内部类的定义和特点 class Outer{ privite int num = 5; class Inner{ public void Display(){ Sy ...

  7. Java核心技术点之泛型

    1. Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象.然而,过了一阵,我们想要实现一个大小 ...

  8. Java核心技术点之集合框架

    1. 概述     Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容 ...

  9. Java核心技术点之动态代理

    本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代 ...

随机推荐

  1. eclipse打包jar文件

    论文仿真做线性回归分类在人脸识别中应用与研究,在单机下实现LRC算法后,又在Hadoop云平台下实现了该算法.在比较实验结果时候需要放在相同硬件条件下比较.但是LRC单机算法是在windows下的ec ...

  2. AngularJS源码解析2:注入器的详解

    上一课,没有讲createInjector方法,只是讲了它的主要作用,这一课,详细来讲一下这个方法.此方法,最终返回的注册器实例对象有以下几个方法: invoke, instantiate, get, ...

  3. spring-boot打包,引入外部jar包问题

    这是我引入的外部jar包,打包的时候找不到外部jar包路径 弄了好久 在lib下引入外部jar包,运行没问题,但是打包是出现问题了,具体解决办法 再pom中加入如下配置,告诉maven导入本地jar ...

  4. leetcode-383-Ransom Note(以空间换时间)

    题目描述: Given an arbitrary ransom note string and another string containing letters from all the magaz ...

  5. Asp.net的生命周期应用之IHttpHandler

    摘自:http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html Framework提供了一系列的接口和类,允许你对于Http请求 ...

  6. 架构师养成记--18.NIO

    有人叫new IO 我这里就叫Non-block IO 经典概念: Buffer(缓冲区):之前直接通过流,现在提供一个buffer存放数据. Channel:管道,包括ServerSocketCha ...

  7. vue进行路由拼图的使用案例

    实现思路,利用路由进行实现多个组件拼图: Detail.vue <template> <div> <h1>详细展示</h1> <div>鞍山 ...

  8. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  9. pytest+jenkins安装+allure导出报告

    环境安装: windows7+64位 pytest:4.0.2 allure的安装:allure的python库pytest-allure-adaptor jenkins的安装:2.138.2 JDK ...

  10. Collections.singletonList方法的使用

    方法注释 /** * Returns an immutable list containing only the specified object. * The returned list is se ...