您的位置:程序门 -> java -> 非技术区



父类(超类)和子类的疑惑


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


父类(超类)和子类的疑惑[已结贴,结贴人:c_rockey]
发表于:2007-06-21 17:54:43 楼主
如果在父类的内部使用子类的实例会有什么后果呢?!
又或者反过来,在子类的内部使用父类的实例又会有什么影响呢!?
如:
class   superclass{
          private   subclass   instance   =   new   subclass();
          ........
}
class   subclass   extends   superclass   {
        private   superclass   instance   =   new   superclass();
        .........
}
偶尔想到这个问题,不知道这样在逻辑上会是什么后果!?
发表于:2007-06-21 19:42:261楼 得分:1
你在父类里定义了private   类型,不可以那么用吧
发表于:2007-06-21 20:02:422楼 得分:1
子类不继承父类的private类型.也没去调用他所以没什么关系吧.
发表于:2007-06-21 21:36:223楼 得分:2
应该会堆栈溢出
发表于:2007-06-22 11:07:584楼 得分:5
1).派生类中
class   superclass{
    int   j   =   0;           //1.1     3.1
    superclass(){};//2.1     3.2
}

class   subclass   extends   superclass{
    int   i   =   0;           //1.2
    subclass(){};     //2.2
    superclass   sc   =   new   superclass();   //3.3
}
...
new   subclass();   //     ===> 1.1-> 1.2-> 2.1-> 2.2-> 3.1-> 3.2-> 3.3

2).基类中
class   superclass{
    int   j   =   0;          
    superclass(){};
    subclass   sc   =   new   subclass();     //1.1   stackoverflowerror   1.1-> 1.2-> 1.1-> 1.2-> 1.1....
}                                                                 //此例初始化第2阶段

class   subclass   extends   superclass{
    int   i   =   0;          
    subclass(){};     /1.2
   
}

不知道理解对否
发表于:2007-06-22 11:23:035楼 得分:10
首先子类的内部可以使用父类的实例,但是父类的内部使用子类的实例会有些限制,搂主所写的子类的实例初始化发生在父类实例构造过程中,所以会发生递归调用的情形,如果将子类的实例化过程不要放到父类的构造过程中,应当是可以的。
发表于:2007-06-22 11:24:176楼 得分:1
> > > 应该会堆栈溢出
同意
发表于:2007-06-22 11:53:597楼 得分:0
楼上的理解的很透啊!
在子类中使用父类的实例必须在子类完成实例化之后.同样父类中使用子类的实例必须在父类完成实例化之后.否则都会导致堆栈溢出.
下面代码会导致堆栈溢出:
public   class   superandsub   {
public   static   void   main(string[]   args)   {
sub1class   subi   =   new   sub1class();
super1class   superi   =   new   super1class();
}
}
class   super1class   {
private   sub1class   sub   =   new   sub1class();
public   super1class(){
system.out.println( "superclass ");
}
}
class   sub1class   extends   super1class{
private   super1class   sup   =   new   super1class();
public   sub1class(){
system.out.println( "subclass ");
}
}
下面的代码不会导致堆栈溢出:
public   class   supertestclass   {
public   supertestclass(){
system.out.println( "superclass ");
}
public   static   void   main(string[]   args)   {
new   subtestclass();
}
}
//****************subtestclass********************//
public   class   subtestclass   extends   supertestclass{
public   subtestclass(){
system.out.println( "subclass ");
}
public   static   void   main(string[]   args)   {
new   supertestclass();
}
}
发表于:2007-06-22 11:59:238楼 得分:0
huoyin(多情剑客)  
如果将子类的实例化过程不要放到父类的构造过程中,应当是可以的。

----------------------------------
何解?
子类constructor一定会调用父类的constructor。然而   调用之前在父类中的
subclass   sc   =   new   subclass();
会被首先初始化,在初始化第2步中(本例),造成无限递归。

请教剑客你的那话何解


快速检索

最新资讯
热门点击