在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. springboot异常

    异常如下: org.springframework.context.ApplicationContextException: Unable to start embedded container; n ...

  2. nginx设置负载均衡

    ...... why负载均衡,随着企业业务增长和海量请求,给服务端造成海量并发,导致响应不及时需扩容后端服务,前端需要负载均衡,均摊请求,让服务端吞吐请求的能力提升 单点服务方式,一个点挂掉整个服务就 ...

  3. IPC 进程间通信方式——管道

    进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...

  4. ToolStrip 选中某一项打勾

    (sender as ToolStripMenuItem).Checked = !(sender as ToolStripMenuItem).Checked;

  5. sizeof运算符、字节对齐考点(面宝P50)

    记住几句话: 结构体的长度一定是最长的数据元素类型的整数倍: 某数据元素的起始地址能被该类型所占的字节数整除: 静态变量是存放在全局数据区,而sizeof计算栈中分配的大小,不包括static变量: ...

  6. 【JZOJ5428】【NOIP2017提高A组集训10.27】查询

    题目 给出一个长度为n的序列a[] 给出q组询问,每组询问形如\(<x,y>\),求a序列的所有区间中,数字x的出现次数与数字y的出现次数相同的区间有多少个. 分析 我们可以维护一个前缀和 ...

  7. C# 常用方法——图片转base64字符串

    其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html /// <summary> /// Image 转成 base64 / ...

  8. ng-reapte指令遍历

    <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...

  9. Springboot设置session超时时间

    按优先级高到低说: 第一种: spring boot 启动类里面: package com.mycenter; import org.mybatis.spring.annotation.MapperS ...

  10. CF1073D Berland Fair 二分+线段树

    考场上切的,挺简单的~ Code: #include <cstdio> #include <algorithm> #define N 200005 #define inf 10 ...