一、基本概念:

  顾名思义,内部类存在于外部类当中,依附于外部类。就像眼睛和脑袋的关系一样。

二、几点说明:

  1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 ;
  2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 ;
  3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 ;
  4.内部类增加了代码的复杂性,有着诸多的缺点,其唯一有点就是可以访问外部类的所有成员。

三、分类: 

  1.成员内部类:

    a).成员内部类可以看成是外部类的成员变量。

    b).非静态内部类

 public class Out {

     int age;
String name;
private char sex; class In { int age; public void print() {
//内部类可以访问任何权限的外部类成员
System.out.println("姓名为:" + name + "\n" + "性别为:" + sex);
} }
} class Demo { public static void main(String[] args) {
//非静态内部类对象的创建必须基于外部类对象(静态成员属于类,非静态成员属于对象)
Out.In in = new Out().new In();
in.print();
}
}

    c).静态内部类

 public class Out {

     int age;
String name;
private char sex;
static int height; static class In { int age; public void print() {
//静态内部类只能访问外部类的静态变量
System.out.println("身高为:" + height);
} }
} class Demo { public static void main(String[] args) {
//静态内部类对象的创建可直接基于外部类(静态成员属于类,非静态成员属于对象)
Out.In in = new Out.In();
in.print();
}
}

    d).私有内部类

 public class Out {

     int age;
String name;
private char sex;
static int height; private class In { int age; public void print() {
System.out.println("身高为:" + height);
} }
} class Demo { public static void main(String[] args) {
//私有内部类只能在外部类内部使用,以下代码无效
/*Out.In in = new Out.In();
in.print();*/
}
}

  2.匿名内部类:

    a).内部类只使用一次时候,则定义为匿名内部类,节省定义新类的成本

    b).匿名内部类在抽象类的实现

 public abstract class Animal {

     public abstract void eat();
} class Demo { public static void main(String[] args) { Animal dog = new Animal() {
@Override
public void eat() {
System.out.println("狗吃骨头!!");
}
};
dog.eat();
}
}

     匿名内部类不允许定义构造函数.

    c).匿名内部类在接口的实现

 public interface Animal {

     public abstract void eat();
} class Demo { public static void main(String[] args) { Animal cat = new Animal() {
@Override
public void eat() {
System.out.println("猫吃鱼!!");
}
};
cat.eat();
}
}

  3.局部内部类:

    a).局部内部类存在于方法体中,不常用

    b).基本实现

 public class Out {

     //方法传参数给局部内部类时参数定义为fianl
public void outPrint(final String str) {
class In {
public void inPrint() {
System.out.println(str);
}
}
new In().inPrint();
}
} class Demo {
public static void main(String[] args) {
new Out().outPrint("测试字符串!!");
}
}

解读Java内部类的更多相关文章

  1. 【转载】深度解读 java 线程池设计思想及源码实现

    总览 开篇来一些废话.下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) ...

  2. Java并发指南12:深度解读 java 线程池设计思想及源码实现

    ​深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...

  3. Java并发指南11:解读 Java 阻塞队列 BlockingQueue

    解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程 ...

  4. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  5. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  6. 黑马----JAVA内部类

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...

  7. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  8. java内部类和匿名内部类

    内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...

  9. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

随机推荐

  1. UVa 374 - Big Mod

    题目大意:计算R = BP mod M,根据模运算的性质计算. 正常计算会超时,可以用分治的思想降低时间复杂度.不过如果遇到00,结果...话说00的结果是1吗?忘了都... #include < ...

  2. DataTabel DataSet 对象 转换成json

    public class DataTableConvertJson    { #region dataTable转换成Json格式        /// <summary>         ...

  3. Oracle数据库和实例的区别

    一般Oracle数据库(Oracle Database)可以分为两部分,即实例(Instance)和数据库(Database). 实例:是一个非固定的.基于内存的基本进程与内存结构.当服务器关闭后,实 ...

  4. Python3基础 pop() 删除 键为指定值的项

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  5. python实现二叉树

    初学python,需要实现一个决策树,首先实践一下利用python实现一个二叉树数据结构.建树的时候做了处理,保证建立的二叉树是平衡二叉树. # -*- coding: utf-8 -*- from ...

  6. mySql 分段查询

    准备: 创建一个成绩表 Create table grade (id integer, score integer); 插入数据(只有id每次加一,score是1到100的随机数,java生成): p ...

  7. win10新特性,ubuntu子系统(安装及配置)

    最新版win10下可以直接跑ubuntu镜像,直接入正题. 这里如果你没有可能是你的版本不是最新的,我这里是最新的win10直接是有这个功能的.勾选后会要求重启,确定即可. 然后win键弹出搜索,输入 ...

  8. ResultSet遍历过程中修改自身数据,不会改变循环的过程

    ResultSet遍历过程中修改自身数据,不会改变循环的过程: import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  9. javaweb入门实例---servlet例子

    1.编写servlet: TreeDataServlet.java package com.maggie.tree; import java.io.IOException; import javax. ...

  10. HTML URL

    HTML 统一资源定位器(Uniform Resource Locators) URL 是一个网页地址. URL可以由字母组成,如"runoob.com",或互联网协议(IP)地址 ...