Java内部类初探
Java内部类初探
之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结。
Java内部类一般可以分为以下三种:
- 成员内部类
- 静态内部类
- 匿名内部类
一、成员内部类
内部类的创建:成员内部类的创建需要依赖于外部类对象,没有创建外部类实例之前无法创建成员内部类对象
若在main函数中直接创建成员内部类则会报错:
MemberInner memberInner = new MemberInner();
私有属性访问:成员内部类可直接访问外部类非静态私有属性,外部类访问内部类私有属性则需要通过内部类的对象来访问
在
memberInnerTest()方法中,可以直接访问外部类中的私有test字段,若内部类中有与外部类同名字段,调用外部类需要使用如下方法:OuterTest.this.test
创建内部类:
在外部类内部创建内部类对象:使用new关键字创建内部类对象
private void createMemberInner(){
MemberInner memberInner = new MemberInner();
memberInner.memberInnerTest();
}
在外部类外部创建内部类对象:需要先创建外部类对象,再通过外部类创建内部类
OuterTest outerTest = new OuterTest();
MemberInner memberInner = outerTest.new MemberInner();
若不需要使用外部类,可以使用如下方式创建内部类
MemberInner memberInner = new OuterTest().new MemberInner();
使用该方法创建内部类需要注意:若外部类中有多个内部类,这种方法会
new出多个外部类对象,各个类对象都是独立的,因此外部类的成员变量并不会在内部类中共享。如下代码中,由于new出了两个
OuterVar类,所以InnerOne与InnerTwo类输出的成员变量var均为0。若想InnerOne与InnerTwo类共享成员变量var,则需用如下方式创建:OuterVar outerVar = new OuterVar();
InnerOne innerOne = outerVar.new InnerOne();
InnerTwo innerTwo = outerVar.new InnerTwo();
public class OuterVar {
private int var = 0; class InnerOne{
private void innerOnePrint(){
System.out.println("innerOnePrint:"+var);
var+=1;
}
} class InnerTwo{
private void innerTwoPrint(){
System.out.println("innerTwoPrint:"+var);
}
} public static void main(String[] args) {
InnerOne innerOne = new OuterVar().new InnerOne();
InnerTwo innerTwo = new OuterVar().new InnerTwo(); innerOne.innerOnePrint();
innerTwo.innerTwoPrint();
}
}
/* 结果
innerOnePrint:0
innerTwoPrint:0
*/
/*1、成员内部类
2、静态内部类
3、匿名内部类
*/
public class OuterTest {
/*
1、成员内部类
*/
private String test = "OuterTest";
private void createMemberInner(){
MemberInner memberInner = new MemberInner();
memberInner.memberInnerTest();
}
class MemberInner{
private String test = "MemberInnerTest";
public void memberInnerTest(){
System.out.println("MemberInner");
System.out.println(test);
System.out.println(OuterTest.this.test);
}
}
public static void main(String[] args) {
// 成员内部类
OuterTest outerTest = new OuterTest();
MemberInner memberInner = outerTest.new MemberInner();
// MemberInner memberInner = new OuterTest().new MemberInner();
memberInner.memberInnerTest();
}
}
/* 结果
MemberInner
MemberInnerTest
OuterTest */
二、静态内部类
静态内部类定义在外部类的内部,使用static关键字修饰,静态内部类不需要外部类对象产生就能使用,不能访问外部类的成员域,但能访问静态域。
私有属性访问:静态内部类不可直接访问外部类的非静态属性
创建内部类:
在外部类内部创建内部类对象:使用new关键字创建内部类对象
private void createStaticInner(){
StaticInner staticInner = new StaticInner();
staticInner.staticInnerTest();
}
在外部类外部创建内部类对象:可以不创建外部类对象,直接创建内部类对象
StaticInner staticInner = new StaticInner();
public class OuterTest {
/*
2、静态内部类
*/
private String test = "OuterTest";
private void createStaticInner(){
StaticInner staticInner = new StaticInner();
staticInner.staticInnerTest();
}
static class StaticInner{
private String test = "StaticInnerTest";
public void staticInnerTest(){
System.out.println("StaticInner");
System.out.println(test);
}
}
public static void main(String[] args) {
// 静态内部类
StaticInner staticInner = new StaticInner();
staticInner.staticInnerTest();
}
}
/* 结果
StaticInner
StaticInnerTest */
三、匿名内部类
使用匿名内部类的前提条件:必须继承一个父类或实现一个接口。 有以下一些特点:
- 由于匿名内部类是没有类名,所以匿名内部类不能有构造方法
- 匿名内部类不能定义任何静态成员、方法和类
//匿名内部类
interface Father{
public abstract void talk();
public abstract void eat();
}
public class Test {
public static void main(String[] args) {
//匿名内部类
Father father = new Father() {
@Override
public void talk() {
System.out.println("I'm Father");
}
@Override
public void eat() {
System.out.println("I'm eating");
}
};
father.talk();
father.eat();
}
}
/* 结果
I'm Father
I'm eating */
Java内部类初探的更多相关文章
- 「Java基本功」一文读懂Java内部类的用法和原理
内部类初探 一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能 ...
- 夯实Java基础系列18:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类和匿名内部类
内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...
- Java内部类小程序(成员内部类,静态内部类,匿名内部类)
/** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
随机推荐
- Android高仿网易云音乐-启动界面实现和动态权限处理
效果 实现分析 基本上没有什么难点,就是布局,然后显示用户协议对话框,动态处理权限,判断是否显示引导界面,是否显示广告界面等. 布局 <?xml version="1.0" ...
- 洛谷P4017 最大食物链数量 dfs
老规矩,传送门 做题从头到尾的思路: 1. 这个题明显就是dfs数数量了,简单,邻接矩阵干他! TLE警告,8个点 额... 2. 老师说这玩意不能邻接矩阵?没事,还有邻接表,再来! 再次TLE 8个 ...
- WannaRen来袭:螣龙安科带你盘点那些年的勒索病毒
2020年4月7日,360CERT监测发现网络上出现一款新型勒索病毒wannaRen,该勒索病毒会加密windows系统中几乎所有的文件,并且以.WannaRen作为后缀.360CERT该事件评定:危 ...
- 【每天学一点-04】使用脚手架搭建 React+TypeScript+umi.js+Antd 项目
一.使用脚手架搭建项目框架 1.首先使用脚手架搭建React项目(React+TypeScript+Umi.js) 在控制台输入命令:yarn create @umijs/umi-app 2.引入An ...
- C#程序设计的6大原则
设计模式:面向对象语言开发过程中,遇到各种场景和问题,解决方案和思路沉淀下来,就是设计模式.俗称,套路 设计模式的六大原则:理解为面向对象语言开发过程中推荐的一些指导性的原则,通俗的说是套路的 套路 ...
- Redis 5 种基本数据结构(String、List、Hash、Set、Sorted Set)详解 | JavaGuide
首发于:Redis 5 种基本数据结构详解 - JavaGuide 相关文章:Redis常见面试题总结(上) . Redis 5 种基本数据结构(String.List.Hash.Set.Sorted ...
- HashSet集合的介绍和哈希值
java.util.Set接口 extends Collection接口 Set接口的特点: 1.不允许存储重复的元素 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.uti ...
- YII学习总结1
YII 安装(2.0 advanced) 以下借鉴别人的博文 http://www.jb51.net/article/54055.htm 今天终于搞明白怎么安装Yii2了.对于我这种小白来说真是费尽 ...
- 记一次 .NET 某工控自动化控制系统 卡死分析
一:背景 1. 讲故事 前段时间遇到了好几起关于窗体程序的 进程加载锁 引发的 程序卡死 和 线程暴涨 问题,这种 dump 分析难度较大,主要涉及到 Windows操作系统 和 C++ 的基础知识, ...
- GTID主从和lamp架构运行原理
目录 GTID主从 GTID概念介绍 GTID工作原理 GTID主从配置 lamp lamp简介 web服务器工作流程 cgi与fastcgi http协议 是什么? lamp架构运行的原理 Apac ...