今天温习一下 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. 合并.ts文件 无需软件

    cmd 命令直接输入: copy /b D:\temp\*.ts D:\new.ts D盘temp目录的ts文件 合并 并输出到 D盘 new.ts文件

  2. Python读取和写入文件

    1 从文件中读取数据 1.1 读取整个文件 创建名为test的txt文本文件,添加内容如下所示: 123456789023456789013456789012 实现代码: with open('tes ...

  3. C++读入输出优化

    读入输出优化虽然对于小数据没有半点作用,但是对于大数据来说,可以优化几十ms. 有时就是那么几十ms,可以被卡掉大数据的点 读入优化 int read() { int x=0,sig=1; char ...

  4. 简单谈谈HashMap

    概述 面试Java基础,HashMap可以说是一个绕不过去的基础容器,哪怕其他容器都不问,HashMap也是不能不问的. 除了HashMap,还有HashTable跟ConcurrentHashMap ...

  5. 大型Java进阶专题(二) 软件架构设计原则(上)

    前言 ​ 今天开始我们专题的第一课了,也是我开始进阶学习的第一天,我们先从经典设计思想开始,看看大牛市如何写代码的,提升技术审美.提高核心竞争力.本章节参考资料书籍<Spring 5核心原理&g ...

  6. Asp.Net Core 2.0实现HttpResponse中繁切换

    随笔背景:因为项目中有个简单的功能是需要实现中文简体到繁体的切换,数据库中存储的源数据都是中文简体的,为了省事就想着通过HttpHeader的方式来控制Api返回对应的繁体数据. 实现方式:通过Asp ...

  7. 超强图文|并发编程【等待/通知机制】就是这个feel~

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  8. 部署nginx后无法访问数据库,查看www-error.log日志报错Class 'mysqli' not found in /usr/local/nginx/html/mysql.php on line 2

    检查你的php-mysql包是否安装 [root@localhost nginx]# rpm -qa php-mysql 没有任何输出则没有安装,接下来用yum安装php-mysql yum -y i ...

  9. git 查看commit的提交记录

    相关命令: git log  查看所有提交记录 git show 查看提交详情 示例: git log: git show: 查看指定commit的详情:git show commitId 查看某次c ...

  10. iframe的父子层跨域 用了百度的postMessage()方法

    父层:第一个是方法申明 第二个是接收子层过来的数据 <script type="text/javascript"> $("#main").load( ...