Corsair

My javaWorld
数据加载中……

2007年1月14日

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 银河海盗 阅读(310) | 评论 (1)编辑 收藏
解决linux环境下jsp+mysql数据库中文乱码的问题

经过一个星期的艰苦奋斗终于解决了这个问题,特将经验摘录下来备忘。本文将解决以下的几种乱码问题。

中文存入 mysql 数据表出现的乱码,从 JSP 页面读取 mysql 中文数据出现乱码,以及在 sell 环境下查看数据库表中文数据出现乱码。

linux平台:ubuntu6.10

mysql版本:5.0

浏览器:firefox2.0

为了解决中文乱码的问题首先就是要同一字符集,我采用utf-8

第一步:安装mysql后,修改配置文件/etc/mysql/my.cnf 找到相应项并添加如下字段,如下所示:(注意是添加,配置文件中其他不相关的内容下面并没有列出来)

[client]

default-character-set=utf8

[mysqld_safe]

default-character-set=utf8

[mysqld]

default-character-set=utf8

[mysql]

default-character-set=utf8

重新启动mysql服务,进入sell终端,进入mysql的命令提示符下输入如下指令:

mysql>show variables like '%char%';

如果出现的列表各项内容和以下相同表明配置成功了,

+---------------------+---------------------

| Variable_name | Value

+-----------------------+---------------------

| character_set_client | utf8

| character_set_connection | utf8

| character_set_database | utf8

| character_set_filesystem | binary

| character_set_results | utf8

| character_set_server | utf8

| character_set_system | utf8

| character_sets_dir | /usr/share/mysql/charsets/

+---------------------+----------------------

第二步:在要发送中文或者要读取中文的JSP页面(最好所有页面)都添加如下声明:

<%@page pageEncoding="UTF-8"%>

<%@ page contentType="text/html;charset=utf-8"%>

<% request.setCharacterEncoding("utf-8"); %>

<head>标签对中添加如下:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

注意在servlet中对请求进行响应的方法中同样要有:

response.setContentType("text/html;charset=utf-8");


第三步:(由于不明原因firefox发送的请求仍然是latin1的时候执行这一步)

在将请求的参数插入数据库之前还要再执行一次转码(latin1编码转换为utf-8),例如:

String utf8_str = new String( latin_str .getBytes("latin1"),"utf-8");

这一步可以写在一个过滤器中,不怕麻烦也可以在每一次在将请求数据插入之前都进行一次转码。


另外:在连接数据库的时候可以不用加上字符集参数了,直接用用户名和密码连接就可以了,如连接:

con=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名","用户名","密码");

posted @ 2007-01-14 20:04 银河海盗 阅读(2042) | 评论 (0)编辑 收藏
设计模式学习笔记(2006.10,11,12)

     摘要: 时间过的快么?人的感觉而已,时间还是那样地流过,但人们却有不同的感受,收获的越多,感觉时间过的越慢,认知的越少,时间也就过的越快。有三个月没写点什么东西了,为了让时间记住这三个月都发生了什么,趁现在还没有忘记还是记录下来罢,今天心情不好所以废话也就多点。        按时间顺序一个一个来吧。 ...  阅读全文

posted @ 2007-01-14 03:19 银河海盗 阅读(304) | 评论 (0)编辑 收藏