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都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
随机推荐
- zookeeper伪集群搭建
zookeeper伪集群搭建 1. 下载zookeeper: https://zookeeper.apache.org/ 2. 解压: tar -zxvf zookeeper-3.4.14.tar.g ...
- Django开发框架知识点
一.什么是web服务器(了解) 当我们在浏览器输入URL后,浏览器会先请求DNS服务器,获得请求站点的 IP 地址.然后发送一个HTTP Request(请求)给拥有该 IP 的主机,接着就会接收到服 ...
- mongoose基本增删改查
1.安装 打开命令行 npm i mongoose 2.连接数据库 // 引入安装的包 var mongoose = require('mongoose'); mongoose.connect('mo ...
- python学习-练习题9*9乘法表巩固
9*9乘法表 分析: 1X1为一行 1X2 2X2 为一行 for i in range(1,10): for j in range(1,i+1): print(str(i) + 'X' + str( ...
- linux 读取 USB HID鼠标坐标和点击 在 LCD上显示
首先要,编译内核时启用了 USB HID 设备.启用了 鼠标 . 在开发板上插入usb 时会有如下提示. 可以看到,多了一个 mouse0 和 eventX 打出来的是我的 联想鼠标. 1, 在 终端 ...
- Python 3:ImportError “No Module named Setuptools”的解决方法
sudo apt-get install python-setuptools python3-setuptools
- C++ for循环练习
#include <stdio.h> //题目:现有公鸡5元一只,母鸡3元一只,小鸡1元3只(小鸡不能单买 最少3只起卖),此时顾客有100元,请问有多少种购买方案. int main() ...
- mysql5.7 ERROR 1045 (28000): Access denied for user解决方法
https://blog.csdn.net/csy2961903/article/details/51345401 参考此文注意指名数据库mysql.user
- 网络安全从入门到精通 (第二章-2) 后端基础SQL—MySQL数据库简介及SQL语法
本文内容: 什么是数据库 常见数据库 数据库的基本知识 基本SQL语法 1,什么是数据库? 数据库就是将大量数据保存起来,通过计算机加工,可以高效访问的数据聚合. 数据库就是长期存储在计算机内,有组织 ...
- SpringMVC框架——视图解析
SpringMVC视图解析,就是将业务数据绑定给JSP域对象,并在客户端进行显示. 域对象: pageContext.request.session.application 业务数据绑定是有ViewR ...