初探JAVA内部类细节一
定义:
可以将一个类的定义放在另一个类的内部 这就是内部类。--摘自java编程思想
一般实现方式:
public class SimpleInnerClass {
class Content {
private int i;
public int getVlaue() {
return i;
}
}
class Description {
private String lable;
Description(String lab) {
this.lable = lab;
}
public String readLable() {
return lable;
}
}
public void ship(String lable) {
Content content=new Content();
Description description=new Description(lable);
System.out.println(description.readLable());
}
public static void main(String[] args) {
Parcle2 parcle2 = new Parcle2();
parcle2.ship("hi");
}
}
上面的事例是最普通不过的内部类表达的例子,通过创建内部类对象的引用访问内部类方法
但一般有更通用的做法,通常是在外围类创建一个方法关联内部类的引用;通过这种方式来建立彼此之间的联系。以代码为例:
public class InnerClass {
class Content {
private int i;
public int getVlaue() {
return i;
}
}
class Description {
private String lable;
Description(String lab) {
this.lable = lab;
}
public String readLable() {
return lable;
}
}
public Content getContentInstance() {
return new Content();
}
public Description getDescriptionIntance(String lable) {
return new Description(lable);
}
public void ship(String lable) {
Content content = getContentInstance();
Description description = getDescriptionIntance(lable);
System.out.println(description.readLable());
System.out.println(description.readLable());
}
public static void main(String[] args) {
InnerClass parcle2 = new InnerClass();
parcle2.ship("hi");
InnerClass.Content c = parcle2.getContentInstance();// 如果想在外部类的非静态方法之外的任意位置访问某个内部类的对象,那么必须通过OutClass.xx
InnerClass.Description d = parcle2.getDescriptionIntance("hello");
}
}
有了联系之后内部类就可以访问外围类的所有元素,无论是private类型也可以。
以下代码即是佐证:
public interface Selector {
boolean end();
Object current();
void next();
}
public class Sequence {
private Object[] items;
private int next = 0;
public Sequence(int size) {
items = new Object[size];
}
public void add(Object object) {
if (next < items.length) {
items[next++] = object;
}
}
class SequenceSelector implements Selector {
private int i = 0;
@Override
public boolean end() {
// TODO Auto-generated method stub
return i == items.length;
}
@Override
public Object current() {
// TODO Auto-generated method stub
return items[i];
}
@Override
public void next() {
if (i < items.length) {
i++;
}
}
}
/**
* 内部类对象只有与外围类对象相关联时才能被创建<p>
* 构建内部类对象时,需要指向一个其外围类对象的引用;如果编译器访问不到这个引用就会报错
* @return
*/
public Selector selector() {
return new SequenceSelector();
}
public static void main(String[] args) {
Sequence sequence = new Sequence(5);
for (int i = 0; i < 5; i++) {
sequence.add(i);
}
// Sequence.SequenceSelector c=sequence.selector();
Selector selector = sequence.selector();
while (!selector.end()) {
System.out.println(selector.current());
selector.next();
}
}
}
在此,比较初始化的内部类细节介绍完毕,下一章笔者在继续介绍更深一层次的内部类细节
p.p1 { margin: 0; font: 12px Menlo }
p.p2 { margin: 0; font: 12px Menlo; color: rgba(147, 26, 104, 1) }
p.p3 { margin: 0; font: 12px Menlo; min-height: 14px }
span.s1 { color: rgba(147, 26, 104, 1) }
span.s2 { color: rgba(0, 0, 0, 1) }
span.s3 { color: rgba(3, 38, 204, 1) }
span.s4 { color: rgba(126, 80, 79, 1) }
span.s5 { text-decoration: underline; color: rgba(126, 80, 79, 1) }
span.s6 { color: rgba(57, 51, 255, 1) }
span.Apple-tab-span { white-space: pre }
初探JAVA内部类细节一的更多相关文章
- java内部类细节
1 package face_09; 2 /* 3 * 为什么内部类能直接访问外部类中的成员呢? 4 * 那是因为内部类持有了外部类的引用. 外部类名.this 5 * 6 */ 7 class Ou ...
- Java内部类初探
Java内部类初探 之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结. Java内部类一般可以分为以下三种: 成员内部类 静态内部类 匿名内部类 一.成员内 ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- 9)Java内部类(Inner Class)
内部类:不可以有静态数据,静态方法或者又一个静态内部类 内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...
- Java内部类的使用小结
转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...
- (转载)Java内部类的使用小结
原文摘自:http://android.blog.51cto.com/268543/384844/ 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态stati ...
- java内部类深入详解 内部类的分类 特点 定义方式 使用
本文关键词: java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内 ...
随机推荐
- 初学者刚学c++在定义类时只有成员变量易犯的错误
------------------------ #include<iostream> using namespace std;//c++的命名空间 class circle { publ ...
- PyQt(Python+Qt)学习随笔:QListView的layoutMode属性和batchSize属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 batchSize属性 该属性是在layoutMode属性设置为Batched时,用于控制每个批量的 ...
- PyQt学习随笔:Qt中Model/View中的Model Index
Qt中Model/View中的Model Index是一个类,该类用于定位Model/View中数据模型中的数据. Model Index是从QAbstractItemModel派生的子类,用于在项视 ...
- Java面试专题-多线程(3)-原子操作
- JAVA_数据类型介绍与基本数据类型之间的运算规则
基本数据类型 整型: byte.short.int.long java 的整型常量默认为int型,在java程序中变量通常声明为int型,除非不足以表示较大的数才用long,而在声明long型常量必须 ...
- 原生js之事件解绑
#removeEventListener ##html <button id='btn'>click</button> ##js ###第一种方式(错误方式) var btn ...
- 【Home Page】本博客使用指南
[关于] 坐标:ZJ.HZ.XJ. 高一现役 OIer,经常被吊打. Luogu:_Wallace_ [近期] 浙大 ICPC-ACM 2020 部分题解: 关键字「ZJU-ICPC Summer T ...
- 【学习笔记】K-D tree 区域查询时间复杂度简易证明
查询算法的流程 如果查询与当前结点的区域无交集,直接跳出. 如果查询将当前结点的区域包含,直接跳出并上传答案. 有交集但不包含,继续递归求解. K-D Tree 如何划分区域 可以借助下文图片理解. ...
- Java8的Lambda表达式,你会不?
目录 理解Lambda 基础语法 函数式接口 常用的函数式接口 消费型接口 供给型接口 断言型接口 函数型接口 方法引用 数组引用 构造器引用 总结 参考阅读 理解Lambda Lambda表达式可以 ...
- 容器编排系统之Kubectl工具的基础使用
前文我们了解了k8s的架构和基本的工作过程以及测试环境的k8s集群部署,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14126750.html:今天我们主要来 ...