Java编程思想:内部类其他知识点
public class Test { public static void main(String[] args) { // InheritInner.test(); // EggTest.test(); LocalInnerClass.test(); } } /* 内部类的继承: 问题在于,那个指向外围类对象的“秘密的”引用必须被初始化,而在导出类中 不再勋在可链接的默认对象。要解决这个问题,必须使用特殊的语法来明确的 说清楚它们之间的关联。 */ /* 这个语法,好像有点复杂,不知道为什么会有在外部继承一个内部类的需求 这几行代码的关系,理不清,就当做是一种语法给记下来吧 */ class WithInner { class Inner{} } class InheritInner extends WithInner.Inner { InheritInner(WithInner withInner) { withInner.super(); } public static void test() { WithInner wi = new WithInner(); InheritInner ii = new InheritInner(wi); } } /* 内部类会不会被覆盖 */ class Egg{ private Yolk yolk; protected class Yolk { public Yolk() { System.out.println("Egg.Yolk()"); } } public Egg() { System.out.println("new Egg()"); yolk = new Yolk(); } } class BigEgg extends Egg { public class Yolk { public Yolk() { System.out.println("BigEgg.Yolk()"); } } //加行代码,测试一下 public BigEgg() { new Yolk(); } } class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } //这儿进行了改动 private Yolk yolk = new Yolk(); public Egg2(){ System.out.println("New Egg2()"); } public void insertYolk(Yolk yolk) { this.yolk = yolk; } public void g() { yolk.f(); } } class BigEgg2 extends Egg2 { public class Yolk extends Egg2.Yolk { public Yolk() { System.out.println("BigEgg2.Yolk()"); } public void f(){ System.out.println("BigEgg2.Yolk.f()"); } } public BigEgg2() { insertYolk(new Yolk()); } } class EggTest { public static void test() { //我感觉这个案例没有任何悬念 // new BigEgg(); // new BigEgg(); /* 分析下这一行代码执行了哪些步骤: 1.调用BigEgg2(),系统先构造父类对象; 2.父类对象中,成员变量的值yolk先于构造函数,调用Yolk构造 输出New Egg2.Yolk() 3.调用Egg2的构造函数 输出New Egg2() 4.调用BigEgg2的构造,在构造中调用Yolk的构造,此时的Yolk是BigEgg2中定义的 5.构造BigEgg2.Yolk前,先构造父类对象Egg2.Yolk 输出New Egg2.Yolk() 输出New BigEgg.Yolk() */ Egg2 e2 = new BigEgg2(); e2.g(); } } /* 局部内部类 具备内部类不能有访问说明符(static、private等) 使用局部内部类而不使用匿名内部类的两个理由: 1.需要一个已命名的构造器 2.需要不知一个该内部类对象 */ interface Counter{ int next();} class LocalInnerClass { private int count = 0; Counter getCounter(final String name) { class LocalCounter implements Counter { { System.out.println("LocalCounter()"); } @Override public int next() { // System.out.println(name); return count++; } } return new LocalCounter(); } Counter getCounter2(final String name) { return new Counter() { { System.out.println("Counter()"); } @Override public int next() { // System.out.println(name); return count++; } }; } public static void test() { LocalInnerClass lic = new LocalInnerClass(); Counter c1 = lic.getCounter("A"); Counter c2 = lic.getCounter2("B"); for (int i = 0; i < 5; i++) { System.out.println(c1.next()); } for (int i = 0; i < 5; i++) { System.out.println(c2.next()); } } }
Java编程思想:内部类其他知识点的更多相关文章
- Java编程思想:NIO知识点
import java.io.*; import java.nio.*; import java.nio.channels.FileChannel; import java.nio.charset.C ...
- Java编程思想学习(八) 内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...
- JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)
switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...
- Java 编程思想 Chapter_14 类型信息
本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最 ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
- 《Java编程思想》读书笔记(二)
三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- Java编程思想读书笔记之内部类
现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
随机推荐
- Socket小白篇-附加TCP/UDP简介
Socket小白篇-附加TCP/UDP简介 Socket 网络通信的要素 TCP和UDP Socket的通信流程图 1.Socket 什么是Socket Socket:又称作是套接字,网络上的两个程序 ...
- 【Windows10 IoT开发系列】开发人员模式设置
原文:[Windows10 IoT开发系列]开发人员模式设置 声明:本文转自微软Windows 开发人员中心(https://msdn.microsoft.com/library/windows/ ...
- Microsoft .NET Framework 3.5 SP1安装错误 1603
ghost版安装时由于系统简化引起上述错误,你按下面方法试一下1.点击电脑桌面右下角的“开始”按钮,点击“运行”按钮,在弹出的节目输入框中输入“regedit”.2.在弹出来的“注册表编辑器”界面上, ...
- ASP.NET MVC控制器Controller
控制器的定义 MVC模式下的控制器(Controller)主要负责响应用户的输入,并且在响应时可能的修改模型(Model). 之前的URL访问,通常是通过指定服务器的路径来实现,如访问URL:http ...
- 使用 GNU autotools 改造一个软件项目
使用 GNU autotools 改造一个软件项目 及永刚 jungle@soforge.com 2006 年 3 月 24 日 版本:0.3 本文不是一篇规范的教程,而是用一个软件项目作为例子,演 ...
- MinGW版Qt如何搭建lua环境?(详细步骤)
操作系统是windows,lua是Lua for Windows 5.1.4包含了这三个头文件 <ignore_js_op> 在.pro里加了includepath: <ignor ...
- libevent for qt的讨论
一直对Qt官方的QtNetwork模块抱有遗憾,Qt自带的网络模块用的是select模型,无法支持高并发的服务器开发.最近在网上看到有个libevent for qt的东西,它直接替换了Qt的sele ...
- 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
一.概述 面向过程:根据业务逻辑从上到下写代码 函数式:将具有一些功能的代码封装到函数中,需要的时候调用即可 面向对象:对函数进行分类和封装,让开发更方便,更快捷 Java和C#只支持面型对象编程,, ...
- 发布一个Django项目
一.部署环境准备,准备python3和虚拟环境解释器,virtualenvwrapper 1.修改python3的环境变量 PATH=/opt/python36/bin:/usr/local/sbin ...
- Tuxera NTFS 2018 for Mac中文破解版 U盘读写软件-让你的Mac支持NTFS
下载链接(复制到浏览器下载):http://h5ip.cn/TLMc 软件介绍 给大家带来一款苹果Mac上如何使用U盘读写的软件,Tuxera NTFS 2018 for Mac中文破解版,Mac O ...