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都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
随机推荐
- 使用 custom element 创建自定义元素
很早我们就可以在 HTML 文档中写 <custome-element></custom-element> 这样的自定义名称标签.但是浏览器对于不认识的标签一律当成一个普通的行 ...
- 前端每日实战:85# 视频演示如何用纯 CSS 创作一个小球反弹的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 此视频是可 ...
- localStorage,sessionStorage的方法重写
本文是针对于localStorage,sessionStorage对于object,string,number,bollean类型的存取方法 我们知道,在布尔类型的值localStorage保存到本地 ...
- 【字节校招】【实习】【内推】字节跳动春招(校招或实习均可)以及日常实习内推ing
本人是年前刚刚入职抖音的应届生,职业认证还未来的级更改,但是这些都不重要.重要的是我们不能错过优秀的你~ 字节跳动的相关福利我就不介绍了,技术实习生是400/天,房补是1500/月,三餐免费,下午茶, ...
- 随着php7的发布我个人觉得有必要进行一下历史回顾和整理
先看下人尽皆知的发展历史: HP 继承自一个老的工程,名叫 PHP/FI.PHP/FI 在 1995 年由 Rasmus Lerdorf 创建,最初只是一套简单的 Perl 脚本,用来跟踪访问他主页的 ...
- 第二篇:如何安装Linux,虚拟机安装Linux
安装Linux的方法挺多,但是这里咱们只说一种:如何在虚拟机里安装运行Linux. 想必看此类文章的都是小白,所以下面我就写的通俗易懂点. 第一步:下载虚拟机软件.(虚拟机软件是啥?它 ...
- ES6—get 与 set
在类里面可以去定义一些getter和setter,getter可以得到一些东西的方法,setter可以设置东西 class Chef{ constructor(food){ this.food = f ...
- html5特性简要概括
1.html5主要的设计目的: 互联网语义化,以便更好地被人类和机器阅读 更好的在移动设备上支持web应用 https://www.w3.org/TR/html5 新增内容: 新的语义标签 <h ...
- Day1T3小w的魔术扑克——图论
为什么不搞\(T2\)??? 因为我太菜了,那题我是真的搞不出来 题目描述 链接:https://ac.nowcoder.com/acm/contest/1100/C 来源:牛客网 小\(w\)喜欢打 ...
- Flask wtforms 表单验证使用
目录 wtforms 使用1(简单版): 使用2(复杂版): wtforms 安装:pip3 install wtforms 使用1(简单版): from flask import Flask, re ...