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学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
随机推荐
- GIS基础软件及操作(五)
原文 GIS基础软件及操作(五) 练习五.空间分析的基本操作 空间分析的基本操作 空间分析模块 空间分析是基于地理对象的位置和形态的空间数据的分析技术,其目的在于提取和传输空间信息.空间分析是地理信息 ...
- windows和linux双系统,重新分区后修复grub
我电脑里装的是 windows 7 profressional 和 fedora 12 ,本来给 C 盘分了 50G ,原本以为够了,结果50G 瞬间用完,于是乎开始重新分区. PQ 是不能用了,上网 ...
- 微软Skype实时口译增加中文
直击现场 在机器翻译技术上,微软的 Skype 业务也算是行业内名列前茅.日前其实时口语翻译技术再次跃升一个台阶,新增了对中文(普通话)的翻译支持. 据美国科技新闻网站 TheVerge 报道,此前, ...
- face='Webdings' 的字体对照表
刚才研究动网论坛代码,发现一个页面提示标记 i 感觉很神奇,看了半天才明白原来是一种叫“Webdings”的字体,其实很简单,只需要<font face='webdings' size=&quo ...
- Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核
Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...
- 七、Linux磁盘管理及LVM讲解
1.硬盘接口 IDE:家用产品,也部分应用于服务器 SATA:一般使用 SCSI:服务器市场 SAS:高端服务器上,价格昂贵 2.硬盘种类 SATA硬盘: SCSI硬盘: SAS硬盘: 3.分区 ...
- win7 docker安装文件及安装问题
最近在玩爬虫,需要装docker,但是官网对于win7版本,只支持docker tool box,在官网找了半天才找到安装包,特此上传百度网盘,方便各位下载 链接:https://pan.baidu. ...
- C++程序设计2(侯捷video all)
一.转换函数Conversion function(video2) 一个类型的对象,使用转换函数可以转换为另一种类型的对象. 例如一个分数,理应该可以转换为一个double数,我们用以下转换函数来实现 ...
- CentOS7.x mini安装OVS
命令均在root用户下运行: 一.关闭防护墙及selinux sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config setenfor ...
- 【ubuntu】软件安装与apt-get下载软件的存放位置
系统:Ubuntu16.04 常用的软件安装方式有两种: 第一种:apt-get(安装后略类似于windows中的安装版软件): 例:apt-get install ssh 1.下载的软件存放位置 / ...