Java系列之内部类
今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类、成员内部类、匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下:
- 概述
- 静态内部类
- 成员内部类
- 匿名内部类和方法内部类
- 总结
概述
顾名思义内部类就是在一个类内部定义的类,它是内部类是一个独立的类,编译之后会生成独立的 .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系列之内部类的更多相关文章
- JAVA基础之内部类
JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...
- 黑马程序员——JAVA基础之内部类,匿名内部类
------- android培训.java培训.期待与您交流! ---------- 内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类). 内部类访问特点: • 内部 ...
- Java学习之内部类
示例1: package com.swust.面向对象; class Person1{ private String username="zhangsan"; public Per ...
- Java面向对象之内部类(访问格式)
一.基础概念 1.内部类是定义在类中的类.A类需要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在. 2.内部类可以相当于外部类中的一个成员,可以被成员修饰符所修饰.(如:publ ...
- [内部类] java笔记之内部类
1.内部类的分类 2.成员内部类的定义格式 3.一旦使用了内部类,那么生成的class文件长啥样? 其中Body是外部类,Heart是Body的内部类,所以中间有个美元符号$,所以给类进行命名时,不要 ...
- Java面向对象之内部类(匿名内部类)
一.基础概念 匿名内部类:简化书写的内部类.其实匿名内部类就是一个子类对象. 前提:内部类需要继承或者实现外部的类或者接口. 格式:new 父类或者接口(){定义子类的内容} 二.将内部类定义到局部的 ...
- java之内部类
最近学了java,对内部类有一点拙见,现在分享一下 所谓内部类(nested classes),即:面向对象程序设计中,可以在一个类的内部定义另一个类. 内部类不是很好理解,但说白了其实也就是一个类中 ...
- 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)
Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
随机推荐
- JZOJ 5326. LCA 的统计 (Standard IO)
5326. LCA 的统计 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description Input Output S ...
- 前端H5,点击选择图片控件,图片直接在页面上展示~
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Centos7 U盘安装
以下内容来自 https://www.cnblogs.com/Hello-java/p/8628917.html 和 https://blog.csdn.net/fiiber/article/deta ...
- 小程序session_key失效解决方案、后台解密个人数据信息
目录 一.登录会话密钥 session_key 有效性 二.解决登录session_key 的问题 案例:解决session_key 过期问题,发送个人信息后台解密 后端解密信息,存入数据库 mysq ...
- flask 密码加密 视频资料
https://www.bilibili.com/video/av53870541/?p=33 通过在数据模型中定义函数来实现加密 from werkzeug.security import gene ...
- Linux定制化RPM包
定制化RPM包 1.Linux安装软件方法 1- rpm/yum安装 简单.速度快,但是不能定制安装 RPM RedHat Package Manager(RPM软件包管理器) 2- 二进制安装 解压 ...
- Asp.net Repeater控件的绑定与操作
由于repeater 控件具有的一个特性--循环 <ItemTemplate>的内容,Repeater 控件里的某个元素对象的绑定与获取,不像平常的,直接使用控件的 id 便可以给该控件进 ...
- BJDCTF
python3的模板注入 非常简单...就是直接执行命令就行..虽然过滤了flag,但是拼接下就好了.... payload: http://fd5883ee-b8e2-4bf1-88af-33936 ...
- React Native实现短信转发到微信上
缘由 都说需求来源于生活我为什么会有一个这么奇葩的需求呢?来看一个故事. 昨天为了省点手续费导航走了3公里多去找一家工行ATM机(没办法穷)然后到了以后发现ATM机在人家的园区里面,现在疫情进入要通行 ...
- 云CRM和本地CRM哪个更好
现在CRM系统按照服务器部署方式的不同分为本地CRM和云CRM两种,本地CRM需要在企业内部部署服务器,而云CRM的服务器则是安装在云服务器上面,很多企业可能不知道应该选择云CRM还是本地CRM.下面 ...