在Java中,内部类包括:成员内部类(静态内部类、非静态内部类)、匿名内部类、局部内部类(几乎不用)。

1.成员内部类:

  1.1非静态成员内部类

public class InnerClassTest {
public class FirstInnerClass{ }
}

  成员内部类(可以使用private、default、protected、public任意进行修饰。

  •   非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
  • 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
  • 非静态内部类不能有静态方法、静态属性和静态初始化块。
  • 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。

成员变量访问要点:

  • 内部类里方法的局部变量:变量名。
  • 内部类属性:this.变量名。
  • 外部类属性:外部类名.this.变量名。
public class InnerClassTest {
private int age = 10;
public class FirstInnerClass{
int age = 20;
public void test(){
int age = 30;
System.out.println(InnerClassTest.this.age);
System.out.println(FirstInnerClass.this.age);
System.out.println(age);
}
} public static void main(String[] args) {
InnerClassTest.FirstInnerClass innerClass = new InnerClassTest().new FirstInnerClass();
innerClass.test();
}
}

  1.2静态成员内部类

public class InnerClassTest {
public static class FirstInnerClass{ }
}
  • 当一个静态内部类对象存在,并不一定存在对应的外部类对象。 因此,静态内部类的实例方法不能直接访问外部类的实例方法。
  • 静态内部类看做外部类的一个静态成员。 因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过 new 静态内部类()访问静态内部类的实例。
public class InnerClassTest {
private int age = 10;
public static class FirstInnerClass{
int age = 20;
public void test(){
int age = 30;
//System.out.println(InnerClassTest.this.age); 不能访问外部类变量,因为静态内部类对象不依赖外部类对象,所以存在内部类对象不代表存在外部类对象
System.out.println(FirstInnerClass.this.age);
System.out.println(age);
}
} public static void main(String[] args) {
InnerClassTest.FirstInnerClass innerClass = new InnerClassTest.FirstInnerClass();//注意和非静态内部类的new方式区别
innerClass.test();
}
}

2.匿名内部类

public class InnerClassTest {
public static void talk(Person person){
person.speak();
}
public static void main(String[] args) {
//只是创建一个匿名内部类的对象,并没有调用它,所以不会输出你好
new Person() {
@Override
public void speak() {
System.out.println("你好");
}
}; InnerClassTest.talk(new Person() {
@Override
public void speak() {
System.out.println("Hello");
}
}); //通常的new一个线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("萨瓦迪卡");
}
}).start();
}
} interface Person{
public void speak();
}

3.局部内部类

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

Java内部类介绍的更多相关文章

  1. Java基础-内部类介绍

    java内部类介绍 内部类一共分为4种 成员内部类 静态内部类 方法内部类 匿名内部类 下面我会为大家详细介绍每一个内部类!! 成员内部类 成员内部类就好像是外部类的一个成员属性,也是内部类中最常见的 ...

  2. 基础篇:JAVA内部类的使用介绍

    目录 1 四种内部类 2 内部类的使用场景和优点 3 成员内部类 4 成员内部类的访问范围详解 5 静态内部类 6 局部内部类 7 匿名内部类 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 四 ...

  3. java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  4. Android下HelloWorld项目的R.java文件介绍

    R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R {     public s ...

  5. js闭包vs Java内部类

    前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...

  6. Java -- 内部类(二)

    在上一篇博客Java --内部类(一)中已经提过了,java中的内部类主要有四种:成员内部类.局部内部类.匿名内部类.静态内部类. 该文主要介绍这几种内部类. 成员内部类 成员内部类也是最普通的内部类 ...

  7. 【转】java内部类的作用分析

    转自:http://blog.csdn.net/ilibaba/article/details/3866537 另收另外一篇有空的时候看:http://jinguo.iteye.com/blog/71 ...

  8. Java内部类超详细总结(含代码示例)

    什么是内部类 什么是内部类? 顾名思义,就是将一个类的定义放在另一个类的内部. 概念很清楚,感觉很简单,其实关键在于这个内部类放置的位置,可以是一个类的作用域范围.一个方法的或是一个代码块的作用域范围 ...

  9. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

随机推荐

  1. Gym - 101170B British Menu (强连通缩点+dp)

    题意:求一个有向图上的最长路(每个强连通分量的点不超过5个) 首先对强连通分量缩点,暴力预处理出len[k][i][j]表示第k个强连通分量里的第i个点和第j个点之间的最长路径,设状态(k,i,f)表 ...

  2. keep-alive实现返回保留筛选条件及筛选结果

    实现页面返回时,保留筛选条件和筛选结果 说明 . keep-alive 是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM 实现 结合router实现部分页面缓存 模板应用 ...

  3. Tarjan求点双连通分量

    概述 在一个无向图中,若任意两点间至少存在两条“点不重复”的路径,则说这个图是点双连通的(简称双连通,biconnected) 在一个无向图中,点双连通的极大子图称为点双连通分量(简称双连通分量,Bi ...

  4. Acwing-284-金字塔(区间DP)

    链接: https://www.acwing.com/problem/content/description/286/ 题意: 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. ...

  5. Session中的方法

    Session 管理一个数据库的任务单元,即管理数据库中的增删改查操作,提交事务. 方法CRUD:save(),delete(),load(),get(),update(),saveOrUpdate( ...

  6. 什么是DOM(文档对象模型)?

    ㈠什么是DOM? 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口. DOM 定义了访问 HTML 和 XML 文档的标准: ...

  7. codevs 1405 牛的旅行x

    牛的旅行 [问题描述] 农民John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧场不连通.现在,John想在农场里添加一条路径 ...

  8. ant design 的表格默认选中

    在使用 ant design 的表格时候使用默认选中项, 需要配置的 Table 的 rowSelection const rowSelection = { type: 'checkbox', get ...

  9. [笔记]mongodb一

    一.MongoDB介绍 MongoDB是一个由c++编写的基于分布式文件存储的数据库.MongoDB介于关系型数据库和非关系型数据库之间,是非关系型数据库中功能最丰富,最接近关系型数据库.具有高性能, ...

  10. sqli-labs(38)

    0X01 ?id=' and 1=1%23 正确 ?id=1' and 1=2%23 错误 存在注入 0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注 ...