站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题内部类的基础问题请教

内部类的基础问题请教

摘要: 内部类的基础问题请教


在继承一个内部类的时候,构造函数里调用的enclosingClassReference.super()是个什么东西?

当创建一个内部类的时候,内部类是在什么时候获得外部类的引用的?

非静态的内部类为什么不能有static的数据,字段和嵌套类?

内部类看的好晕,请高手来指点一下,谢谢拉:)


1.-#34;构造函数里调用的enclosingClassReference.super()是个什么东西?-#34;
我不知道
2.“当创建一个内部类的时候,内部类是在什么时候获得外部类的引用的?”
  静态的可以直接仿问
  不是的话,new 一个类,然后用这个去访问
  下面是给你的示例:
  class OutClass{
class InClass{
void toDisplay(){
System.out.println(-#34;this is a inside class-#34;);
}

}

}
public class OutClassTest{
public static void main(String[] args ){
OutClass ob=new OutClass();
//ob.InClass ob2=new ob.InClass();
OutClass.InClass ob2=ob.new InClass();
ob2.toDisplay();
}
}


3.“非静态的内部类为什么不能有static的数据,字段和嵌套类?”
  你看啊!JVM是这样运行的,静态类是最先进入堆栈的,而非静态的内部类还没有被实例化,也就是说没有给他空间。它没有空间就和前面的static数据相矛盾,逻辑上行不通。

4........
我不是高手,同学!加油!学java很有前途的,努力啊!(不好意思^_^)


第一个,比如:
public class InnerClass {

class Inner {
Inner() {
//say();
System.out.println(-#34;inner-#34;);
}
public Inner.IIner get(){
return new IIner();
}
public void say(){
System.out.println(-#34;innerClass-#39;s method-#34;);
}
class IIner {
IIner(){
say();
}
}
}
InnerClass(){
System.out.println(-#34;lv1-#34;);
}

public void say() {
System.out.println(-#34;OuterClass-#39;s method-#34;);
}

public Inner getInnerlv1(){
return new Inner();
}


public Inner.IIner getInner() {
return (new Inner()).new IIner();
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
InnerClass i = new InnerClass();
i.getInner();
}

}
然后我写个类继承Inner:
class TestIn extends InnerClass.Inner {
TestIn (InnerClass ic){
ic.super();
}

public void say(){
System.out.println(-#34;extends class-#39;s say()-#34;);
}
class IIner {
IIner(){
TestIn.this.say();
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
InnerClass j=new InnerClass();
InnerClass.Inner inner=j.getInnerlv1();
inner.get();
TestIn i = new TestIn(j);
i.get();
}
}
在他的构造函数里面调用了ic.super();我想问这个是什么东西,具体是做了些什么工作
第二个问题,我是想问内部类获得外部类引用的时候,是在哪个地方获得的,比如是在内部类的构造函数,还是在哪?
3.谢谢:))
再问一个:)
普通内部类的字段和方法是和外部类的字段和方法存在一个位子吗?因为我看thinking in java里面有这么一句,它说“普通内部类的字段和方法,只能放在类的外部层次”




TestIn (InnerClass ic){  //在这里构造函数的实参来自TestIn i = new TestIn(j);
ic.super();        //j 是调用InnerClass的构造函数InnerClass j=new InnerClass(); 
}           //ic的值是j(复制了它的引用),super是调用它父类的构造方法

第二个问题我还没明白意思!!!是指在另一个类调用这个类的时候?还是在创建它的时候给它传入的参数?
不好意思!给个例子啦!这样会看的明白的!!!

那个书我没看过,因为这个月没生活费买了!呵呵!
开玩笑的啊!
你看你发的那个示例里面Inner的里面不是有一人say()方法吗??






ic的值是j(复制了它的引用),super是调用它父类的构造方法:
那这样是调的object的构造函数?调这个有什么用啊?

第二个问题,创建内部类的时候不是会在这个内部类里面保存一个外部类的引用吧,用来访问外部类的元素,我就是想知道这个引用是在哪个地方付给内部类的。。。

第三个问题跟那个say函数没什么关系吧:)我写那个函数是想试试如果外部类函数和内部类函数相同有什么反应,呵呵
我是想问当创建内部类的实例的时候,内部类的这些字段和方法是存放在什么地方的呢,是在给外部类实例分配的那一块空间里面,还是一块新空间里面,只不过保存了一个外部类的实例呢?


比如说它的超类当中有一些方法你在子类中覆盖了该方法,那么你要调用是不是只有用super?
这样才能调用超类当中被你覆盖的方法。

内部类不可以直接访问外部类吧!你要是用的话就要把外部类的对象传进去。
下面是示例:
public class InnerClass {

class Inner {
Inner() {
//say();
System.out.println(-#34;inner-#34;);
}
public Inner.IIner get(){
return new IIner();
}
public void say(){
System.out.println(-#34;innerClass-#39;s method-#34;);
}
class IIner {
IIner(){
say();
}
}
}
InnerClass(){
System.out.println(-#34;lv1-#34;);
}

public void say() {
System.out.println(-#34;OuterClass-#39;s method-#34;);
}
public void xx(){
System.out.println(-#34;xx-#34;);//我在这里加了一个xx()方法,你看你在TestIn中的加inner.xx();能不能访问InnerClass中的这个xx()方法,编译器会说找不到方法
}
public Inner getInnerlv1(){
return new Inner();
}


public Inner.IIner getInner() {
return (new Inner()).new IIner();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
InnerClass i = new InnerClass();
i.getInner();
}
}
你如果要想在内部类中用的话就要把你的对象传给子类。


你说书上说“普通内部类的字段和方法,只能放在类的外部层次”
那个say()方法在内部写了一个,我运行了一下可以用调用啊!所以我想内部类的方法可以放在内部类里面啊!(不过不知道当你说的外部层次是什么意思,可能在那里我没有理解!)

我把你给你那些代码编译了一下,然后在目录下找到了这个TestIn$IIner.class  看来内部类被单独编译成了一个class文件.JVM在调用的时候就会把它放到一个单独的堆栈里面压着吧!!
不过TestIn$IIner.class中间有一个$就不知道JVM会不会在创建它的外部类的时候把它们放在同一块内存当中了。我想应该还是前一种可能大一些!
不好意思!没有搞好啊!!!汗!!



↑返回目录
前一篇: 杨辉三角编译通过但是!!
后一篇: 一个小问题,马上给分