一:内部类概述

(一)定义

内部类(Inner Class)是定义在其他类中或方法中的类,包含内部类的类通常称作Enclosing Class
内部类的功能通常与包含它的类的功能有紧密的关联
内部类的存取控制方式与同他在同一位置上的成员是相同的

(二)分类

静态内部类(Static inner class)
成员内部类(Member inner class)
本地内部类(Local inner class)
匿名内部类(Anonymous inner class)

二:静态内部类

定义静态内部类的方法类似于声明类的一个静态成员:
public class OutClass {
private static int staticOutMem=;
public static class InnerClass{
//private static int staticOutMem=1;  //若是这里注释去掉,会有两个成员变量,名字相同,根据调用方法,选择究竟是哪一个 public void innerMethod() {
System.out.println(staticOutMem); //先在内部类自己里面找,找不到会去外部类中找,同继承一样,会继承外部类的全部财产,不过更加彻底,会继承私有类
}
} public static void main(String[] args) {
//声明
OutClass.InnerClass InnerObj;
//创建
InnerObj= new OutClass.InnerClass();
//使用
InnerObj.innerMethod();
}
}

注意:外部类方法,会调用外部成员

public class OutClass {
private static int staticOutMem=; private static void setOutMem(int a) {
staticOutMem=a;
} public static class InnerClass{
private static int staticOutMem=; public void innerMethod() {
setOutMem(staticOutMem+);
System.out.println(staticOutMem); //先在内部类自己里面找,找不到会去外部类中找
System.out.println(OutClass.staticOutMem);  //输出会知道调用的方法修改的是这个值
}
} public static void main(String[] args) {
//声明
OutClass.InnerClass InnerObj;
//创建
InnerObj= new OutClass.InnerClass();
//使用
InnerObj.innerMethod();
}
}

总结

.静态内部类不能与其Enclosing Class同名

2.静态内部类是类的成员,因此静态内部类可以直接访问Enclosing Class中的所有静态成员,包括private和protected成员;

3.但是,在Enclosing Class中不能直接访问静态内部类的成员(必须加上静态内部类名) 作为类的静态成员,不能在静态内部类中直接访问Enclosing Class的非静态成员

三:成员内部类:与静态类相似,不同在对象创建上

定义成员内部类的方法类似于定义一个类的普通成员:
public class OutClass {
public int OutMem; public class InnerClass{
public void innerMethod() {
System.out.println(OutMem);
}
} public static void main(String[] args) {
//声明
OutClass.InnerClass InnObj;
//定义
InnObj= new OutClass().new InnerClass();
InnObj.innerMethod();
}
}

总结:

1.成员内部类不能与它的Enclosing Class同名,而且成员内部类中不能定义静态的成员变量或方法!!

2.成员内部类可以访问Enclosing Class中的所有成员,不论静态成员还是非静态成员;而Enclosing Class中不能直接访问成员内部类的成员

3.在成员内部类的方法中this是内部类当前对象的引用,如果需要访问当前的外部类对象需要使用Enclosing.this

四:本地内部类

本地内部类(Local Inner Class)是定义在方法中的内部类:
public class OutClass {
private int age=; public void LocalInnerClass() {
//本地内部类不能使用访问限定符
//只能在方法中使用,外部无法获取

class LocalInner{
public String name="a"; public void getInfo() {
System.out.println(name+" "+age);
}
} LocalInner LI = new LocalInner();
LI.getInfo();
} public static void main(String[] args) {
OutClass oc = new OutClass();
oc.LocalInnerClass();
}
}

总结:

本地内部类不能与它的Enclosing Class同名,而且本地内部类中不能定义静态的成员变量或方法

本地内部类可以访问Enclosing Class中的所有成员,不论静态成员还是非静态成员;而Enclosing Class中不能直接访问本地内部类的成员

五:匿名内部类

匿名内部类是没有名字的内部类,起作用是在建立对象的时候完成对类的定义,而不需要给类起名字
定义匿名内部类时需要给出类的超类
也可以通过指定类要实现的接口来创建匿名内部类,但是只能有一个接口

(一)无参构造

//必须有一个超类或者接口才可以进行调用
interface SuperClass{
public void getInfo();
} public class OutClass { public static void main(String[] args) {
SuperClass sc=new SuperClass() {  //相当于父类指针,所以父类必须有这个方法getInfo的接口
public void getInfo() {
System.out.println("this non class");
}
}; sc.getInfo();  
}
}

(二)有参构造

//必须有一个超类或者接口才可以进行调用
abstract class SuperClass{
public int age;
public SuperClass(int a) {
age=a;
} public abstract void getInfo();
} public class OutClass { public static void main(String[] args) {
SuperClass sc=new SuperClass() {
public void getInfo() {
System.out.println("age is "+age);
}
}; sc.getInfo();
}
}

总结:

匿名内部类对Enclosing Class的访问权限同本地内部类相同
注:匿名内部类最常见的用途是在建立GUI应用程序时为组件添加事件监听器对象

JAVA核心技术I---JAVA基础知识(内部类)的更多相关文章

  1. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  2. Java核心技术 卷1 基础知识-第一天

    基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...

  3. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  4. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  5. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  6. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  7. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  8. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  9. JAVA面试题相关基础知识

        1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...

  10. Java Script 学习笔记 -- 基础知识

    Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...

随机推荐

  1. java zip API实现压缩和解压缩zip包

    package zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io ...

  2. [IOI2018]组合动作——构造

    题目连接: [IOI2018]combo 题目大意:有一个未知的长度为n的字符串$T$,只包含$A,B,X,Y$四个字符且首字母只出现一次,每一次你可以询问一个长度不超过$4n$的字符串$S$,交互库 ...

  3. 局域网共享hfs 软件使用

    前言 由于想从局域网同学电脑上偷点小片,又不想用u盘拷贝.所有在同学电脑上打开hfs软件,通过自己电脑ie浏览器(chrome不行报错)下载即可. 流程 1.两台电脑在同一局域网下,在同学电脑上打开h ...

  4. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  5. 【BZOJ2208】【JSOI2010】连通数 传递闭包

    题目描述 定义一个图的连通度为图中可达顶点对的数目.给你一个\(n\)个点的有向图,问你这个图的连通度. \(n\leq 2000,m\leq n^2\) 题解 一个很简单的做法就是传递闭包:像flo ...

  6. nginx配置80端口访问8080+项目名地址

    tomcat访问项目,一般是 ip + 端口 + 项目名 nginx 配置 location / {} ,一般只能跳转到 ip + 端口,如果想要直接访问项目,就需要修改tomcat的配置了 如何保证 ...

  7. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】

    真是个简单坑题...++ 前置: exgcd,exCRT,STL-multiset 读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求.攻击最少显然应该对于每一条龙都操作一次,即 ...

  8. django 模板语言

    母版与继承: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  9. LOJ#510 北校门外的回忆(找性质+倍增+线段树)

    这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...

  10. can物理信号-----------显性和隐性

    can信号使用差分电压传送,两条信号线被称为CAN_H和CAN_L.静态时均是2.5v左右,此时状态表示为逻辑“1”,也可以叫做隐性.用CAN_H比CAN_L高表示逻辑“0”,称为显性,此时通常电压值 ...