Java内部类介绍
在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内部类介绍的更多相关文章
- Java基础-内部类介绍
java内部类介绍 内部类一共分为4种 成员内部类 静态内部类 方法内部类 匿名内部类 下面我会为大家详细介绍每一个内部类!! 成员内部类 成员内部类就好像是外部类的一个成员属性,也是内部类中最常见的 ...
- 基础篇:JAVA内部类的使用介绍
目录 1 四种内部类 2 内部类的使用场景和优点 3 成员内部类 4 成员内部类的访问范围详解 5 静态内部类 6 局部内部类 7 匿名内部类 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 四 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- Android下HelloWorld项目的R.java文件介绍
R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R { public s ...
- js闭包vs Java内部类
前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...
- Java -- 内部类(二)
在上一篇博客Java --内部类(一)中已经提过了,java中的内部类主要有四种:成员内部类.局部内部类.匿名内部类.静态内部类. 该文主要介绍这几种内部类. 成员内部类 成员内部类也是最普通的内部类 ...
- 【转】java内部类的作用分析
转自:http://blog.csdn.net/ilibaba/article/details/3866537 另收另外一篇有空的时候看:http://jinguo.iteye.com/blog/71 ...
- Java内部类超详细总结(含代码示例)
什么是内部类 什么是内部类? 顾名思义,就是将一个类的定义放在另一个类的内部. 概念很清楚,感觉很简单,其实关键在于这个内部类放置的位置,可以是一个类的作用域范围.一个方法的或是一个代码块的作用域范围 ...
- 夯实Java基础系列18:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
随机推荐
- springboot异常
异常如下: org.springframework.context.ApplicationContextException: Unable to start embedded container; n ...
- nginx设置负载均衡
...... why负载均衡,随着企业业务增长和海量请求,给服务端造成海量并发,导致响应不及时需扩容后端服务,前端需要负载均衡,均摊请求,让服务端吞吐请求的能力提升 单点服务方式,一个点挂掉整个服务就 ...
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- ToolStrip 选中某一项打勾
(sender as ToolStripMenuItem).Checked = !(sender as ToolStripMenuItem).Checked;
- sizeof运算符、字节对齐考点(面宝P50)
记住几句话: 结构体的长度一定是最长的数据元素类型的整数倍: 某数据元素的起始地址能被该类型所占的字节数整除: 静态变量是存放在全局数据区,而sizeof计算栈中分配的大小,不包括static变量: ...
- 【JZOJ5428】【NOIP2017提高A组集训10.27】查询
题目 给出一个长度为n的序列a[] 给出q组询问,每组询问形如\(<x,y>\),求a序列的所有区间中,数字x的出现次数与数字y的出现次数相同的区间有多少个. 分析 我们可以维护一个前缀和 ...
- C# 常用方法——图片转base64字符串
其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html /// <summary> /// Image 转成 base64 / ...
- ng-reapte指令遍历
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...
- Springboot设置session超时时间
按优先级高到低说: 第一种: spring boot 启动类里面: package com.mycenter; import org.mybatis.spring.annotation.MapperS ...
- CF1073D Berland Fair 二分+线段树
考场上切的,挺简单的~ Code: #include <cstdio> #include <algorithm> #define N 200005 #define inf 10 ...