Corsair

My javaWorld
数据加载中……

2007年3月31日

JAVA3D包功能介绍

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

posted @ 2007-04-15 11:06 银河海盗 阅读(1759) | 评论 (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 银河海盗 阅读(760) | 评论 (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 银河海盗 阅读(486) | 评论 (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 银河海盗 阅读(371) | 评论 (1) | 编辑 收藏