java 关于内部类的一个例程

问题描述

publicclassMemberInnerClassTest{publicstaticvoidmain(String[]args){OuterHullouter=newOuterHull();OuterHull.InnerCoreinner=outer.newInnerCore();//OuterHull.InnerCoreinner1=newouter.InnerCore();//OuterHull.InnerCoreinner1=newInnerCore();System.out.println("OuterHull="+outer.ship);System.out.println("InnerCore="+inner.ship);inner.communicate();}}classOuterHull{Stringship="U.S.S.Enterprising";classInnerCore{Stringship="ShuttleCraft";voidcommunicate(){System.out.println("OuterHull="+(OuterHull.this).ship);System.out.println("OuterHull="+OuterHull.this.ship);//System.out.println("OuterHull="+OuterHull.ship);System.out.println("InnerCore="+this.ship);}}}下面这二个语句中的this应该如何去理解?System.out.println("OuterHull="+OuterHull.this.ship);System.out.println("InnerCore="+this.ship);还有为什么被行注释的语句会提示“在静态域无法使用非静态域OutHull.ship”编译?

解决方案

解决方案二:
输出结果为:OuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraftOuterHull=U.S.S.EnterprisingOuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraft
解决方案三:
classInnerCore是个成员内部类,就相当于OuterHull的一个成员,它看不到OuterHull,所以不能通过OuterHull直接访问ship,只能OuterHull.this.ship访问外部类的变量,这是规定。System.out.println("InnerCore="+this.ship);没什么好解释的,当前对象的ship就是InnerCore的ship
解决方案四:
同名变量ship盖住了。需要明确的说它在哪里,否则认为你想用inner.ship呢。需要Outer.this是因为外面的类和它内部的一个非static类直接在编译时会自动插入一个隐藏的成员指向另一个类的对象实例。你用一个反编译工具打开生成的.class文件看一下,内部类能直接访问它外面的类的任何成员,私有的都可以,反过来外部的类也可以访问内部的,但这不像继承关系那样是自成一体的(继承关系的两个类实际上只有一个对象实例存在),外部类和内部是两个对象实例,各自持有自己的状态,需要一个引用去连接两个实例以达到互访的关系,JVM会自动地允许它们互相访问彼此的所有定义的成员。
解决方案五:
输出结果:OuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraftOuterHull=U.S.S.EnterprisingOuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraft由于内部类是外部类的一部分,当外部类使用内部类的时候需要创建内部类的一个对象就可以了;由于内部类是一个非静态的类里面是一个非静态的方法所以在内部类的方法中使用访问父类的字段和方法时就需父类的一个实例OuterHull.this;所以是OuterHull.this.ship;System.out.println("InnerCore="+this.ship);//本句中的this就是内部类的一个实例了
解决方案六:
果断mark内部类不好理解回去慢慢看看
解决方案七:
个人感觉内部类还是匿名内部类用的相对最多,在开发中,其他的内部类用的很少
解决方案八:
System.out.println("OuterHull="+OuterHull.this.ship);System.out.println("InnerCore="+this.ship);this指向的是内部对像的一个引用

时间: 2024-04-17 13:52:22

java 关于内部类的一个例程的相关文章

图片-java中定义了一个静态内部类,在主函数中访问此内部类中静态函数时只能通过建立对象调用而不是类名调用

问题描述 java中定义了一个静态内部类,在主函数中访问此内部类中静态函数时只能通过建立对象调用而不是类名调用 图片简略,图片的说明解释了图片大意定义的外部类 外部类中的内部类,包括的静态函数 用类名调用方式调用内部类中静态函数 报错提示如图 用调用非静态函数方法尝试 编译运行成功 如图,为什么定义了一个静态内部类,在主函数中访问此内部类中静态函数时只能通过建立对象调用而不是类名调用,谁能帮忙解答疑惑? 解决方案 你的静态内部类是定义在外部类中的,它可以理解为寄生物,它的宿主是外部类,虽然静态类

java算法-java用内部类实现个山寨list(不许使用数组和集合)

问题描述 java用内部类实现个山寨list(不许使用数组和集合) java如何使用内部类来实现一个山寨的list,不允许使用数组和集合相关技术,只需实现list的add,size,get方法即可~~ 求大神指点下~~ 问题已解决~~~~~ 下面公布代码: 使用内部类实现的 在发布一种非内部类实现的 解决方案 不用数组和集合,可以用string String data = ""; void add(int value) { if (data.equals(""))

java语法-java中内部类的作用是神马

问题描述 java中内部类的作用是神马 java中内部类的作用是神马 java中内部类的作用是神马 java中内部类的作用是神马 解决方案 Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类,内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点. 内部类需要有外部类对象作为宿主的,它只能依存外部类而存在. 解决方案二: java中内部类的作用是神马不知道啊

JAVA中内部类的特点?

问题描述 JAVA中内部类的特点具体有些什么大侠们能不能写点具体的代码体现下呀 解决方案 解决方案二:这个不是一句话说的清的,建议看看<Java编程思想>,里面有很详尽的见解解决方案三:内部类一情况下都很少用,只是用于一些特殊功能上.有兴趣研究可以查阅相关书籍!解决方案四:谢谢诶小弟初学解决方案五:如果一个类得在逻辑上比较简单才考虑使用内部类,不然很少用,可以写成内部类的当然也能写成外部类,所以理解不了也没多大关系解决方案六:我在看<编程思想>,第十章的内部类是个重点呢,知识点很多

举例讲解Java的内部类与类的加载器_java

内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加载后,Inner1没有加载,所以这个 静态变量j 无法立即使用,报错 final int z = 0; /*static void say1() { }*/ void say2() { } } //Inner2 在A加载好后就可以使用了 static class Inner2 { int k = 0

如何在java中实现读取一个txt文档中的随机一行

问题描述 如何在java中实现读取一个txt文档中的随机一行 如题,如何在java中实现读取一个txt文档中的随机一行? 主要就是怎么随机读取 解决方案 根据楼上的说法,来总结一下吧,总体来说,就是将文件全部都读取出来,每一行存储到一个数组或集合中,然后再通过产生随机数,来对这个数组或是 集合进行随机的访问.这样一来就解决了 解决方案二: 文本文件只能顺序读,不能随机读.你的需求只能是读取文本文件每一行到一个arraylist,然后得到下标范围,产生一个随机数,取那一行 解决方案三: http:

java 用windowbuilder写一个电影院的选座售票系统

问题描述 java 用windowbuilder写一个电影院的选座售票系统 java 用windowbuilder写一个电影院的选座售票系统请问下有什么做的思路?座位用按钮表示吗?还是用其他方法表示? 解决方案 http://download.csdn.net/detail/u013129990/6705317 解决方案二: 座位可以用一组checkbox表示,在后台接收对应的id就是相应的座位,这样比按钮省事多了 解决方案三: 设计窗体,在窗体里面添加控件,座位的选择可以是按钮,也可以是其他的

重写-关于java中compare的一个问题

问题描述 关于java中compare的一个问题 我在看视频,这边重写了compare接口,compare接口里的方法既然都是抽象的,那 compareto 在这里不是毛用都没.... 解决方案 可能java的字符串类型默认实现了compareTo方法,就像equal一样. 解决方案二: 一个是实现接口 Comparable的compareTo()方法:一个是String类中compareTo()方法....肯定不一样啊 建议看api文档 解决方案三: 你重写的的是接口Comparable中的c

jsp 网站开发-JAVA WEB应用,一个操作只能同时有一个用户操作

问题描述 JAVA WEB应用,一个操作只能同时有一个用户操作 一个B/S系统,其中有个调用Linux脚本的操作,执行时间较长,要求系统只能同时有一个用户执行此操作,否则提示其他用户正在执行,请问下该如何实现呢? 解决方案 在該腳本開頭添加"ps -ef | grep 'yourshell'",返回監測結果,看是繼續執行,或是退出交回到java 解决方案二: 这个可以当启动linux脚本时写一个标识位到一个文件内.当其它用户再启动linux脚本时检测这个文件.是否存在即可. 解决方案三