Corsair

My javaWorld
数据加载中……

2007年3月31日

JAVA3D包功能介绍

     摘要: 包 简介          ...  阅读全文

posted @ 2007-04-15 11:06 银河海盗 阅读(1692) | 评论 (3)编辑 收藏
向上转型中子类将能看到父类被覆盖字段的现象探讨

我们知道,在子类继承父类之后,如果子类与父类有同名的字段和方法,那么子类中的子段会代替或隐藏父类的子段,说明子类字段覆盖了超类字段,但可以通过super关键字去访问超类字段。但是,在我们将子类对象向超类转型的时候就会发生这个奇怪的现象,子类对象居然可以看到父类曾经被覆盖掉的字段!就正如下面例子中一样:

 1 class A{
 2     boolean bb =false;
 3 }
 4 
 5 public class B extends A{
 6     boolean bb = true;
 7     //int a=1;
 8     public static void main(String[] args) {
 9         B b =new B();
10         A a ;
11         a= b;
12         //---??
13         System.out.println(a.bb);
14         //---这句可以理解
15         System.out.println(b.bb);
16         //---??
17         System.out.println( ((A)b).bb);
18         //----
19     }
20     /*运行结果
21      * false
22      * true
23      * false
24      * */
25 }

为什么会发生这样的情况呢?
关于这种情况的解释在[美]Peter van der Linden著的《Just Java2》中有了答案:
P106他说:
   一定要注意:当把子类转换成超类时,子类可以见到或访问被隐藏的同名变量。Java允许名字重复的原因是,允许将来把新的字段加到超类中,而不影响已经使用了该名字的现有子类,子类将会继续使用自己的字段副本。除非让子类以超类对象的形式出现,方法可以覆盖,但是字段不能被覆盖。注意:最好不要隐藏超类中的字段名。
     
所以我们在进行向上转型的时候一定要注意:不要访问子类中那些“覆盖”掉父类的字段(它并没有真正覆盖掉,在向上转型的时候就可以访问的到),要么将子类字段改名(在你知道父类代码的情况下),要么通过方法来访问字类字段(方法即使同名也肯定能覆盖掉)。

posted @ 2007-03-31 11:31 银河海盗 阅读(696) | 评论 (2)编辑 收藏
继承带参数构造器的超类并且调用自身其他构造器的讨论

// 首先有一个带参数的超类: 
class  SuperClass
   String str
= " create superClass obj "
   SuperClass(
int  num)
       System.out.println(num
+ str); 
   }
 
}
 
/*
现在有一个子类继承了这个超类,那么这个子类应该显式的调用超类的构造函数,以便初始化自己的父类,如下。 
*/

class  SubClass  extends  SuperClass
   SubClass(
int  num)
      
super (num); 
   }
 
}
 
/*
现在子类还要定义一个新的构造函数,并且在前一个构造函数中调用这个新的构造函数,更改如下: 
*/

class  SubClass  extends  SuperClass
   SubClass(
int  num)
      
super (num); 
      
this ( " other SubClass(String) " ); 
   }
 
   SubClass(String s)

      System.out.println(s); 
   }
 
   
public   static   void  main(String[] args)
      
new  SubClass(); 
   }
 
}
 
/*
由于我们知道在一个类中的构造函数中要调用自己的其他构造函数,只能通过this();的方式调用一个,并且要放在所在构造函数的第一行,但是使用super();显式调用也父类带参构造函数也只能放在第一行,那么这样就会发生冲突。
*/
// 参考: 
public   class  SuperClass 
String str
= " create superClass obj " ;  
 SuperClass(
int  num) {  
       System.out.println(num
+ str);  
   }
  
}
 
public   class  SubClass  extends  SuperClass 
   SubClass(
int  num) {  
      
super (num);  
      sub(num,
" other Subclass(String) " ); 
   }
  
   SubClass(
int  num,String s) {  
      
super (num); 
  System.out.println(s);  
   }
 
   
// ------------- 
   SubClass sub( int  num,String s)
   
return   new  SubClass(num,s); 
   }
 
   
public   static   void  main(String[] args) {  
      
new  SubClass( 1 ); 
   }
  
}

posted @ 2007-03-31 10:56 银河海盗 阅读(441) | 评论 (0)编辑 收藏
关于名称屏蔽讨论

关于超类方法重载,子类无法覆盖其中的任意一个方法。

public class SuperClass 
public void method()
System.out.println(
"super method() worked."); 
}
 
public void method(int a)
System.out.println(
"super method(int) worked"); 
}
 
public void method(String s)
System.out.println(
"super method(string) worked"); 
}
 
}
 
//------------sub--------------- 
public class SubClass extends SuperClass 
  
public void method()
  System.out.println(
"subclass method() worked"); 
  }
 
  
public void method(int a)
  
super.method(a); 
  }
 
  
public void method(char c)
  System.out.println(
"subclass method(char) worked"); 
  }
 
}
 
//------------run--------------- 
public class Test 
public static void run(SuperClass a)
a.method(); 
a.method(
1); 
a.method(
"string"); 
}
 
public static void main(String[] args) 
run(
new SubClass()); 
new SubClass().method('r'); 
}
 
}
 
//=============END=============== 
subclass method() worked 
super method(int) worked 
super method(string) worked 
subclass method(
char) worked 
//=============END=============== 

posted @ 2007-03-31 10:53 银河海盗 阅读(308) | 评论 (1)编辑 收藏