2019独角兽企业重金招聘Python工程师标准>>>

内部类:将一个类的定义放在另一个类的定义内部。

创建内部类:

//内部类
class Outer{class Inner{{System.out.println("Inner class");}public void print(){System.out.println("Inner print()");}
}public Inner inMethod(){return new Inner();}
}
public class OuterInnerTest {public static void main(String[] args){Outer out = new Outer();//从外部类的非静态方法之外的任意位置创建某个内部类的对象,必须具体地//指明这个对象:OuterClassName.InnerClassName。Outer.Inner in = out.inMethod();in.print();}
}

内部类自动拥有对其外围类所有成员的访问权。当外围类的对象创建了一个内部类对象时,此内部类对象会捕获一个指向外围类对象的引用。这样,在内部类访问外围类的成员时,是所捕获的引用在操纵内部类成员。

package Ten;
interface Selector{boolean end();Object current();void next();Sequence sequ();
}
public class Sequence {private Object[] items;private int next = 0;public Sequence(int size){items = new Object[size];}public void add(Object x){if(next < items.length)items[next++] = x;}class StringHolder{String str;StringHolder(String str){this.str = str;}public String toStr(){return str;}}//内部类 其中的三个方法都用到了外围类的items,说明内部类自动拥有对其外围类的所有成员的访问权private class SequenceSelector implements Selector{private int i = 0;public boolean end() {// TODO Auto-generated method stubreturn i == items.length;}public Object current() {// TODO Auto-generated method stubreturn items[i];}public void next() {// TODO Auto-generated method stubif(i < items.length)i++;}public Sequence sequ() {// TODO Auto-generated method stubreturn Sequence.this;//生成外部类的引用}}//迭代器设计模式public Selector selector(){return new SequenceSelector();}public static void main(String[] args){//创建内部类对象,此内部类对象会捕获一个指向外围类的引用,当访问外围类成员时就是用这个引用来访问Sequence sequence = new Sequence(10);for(int i=0;i<10;i++)/*String java.lang.Integer.toString(int i)
Returns a String object representing the specified integer.
*///sequence.add(Integer.toString(i));sequence.add(sequence.new StringHolder(Integer.toString(i)));Selector selector = sequence.selector();//内部类访问外围类的方法while(!selector.end()){System.out.print(selector.current() + " ");selector.next();}}
}/*0 1 2 3 4 5 6 7 8 9 */

.this、.new

可以使用外围类的名字加.this生成对外围类对象的引用。

package Ten;
class Outer3{class Inner3{Inner3(){System.out.println("Inner3");}}Outer3 outer(){return Outer3.this;//生成外部类的引用可以使用外部类的名字加.this}
}
public class OuterInner {public static void main(String[] args){Outer3 out3 = new Outer3();System.out.println(out3.outer());Outer3.Inner3 in3 = out3.new Inner3();//内部类对象的引用的创建方法}
}

在方法和作用域中的内部类

在作用域中的内部类:

 package Ten;
public class ZuoyongyuInner {private void internal(boolean b){if(b){//在作用域内定义内部类class Track{private String id;Track(String s){id = s;}String getTrack(){return id;}}//在作用域外内部类Track是不可用的Track tc = new Track("Track");String s = tc.getTrack();}}public void track(){internal(true);}public static void main(String[] args){ZuoyongyuInner zyi = new ZuoyongyuInner();zyi.track();}
}

exercise11

创建一个private内部类实现一个public接口,写一个方法返回此private内部类的引用,并将此引用向上转型为接口类型,尝试向下转型说明此内部类被完全隐藏了。

 package Ten;
class C{private class D implements B{public void f() {// TODO Auto-generated method stubSystem.out.println("Inner class D f()");}}public B Dm(){return new D();}//返回此private内部类的引用,并将此引用向上转型为接口类型}
public class PrivateInner {public static void main(String[] args){C c = new C();c.Dm().f();//D d = new D(); Dcannot be resolved to a type//D被完全隐藏了}
}/*Inner class D f()*/

匿名内部类

即没有名字的内部类。匿名内部类的分号;不是标记此内部类的结束,标记的是表达式的结束,只不过此表达式包含了匿名内部类。
Exercise13.

package Ten;
public class Exise13 {public B b(){return new B(){public void f() {// TODO Auto-generated method stubSystem.out.println("Anonymous class Exise13.B()");}}; //}public static void main(String[] args){Exise13 e = new Exise13();e.b().f();}
}/*Anonymous class Exise13.B()*/

Exercise15.

创建一个拥有含有参数的构造器的类,接着创建第二个类包含一个返回第一个类的对象的引用的方法

package Ten;
class NonDeCnstr{String str;NonDeCnstr(String str){this.str = str;System.out.println(str);}public void f(){System.out.println("NonDeCnstr f()");}
}
class ReturnNon{public NonDeCnstr nondec(String str){//返回第一个类的引用return new NonDeCnstr(str){public void f(){System.out.println("ReturnNon f()");}};}
}
public class Excise15{public static void main(String[] args){ReturnNon r = new ReturnNon();r.nondec("ABC").f();}
}/*
ABC
ReturnNon f()*/
package Ten;
public class ReturnAnonymous {//contents()是返回值为接口Contents类型的方法public Contents contents(){return new Contents(){private int i = 11;public int value(){return i;}};匿名内部类的;不是标记此内部类的结束,标记的是表达式的结束,只不过此表达式包含了匿名内部类。}public static void main(String[] args){ReturnAnonymous re = new ReturnAnonymous();Contents c = re.contents();}
}

用匿名内部类实现工厂方法

package Ten;//用匿名内部类实现工厂方法丢硬币interface Toss{boolean b();
}
interface TossFactory{Toss getToss();
}
class Coin implements Toss{int EVENT = 2;private  int events = 1;boolean b1;public boolean b() {// TODO Auto-generated method stubSystem.out.println("Coin event :"+ events);return (events++ != EVENT);}//匿名内部类 public static TossFactory factoy = new TossFactory(){public Toss getToss() {// TODO Auto-generated method stubreturn new Coin();}};
}
public class FactoryCoin {public static void play(){Coin c = new Coin();while(c.b());}public static void main(String[] args){FactoryCoin fc = new FactoryCoin();fc.play();}
}

嵌套类

类中包含类...

package Ten;
public class QianTao {private static class QianTao1{private int i ;public int value(int i){this.i = i;QianTao1 q1 = new QianTao1();System.out.println(q1.getClass() +" value: "+ i);return i;}//内部类中又包括内部类private class QianTao2{private int i ;public int value(int i){this.i = i;QianTao2 q2 = new QianTao2();System.out.println(q2.getClass() + " value: "+ i);return i;}}}public static void main(String[] args){QianTao1 q1 = new QianTao1();q1.value(1);//QianTao2对外部方法不能直接AccessQianTao1.QianTao2 q2 = q1.new QianTao2();q1.value(2);}
}/*
class Ten.QianTao$QianTao1 value: 1
class Ten.QianTao$QianTao1 value: 2*/

exercise19

创建一个包含内部类的类,而此内部类中又包含内部类,编译器生成了每一个类的.class文件

 package Ten;
public class NestClass {class Inner1{class Inner2{void f(){}}Inner2 makeInner2(){return new Inner2();}}Inner1 makeInner1(){return new Inner1();}static class Nested1{void f(){}static class Nested2{void f(){}}}public static void main(String[] args){new NestClass.Nested1().f();new NestClass.Nested1.Nested2().f();NestClass n = new NestClass();NestClass.Inner1 n1 = n.makeInner1();NestClass.Inner1.Inner2 n2 = n1.makeInner2();n2.f();}}/*不是输出
生成的.class文件
NestClass.class
NestClass$Inner1.class
NestClass$Inner1$Inner2.class
NestClass$Nested1.class
NestClass$Nested1$Nested2.class
*/

包含内部类的接口

 package Ten;//创建包含嵌套类的接口public interface InterfaceQian {public void f();public static class A implements InterfaceQian{public void f() {// TODO Auto-generated method stubSystem.out.println("A f()");}public static void main(String[] args){A a = new A();a.f();}}
}/*A f()*/

由实现接口的类间接返回接口

package Ten;
interface interf{void f();
}
class A{public interf get(){class Inf implements interf{public void f() {// TODO Auto-generated method stubSystem.out.println("Inf.f()");}}return new Inf();}
}
public class InterfaceInner {public static void main(String[] args){A a = new A();interf intf = a.get();//由实现接口的类间接返回接口intf.f();}
}

转载于:https://my.oschina.net/doudoulee/blog/656233

《Thinking in Java》Ten 内部类相关推荐

  1. 反射-获取java私有内部类反射类型、私有字段

    获取JAVA私有内部类反射类型 方式一 Class.forName("外部类完整路径$内部私有类类名"); 方式二 通过获取对应私有内部类的字段而获取 完整的类名 Class.fo ...

  2. java使用内部类的好处及其初始化

    java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 java内部类初始化 ForeCatalog foreCa ...

  3. java继承a mya new c,“内部类” 大总结(Java),内部类总结java

    "内部类" 大总结(Java),内部类总结java (本文整理自很久以前收集的资料(我只是做了排版修改),作者小明,链接地址没有找到,总之感谢,小明) 内部类的位置: 内部类可以作 ...

  4. java 函数内部类_java 内部类详解 转

    classOuter {classInner { } } (二) 内部类的访问规则 ​ A:可以直接访问外部类的成员,包括私有 ​ B:外部类要想访问内部类成员,必须创建对象 (三) 内部类的分类 ​ ...

  5. java json 内部类_使用Fastjson解析内部类的一个小问题

    使用的Fastjson的版本是1.2.7和1.2.47两个版本. 1. 问题 使用Fastjson解析包含内部类的对象时,发生异常,代码大致如下: public class HelloControll ...

  6. java的内部类和匿名类剖析

    Java 1.1通过对Java语言规范进行修改,显着简化了一些实用结构的实现.在那些修改中,最引人注目的就是内部类和匿名类.如运用得当,它们可使程序更易理解和维护.本文介绍内部类和匿名类在Java代码 ...

  7. java 内部类 加载_举例讲解Java的内部类与类的加载器

    内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加 ...

  8. Java使用内部类的意义

    Java中的内部类感觉很奇怪,一个类中还要再嵌套一个类.为什么要这样做呢? 内部类提供了一个类中实现同一接口的多次机会. 一般情况下,在一个普通类中,是没有办法将一个方法写两遍,还能表达不同意思的,而 ...

  9. java(13)内部类

    内部类就是定义在类内部的类,可以使java具备为普通类实现多重继承的能力. 非静态内部类,局部内部类,静态内部类,匿名内部类 非静态内部类: package 内部类;class Wai5 {int i ...

最新文章

  1. 5G NR — 基于 GPS 的时间同步
  2. golang 追加内容到文件
  3. spring 读取配置文件的优先级
  4. Linux的awk命令使用心得
  5. windows下git命令的使用
  6. 【渝粤教育】国家开放大学2018年春季 0703-21T经济学基础 参考试题
  7. 【Android Developers Training】 58. 缓存位图
  8. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
  9. 计算机竞赛湖北有哪些,我校29名学生在全国大学生数学竞赛湖北赛区获奖
  10. 雷凌linux车机升级_绿老师学堂:15万合资车谁更“聪明”?体验思域/福克斯/雷凌车机...
  11. Python 30 年技术演进史:生于小众,崛起 AI!
  12. Entity Framework 5.0系列之Code First数据库迁移
  13. 关键字 : this /self / parent
  14. linux下实现getch()函数的功能,linux下有没有和windows下的getch函数功能基本一样的函数?...
  15. ​Flink 流处理在中信建投证券的实践与应用
  16. 可以免费自学编程的12个网站
  17. Ring Buffer 原理
  18. [转贴]色彩调和的原理
  19. 2018web前端不好找工作之web前端面试简历补救篇
  20. Simulink模型如何做单元测试

热门文章

  1. python网站开发实例 flask_python-flask框架web服务接口开发实例
  2. linux与Windows查看路由
  3. rem适配的浏览器_[史上最全]UI相关尺寸单位详解 | px、pt、dp、sp、rem、vwvh、rpx、ppi、dpi、dppx...
  4. dto 是只给前端需要的数据吗_解决消息队列的数据积压很难?其实只需要这三招...
  5. php错误日志和php-frm错误日志,错误amp;日志
  6. mysql在windows启动_MySQL笔记:mySQL在windows环境启动
  7. 人工神经网络理论、设计及应用_红层软岩大直径素混凝土置换桩复合地基设计理论及应用研究——以成都 ICON云端项目为例...
  8. 浙江大学-包家立计算生物学1
  9. 细胞亚器文献阅读之酵母液泡与线粒体的动态互作A Dynamic Interface between Vacuoles and Mitochondria in Yeast
  10. 系统学习机器学习之特征工程(二)--离散型特征编码方式:LabelEncoder、one-hot与哑变量*