今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类、成员内部类、匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下:

  1. 概述
  2. 静态内部类
  3. 成员内部类
  4. 匿名内部类和方法内部类
  5. 总结

概述

顾名思义内部类就是在一个类内部定义的类,它是内部类是一个独立的类,编译之后会生成独立的 .class 文件,其名称前面会有外部类的类名称以及 $ 符号,内部类同样可以使用 private 、default、protected、public 修饰,下面是内部类的写法,具体参考如下:

/**
* 内部类
* @author jzman
*/
public class OutterClass {
//静态内部类
private static class StaticInnerClass{ }
//成员内部类
private class FieldInnerClass{ } //匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() { }
}; private void method() {
//方法内部类(局部内部类)
class InnerClass{ }
}
}

静态内部类

  • 静态内部类可以有静态成员和非静态成员;
  • 静态内部类可以直接调用外部类的静态成员和静态方法,但不能调用外部类的非静态成员和非静态方法;
  • 在不相关类中,可以直接创建静态内部类的对象;
  • 静态内部类与其外部类联系很少,其创建基本不依赖与外部类。
/**
* 静态内部类
* @author jzman
*/
public class StaticInnerClassDemo {
public static void main(String[] args) {
//其他类可以直接创建某个非私有内部类的实例
OutterClass1.InnerClass innerClassB = new OutterClass1.InnerClass();
InnerClass innerClassA = new InnerClass();
innerClassA.testStaticInnerClass();
//...
}
} //外部类
class OutterClass1{
//非静态成员变量
int ageA = 18;
//非静态方法
public void methodA() { } //静态成员变量
static int ageB = 18;
//静态方法
public static void methodB() { } private void methodC() {
//外部类调用静态内部类的方法
InnerClass innerClass = new InnerClass();
innerClass.testStaticInnerClass();
} //静态内部类
static class InnerClass{ public void testStaticInnerClass(){
//静态内部类不能访问其外部类的非静态成员变量和方法
// System.out.println(ageA);
// methodA();
//静态内部类可以访问其外部类的静态成员和方法
System.out.println(ageB);
methodB();
}
}
}

成员内部类

  • 成员内部类可以访问所有外部类的成员;
  • 成员内部类对象的创建必须依赖于外部类对象,先有外部类才会有内部类;
  • 成员内部类就是外部类的一个成员变量;
  • 成员内部类不能有静态成员,但允许常量存在。
/**
* 成员内部类
* @author jzman
*/
public class FieldInnerClassDemo {
public static void main(String[] args) {
//成员内部类依赖与其外部类,不能越过外部类直接创建内部类的实例
// InnerClass innerClass = new InnerClass();
//正确在其他类创建创建内部类的实例
OutterClass2 outterClass2 = new OutterClass2();
OutterClass2.InnerClass innerClass = outterClass2.new InnerClass();
innerClass.testFieldInnerClassMethod();
}
} //外部类
class OutterClass2{
//非静态成员变量
int ageA = 18;
//非静态方法
public void methodA() { } //静态成员变量
static int ageB = 18;
//静态方法
public static void methodB() { } private void methodC() {
//外部类调用成员内部类的方法
InnerClass innerClass = new InnerClass();
innerClass.testFieldInnerClassMethod();
} //成员内部类
class InnerClass{ //成员内部类不能有静态成员
// static int a = 10;
//成员内部类允许常量形式存在
static final int b = 10; public void testFieldInnerClassMethod(){
//成员内部类可以直接访问其外部类的所有成员变量及方法(静态和非静态)
System.out.println(ageA);
methodA();
System.out.println(ageB);
methodB();
}
}
}

匿名内部类和方法内部类

匿名内部类当然是没有确定的名称,其实现都是在类体中具体实现,最终返回相关类的一个匿名对象,由于最终返回的是一个匿名的实例,所以必须在匿名内部类之后添加分号。方法内部类就是局部内部类,一般定义在类的局部位置,它可以访问当前代码块及外部类的所有变量。

总结

类之间的成员变量的互相调用实际上还是访问对象的成员变量,如成员内部类能够访问外部类的成员变量或方法是因为内部类持有外部类的引用,一般通过 OutterClass.this 获取外部类的对象,如果外部类想要访问内部类的成员变量或方法当然也需要持有内部类的引用,所以外部类访问内部类的成员变量或方法时,必须先创建内部类的对象,然后通过对象来方位相应的成员变量或方法。

可以选择关注微信公众号:jzman-blog 获取最新更新,一起交流学习!

Java系列之内部类的更多相关文章

  1. JAVA基础之内部类

    JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...

  2. 黑马程序员——JAVA基础之内部类,匿名内部类

    ------- android培训.java培训.期待与您交流! ---------- 内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类). 内部类访问特点: •  内部 ...

  3. Java学习之内部类

    示例1: package com.swust.面向对象; class Person1{ private String username="zhangsan"; public Per ...

  4. Java面向对象之内部类(访问格式)

    一.基础概念 1.内部类是定义在类中的类.A类需要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在. 2.内部类可以相当于外部类中的一个成员,可以被成员修饰符所修饰.(如:publ ...

  5. [内部类] java笔记之内部类

    1.内部类的分类 2.成员内部类的定义格式 3.一旦使用了内部类,那么生成的class文件长啥样? 其中Body是外部类,Heart是Body的内部类,所以中间有个美元符号$,所以给类进行命名时,不要 ...

  6. Java面向对象之内部类(匿名内部类)

    一.基础概念 匿名内部类:简化书写的内部类.其实匿名内部类就是一个子类对象. 前提:内部类需要继承或者实现外部的类或者接口. 格式:new 父类或者接口(){定义子类的内容} 二.将内部类定义到局部的 ...

  7. java之内部类

    最近学了java,对内部类有一点拙见,现在分享一下 所谓内部类(nested classes),即:面向对象程序设计中,可以在一个类的内部定义另一个类. 内部类不是很好理解,但说白了其实也就是一个类中 ...

  8. 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)

    Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...

  9. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

随机推荐

  1. vijos 1011 清帝之惑之顺治

    背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...

  2. Python 三程三器的那些事

    装饰器 1.什么是装饰器 装饰器本质是函数,用来给其他函数添加新的功能 特点:不修改调用方式.不修改源代码 2.装饰器的作用 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 装饰器必 ...

  3. angular 动态绑定class 写法

    [ngClass]="{'aaa':true,'bbb':!true}" 这个是正确的   [ngClass]="{ true ? 'aaa':'bbb'}" ...

  4. WEB渗透 - XSS

    听说这个时间点是人类这种生物很重要的一个节点 cross-site scripting 跨站脚本漏洞 类型 存储型(持久) 反射型(非持久) DOM型 利用 先检测,看我们输入的内容是否有返回以及有无 ...

  5. python.五角星

    import turtle turtle.pensize(4)turtle.pencolor("black") turtle.fillcolor("red")t ...

  6. CSS BEM 命名方式

    简介 简易 css 命名方式,减小命名冲突,使得 css 更有组织感和识别感.但如今写 react 项目大多可以忽略对 css 的命名约束了. 官网介绍:http://getbem.com/intro ...

  7. 【MVC】使用Jquery缓存数据

    前言 最近接手优化页面加载的任务. 分析其中一个原因是菜单页面ajax异步加载,页面很大,但是除非权限更改或者切换角色,否则每次请求返回数据不变,这个完全可以放在客户浏览器内进行缓存. 分析 粗略一分 ...

  8. (转)协议森林07 傀儡 (UDP协议)

    协议森林07 傀儡 (UDP协议) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经讲解了物理层.连接层和网络层.最开始的 ...

  9. 微服务系列之 Consul 注册中心

    原文链接:https://mrhelloworld.com/posts/spring/spring-cloud/consul-service-registry/ Netflix Eureka 2.X ...

  10. 【Weiss】【第03章】栈例程

    写栈比队列更简单一些,毕竟只有一个数据出入口. 之前用C在程序里模拟栈代替递归的时候,直接搞个数组来实现都是非常轻松愉快的事情. 不多说,放代码. 测试代码 #include <iostream ...