(L)China TenLen...'s profileWelcOme to mySpacePhotosBlogLists Tools Help

(L)China TenLens

Occupation
Location
Interests
A man

WelcOme to mySpace

<Darkness.ANgeL> Herkey
November 09

想像考拉

不是想像考拉什么样子,我还能没看见过考拉?(电视里面见过&^^)是想像考拉一样.看明白没?再不明白拉你去填海!啊``豁咳连天```````一天能睡上19h就爽了!前提是能保证足够的收入,嘿嘿``有点贪心了!
一直纳闷``那小子怎么能在那万万行字(English)里面发现那行中文```而且发表了一番感言```没想通```估计丫是用了某种先进的过滤设备```只看看得懂的``不看看不懂的```
写不完了,写不完了,想睡觉了,书上好多不懂的,不知道怎么办了,明天继续,争取搞懂80~90%.
睡了.
````````````````````````````````````2006-11-09    00:16 (据说"-"这种表示方法是中国人表示时间的方法,rb人是用"/"隔开年月日,从此b4这种表示方法,b4到底.)
November 08

JAVA学习笔记-----面向对象程序设计

1.定义成员方法时可以使用下面的指南:
    1).该方法能实现类的行为吗?
    2).该方法在其他情况下能适应吗?
    3).该方法在大多数情况下都能很方便地使用吗?
    4).该方法在某些特殊方面会受到限制吗?
    5).输入、输出参数名有清楚地含义吗?
    6).该方法名称能充分反映它的功能吗?
  2.一般情况下,将定义成员变量,成员方法的类和调用成员变量,成员方法的类分开。
  3.垃圾回收机制可以通过调用方法System.gc()实现。也可以设置一个变量为null,该变量将标记为要回收的资源。
 

3.2 类的访问与封装
  1.通过将一个类的对象作为另一个类的成员变量可以间接地实现本类中没有的方法。
  2.类的成员访问权限需要遵循一些限制:
     1).一个对象所有的成员变量如有可能应当是私有的,至少应是保护类型的。
     2).如果一个成员方法可能使对象失效或不被其他的类使用,它应当是私有的。
     3).如果一个成员方法不会产生任何不希望的后果,它才可以被声明为公有的。
     4).一各类至少有一个公有、保护和默认的成员方法。
     5).类和构造方法至少应是公有的或默认的。
  3.定义成员变量为私有常有可能太严格而导致类崩溃,因而定义成保护类型会更有价值。
  4.一个类可以通过调用另一个类的公有方法来访问这个类的私有成员变量。
  5.如果一个公有方法变为私有的,所有调用它的类都要进行修改,因此在声明公有方法时要小心,只有几乎不再改变的方法才应该声明为公有的。
  6.修改公有方法时应只改变其实现,而不要改变方法的首部,只要修改后的方法的效果一样,就不会影响到其他类。无论怎样改变私有方法都不会造成类之间的冲突。
  7. 如果要隐藏方法实现的细节,可以将实现该细节的方法设为私有的。再通过一个公有方法来调用该私有方法,从而达到隐藏方法中细节实现的目的。
  8.使用static修饰的成员变量可供同一个类的所有对象实例共享使用,而使用static修饰的成员方法的动作仅与输入参数和用static修饰的成员变量有关。也就是说静态成员方法只能用静态成员变量、输入的参数以及其他静态成员方法。
  9. 如果要在静态方法中使用非静态成员变量,则该静态成员方法必须要有一个输入参数,且该输入参数必须是包含有该非静态成员变量的对象。
  10.不管多少对象被实例化,一个静态成员变量仅存在一个版本。如果一个对象修改了该变量,则其他使用该变量的对象也将受到影响。如果构造方法中含有静态成员变量,则在其它方法中对静态成员变量的修改,将直接影响到后面其它该类对象在初始化时静态成员变量的值。
  11.运行过程中仅依赖于输入参数的方法应标记为静态成员方法。静态成员变量通常用于定义常数。
    

3.3 重载
  1 .对于方法执行的动作相同,但参数的数目和类型不同的方法,可以采用方法的重载。让返回值的类型为void.
  2.重载方法必须有相同的方法名称和相同的返回类型。不能创建返回类型不一样的重载方法。如果返回类型不一样,就只能用不同的方法名称。
  3.重载方法与参数名称无关,只与参数的类型、数目有关。当参数的类型与数目相同时,即使参数名称不同,系统也认为是同一方法,不能通过编译。
    
4.当重载一个方法时,首先要提供一个尽可能普通的版本,其他版本可以使用像:this(参数)这样的格式来调用该版本的构造方法,取代缺省的参数,如果在其他构造方法中调用普通的构造方法,必须作为这个方法的第一条语句。如:
  public Student() {this (“null”,0);}
  public Student(String _name) {this(_name,0);}
  public Student(int _age) {this(“null”,_age);}
  public Student(String _name,int _age) {name=_name; age=_age;}
  在本例中,前三个构造方法都采用了:this(参数)的调用方法,调用了最后一个带有_name和_age参数的构造方法来初始化对象,对于姓名缺省的构造方法,则用null代替,对于年龄缺省的构造方法,则用0代替。对于姓名和年龄都缺省的构造方法,则用null和0代替。
 
3.4 继承
    1. 子类所需的成员在父类中必须是非私有的,因为无法继承私有成员,另一个解决方法是在父类中使用公有set/get方法访问其私有成员变量。
    2. 当我们创建一个类层次的时候,应当线抽象出父类,再通过父类衍生出子类。
    3. 当子类被调用的时候,隐含地调用父类地构造方法,此时没有为构造方法输入任何参数,除非在子类地第一行明确地调用父类的构造方法,如果父类没有无参数的构造方法,子类又没有明确的调用父类的构造方法,编译器将无法编译子类。
    4. 避免隐蔽地调用父类的构造方法,可使用两种解决方法:
        1).每个子类都应当明确的调用超类的一个构造方法,而且必须在第一行。
        2).为每个可能成为父类的类提供一个无参数的构造方法,如果还有其他需要则重载构造方法。
    5. super的作用:
        1).调用父类的构造方法:super(参数/null);
        2).调用父类的成员方法:super.classMethord(参数/null);
        3).调用父类的成员变量:super.classField;
    6. 如果在子类中重新定义了一个与它的父类完全相同的一个方法,子类的方法将覆盖父类中的同名方法,此时父类中该方法仍会在父类中使用,但要加上关键字super和圆点操作符。同理成员变量。
    7. 如果继承与被继承的方法的参数类型、数目相同,即使参数的名称不同,系统也认为是同一方法,不能通过编译。
    8. 如果重定义的方法的参数列表与父类中该方法的列表不一致,那么应该在父类中重载而不是在子类中覆盖。
    9. 尽量避免覆盖成员变量,它会使到代码难以理解,如果有很多变量都需要覆盖,则意味着不应该从该父类中扩展出该子类。
    10. 父类中应该尽量包含所有子类的公有属性和方法。对于特殊的属性和方法则在子类中去实现。
    11. 如果类B继承了类A,那么类B就是类A,所以可以用类A的构造方法来初始化子类的一个对象,然后在子类B的构造方法中再修改具体的成员变量的值。
    12.重载与覆盖的区别:
                             重载                继承
    类的层次    针对同一个类中的同名方法而言    针对父类与子类中的同名方法而言
    方法名称    各重载方法的名称必须完全相同    被继承与继承的方法名称必须完全相同
    返回类型    各重载方法的返回值的类型必须完全相同    被继承与继承的方法的返回值的类型必须完全相同
    参数类型    各重载方法的参数类型可以不同    被继承与继承方法的参数类型必须完全相同
    参数数目    各重载方法的参数数目可以不同    被继承与继承的方法的参数数目必须完全相同
 
    13. 当一个抽象方法被添加到一个类以后,该类也必须声明为抽象类。
    14. 在抽象类中声明抽象方法可以迫使子类实现继承而来的抽象方法。声明一改方方为抽象方法时,无需实现该方法,但要确保它的所有子类实现该方法。
    15. 如果多个类都具有相同的属性,可以放在其抽象父类中让其子类去继承,如果多个类都具有相同目的,但不同实现细节的方法,可以放在其抽象父类中并将其定义为抽象方法,让其子类去继承实现。
    16. 创建一个程序类时应该注意以下事项:
         1). 把一个现实世界的实体当作一个类来处理,每个待处理的实体都作为单独一个类。
         2). 对于每个实体,使用”is a”,”has a”,”does a”来描述这个类的名称属性,成员变量,成员方法以及它们的关系。
         3). 确保每个类尽可能地小,而且方法尽可能地简单。
         4). 通过已有地类,用继承、重载、覆盖减少代码重复。
         5). 包含main方法地类作为主类,但实际大多数工作应该是其他的类来完成。
    17. 最常使用final限定词的情况是常数,因为static使得该变量只存在一个拷贝,final使得它不能改变。用户可以用这些变量名代替具体数值。
    18. 每个Java类隐含地扩展了Object类。System.out.println方法自动调用toString方法,将一个对象转换成为它的代表字符串,因此,我们在设计一个类地时候,都应该重载toString方法来进一步提供关于它的有用信息,然后,可以用System.out.print(ObjectName)来显示类的实例对象,此时对象将自动调用方法toString。
    19. 每个Java类都是由Object扩展而来的,因此,所有的类都属于Object类型,我们可以创建一个Object类型的数组来存储任何类型的对象。反过来,每个元素都可以在数组中检索到,在
         instanceof的帮助下能确定其原来的类型。如:
         Object object[ ]=new Object[4];
         object[0]=new Double(1.0);           object[1]=new Integer(2);
         object[2]=new String(“Hello world”);   object[3]=new Character(‘a’);
         System.out.println((object[0] instanceof Double)); //判断一个对象的类型
         System.out.println((object[1] instanceof Integer));
         System.out.println((object[2] instanceof String));
         System.out.println((object[3] instanceof Character));
 
    20. 如果定义了一个Object类型的数组,意味着它可以包含任何对象。要使用object数组中的实际对象类型,首先要把它们强制转换为实际类型。如果所使用的方法都是所有对象的通用方法,则不必将对象进行强制转换。
    21. 要在一个数组中存储相关对象,可以创建一个类作为这些类的父类,并且定义该数组为父类类型的数组。如果在父类中定义一个抽象的方法,所有扩展父类的类必须实现该方法,而且不必对对象进行强制转换就可以调用这些方法。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=706073

 

转自:http://blog.csdn.net/pengpenglin/archive/2006/05/02/706073.aspx

且得看啊

目录:
Q1.1 什么是Java、Java2、JDK?JDK后面的1.3、1.4版本号又是怎么回事?
Q1.2 什么是JRE/J2RE?
Q1.3 学习Java用什么工具比较好?
Q1.4  学习Java有哪些好的参考书?
Q1.5  Java和C++哪个更好?
Q1.6  什么是J2SE/J2EE/J2ME?
Q2.1  我写了第一个Java程序,应该如何编译/运行?
Q2.2  我照你说的做了,但是出现什么“'javac' 不是内部或外部命令,也不是可运行

程序或批处理文件。”。
Q2.3  环境变量怎么设置?
Q2.4  我在javac xxx.java的时候显示什么“unreported exception 
java.io.IOExcepti
on;”。
Q2.5  javac xxx.java顺利通过了,但是java xxx的时候显示什么
“NoClassDefFoundErr
or”。
Q2.6  我在java xxx的时候显示“Exception in thread "main" 
java.lang.NoSuchMetho
dError: main”。
Q2.7  在java xxx的时候显示“Exception in thread "main" 
java.lang.NullPointerEx
ception”。
Q2.8 package是什么意思?怎么用?
Q2.9 我没有声明任何package会怎么样?
Q2.10 在一个类中怎么使用其他类?
Q2.11 我用了package的时候显示"NoClassDefFoundError",但是我把所有package去掉

时候能正常运行。
Q2.12 我想把java编译成exe文件,该怎么做?
Q2.13 我在编译的时候遇到什么"deprecated API",是什么意思?
Q3.1 我怎么给java程序加启动参数,就像dir /p/w那样?
Q3.2 我怎么从键盘输入一个int/double/字符串?
Q3.3 我怎么输出一个int/double/字符串?
Q3.4 我发现有些书上直接用System.in输入,比你要简单得多。
Q3.5 我怎么从文件输入一个int/double/字符串?
Q3.6 我想读写文件的指定位置,该怎么办?
Q3.7 怎么判断要读的文件已经到了尽头?
Q4.1  java里面怎么定义宏?
Q4.2  java里面没法用const。
Q4.3  java里面也不能用goto。
Q4.4  java里面能不能重载操作符?
Q4.5  我new了一个对象,但是没法delete掉它。
Q4.6  我想知道为什么main方法必须被声明为public static?为什么在main方法中不能

用非static成员?
Q4.7  throw和throws有什么不同?
Q4.8  什么是异常?
Q4.9  final和finally有什么不同?
Q5.1  extends和implements有什么不同?
Q5.2  java怎么实现多继承?
Q5.3 abstract是什么?
Q5.4 public,protected,private有什么不同?
Q5.5 Override和Overload有什么不同?
Q5.6 我继承了一个方法,但现在我想调用在父类中定义的方法。
Q5.7 我想在子类的构造方法中调用父类的构造方法,该怎么办?
Q5.8 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。
Q5.9 我没有定义构造方法会怎么样?
Q5.10 我调用无参数的构造方法失败了。
Q5.11 我该怎么定义类似于C++中的析构方法(destructor)?
Q5.12 我想将一个父类对象转换成一个子类对象该怎么做?
Q5.13 其实我不确定a是不是B的实例,能不能分情况处理?
Q5.14 我在方法里修改了一个对象的值,但是退出方法后我发现这个对象的值没变!
Q6.1 java能动态分配数组吗?
Q6.2 我怎么知道数组的长度?
Q6.3 我还想让数组的长度能自动改变,能够增加/删除元素。
Q6.4 什么是链表?为什么要有ArrayList和LinkedList两种List?
Q6.5 我想用队列/栈。
Q6.6 我希望不要有重复的元素。
Q6.7 我想遍历集合/Map。
Q6.8 我还要能够排序。
Q6.9 但是我想给数组排序。
Q6.10 我想按不同方式排序。
Q6.11 Map有什么用?
Q6.12 set方法没问题,但是get方法返回的是Object。
Q6.13 ArrayList和Vector有什么不同?HashMap和Hashtable有什么不同?
Q6.14 我要获得一个随机数。
Q6.15 我比较两个String总是false,但是它们明明都是"abc" !
Q6.16 我想修改一个String但是在String类中没找到编辑方法。
Q6.17 我想处理日期/时间。

一、准备篇

Q1.1 什么是Java、Java2、JDK?JDK后面的1.3、1.4版本号又是怎么回事?
答:Java是一种通用的,并发的,强类型的,面向对象的编程语言(摘自Java规范第二

)。
JDK是Sun公司分发的免费Java开发工具包,正式名称为J2SDK(Java2 Software Develop 
K
it)。
包括基本的java工具包和标准类库。
到目前(2003年7月)为止,Java有3个主要版本,即1.0,1.1,2.0;
JDK有1.0,1.1,1.2,1.3,1.4五个版本。
从JDK1.2起,Sun公司觉得Java改变足够大而将java语言版本号提升为2.0。
不同的JDK主要在于提供的类库不同。作为学习你可以下载最新的JDK1.4.2。
真正开发时则应考虑向前兼容,比如1.3。下载请去http://java.sun.com
JDK1.5预计将在2004年推出,届时其中将包含若干崭新的特性。

Q1.2 什么是JRE/J2RE?
答:J2RE是Java2 Runtime Environment,即Java运行环境,有时简称JRE。
如果你只需要运行Java程序或Applet,下载并安装它即可。
如果你要自行开发Java软件,请下载JDK。在JDK中附带有JRE。
注意由于Microsoft对Java的支持不完全,请不要使用IE自带的虚拟机来运行Applet,务

安装一个JRE或JDK。

Q1.3 学习Java用什么工具比较好?
答:作者建议首先使用JDK+文本编辑器,这有助你理解下列几个基础概念:path,
classp
ath,package 
并熟悉基本命令:javac和java。并且下载和你的JDK版本一致的API帮助。
如果你不确定类或函数的用法,请先查阅API而不是发贴求助。
当你熟悉Java之后,你可以考虑开始使用一个IDE。
作者推荐eclipse,下载网址http://www.eclipse.org。因为eclispe是免费的,插件化


eclispe的主要缺点是缺乏一个可视化的桌面程序开发工具,
幸运的是IBM在2003年11月已经将部分代码捐给eclipse组织,可以预计这个缺点很快就

得到弥补。
无论如何,请不要使用Microsoft的VJ++!众所周知Microsoft从来就没有认真支持过
Java

最后但并非最不重要,要有一本好的参考书,并且英文要过关。

Q1.4  学习Java有哪些好的参考书?
答:作者首先推荐Thinking in Java,中文名《Java编程思想》,有中文版。
目前的最新版本是第三版。
http://64.78.49.204可以免费下载英文版。
该书第一章介绍了很多面向对象的编程思想,作为新手应当认真阅读。
除此以外,O'relly出版社和Wrox出版社的书也不错。作者本人不喜欢大陆作者的书。
也许你觉得英文太难,但是网上大多数资料都是英文的。另外,你需要经常查阅API,而

也是英文的。

Q1.5  Java和C++哪个更好?
答:这个问题是一个很不恰当的问题。你应该问:Java和C++哪个更适用于我的项目?
Java的优点和缺点一样明显。
跨平台是Java的主要优点,但代价是运行速度的下降。
VC和Windows平台有良好的集成和足够快的速度,但是也只能局限在Windows平台上。
和C++相比,Java学起来更快,开发人员不会碰到很多容易出错的特性。
但是VB程序员甚至只需要拼装模块就可以了。

Q1.6  什么是J2SE/J2EE/J2ME?
答:J2SE就是一般的Java。
J2ME是针对嵌入式设备的,比如支持Java的手机,它有自己的JRE和SDK。
J2EE是一组用于企业级程序开发的规范和类库,它使用J2SE的JRE。

二、命令篇

Q2.1  我写了第一个Java程序,应该如何编译/运行?
答:首先请将程序保存为xxx.java文件,注意你可能需要修改文件后缀名。
然后在dos窗口下使用javac xxx.java命令,你会发现该目录下多了一个xxx.class文
件,

再使用java xxx命令,你的java程序就开始运行了。

Q2.2  我照你说的做了,但是出现什么“'javac' 不是内部或外部命令,也不是可运行

程序或批处理文件。”。
答:你遇到了path问题。操作系统在一定的范围(path)内搜索javac.exe,但是没能找
到。

请编辑你的操作系统环境变量,新增一个JAVA_HOME变量,设为你JDK的安装目录,
再编辑Path变量,加上一项 %JAVA_HOME%\bin。
然后保存并新开一个dos窗口,你就可以使用javac和java命令了。

Q2.3  环境变量怎么设置?
答:请向身边会设的人咨询。

Q2.4  我在javac xxx.java的时候显示什么“unreported exception 
java.io.IOExcepti
on;”。
答:参见Q4.8以了解java中的异常机制。

Q2.5  javac xxx.java顺利通过了,但是java xxx的时候显示什么
“NoClassDefFoundErr
or”。
答:1. 你遇到了classpath问题。java命令在一定的范围(classpath)内搜索你直接或间

使用的class文件,但是未能找到。
首先请确认你没有错敲成java xxx.class,
其次,检查你的CLASSPATH环境变量,其实你并不需要设置该变量,
但如果你设置了该变量又没有包含.(代表当前目录)的项,
你就会遇到这个问题。请在你的CLASSPATH环境变量中加入一项. 或干脆删掉这个变量。

2. 如果你使用了并非JDK自带的标准包,比如javax.servlet.*包,也会遇到这个问题,

将相应的jar文件加入classpath。
3. 如果你在java源文件中定义了package,请参见Q2.11。


Q2.6  我在java xxx的时候显示“Exception in thread "main" 
java.lang.NoSuchMetho
dError: main”。
答:首先,在你的程序中每个java文件有且只能有一个public类,
这个类的类名必须和文件名的大小写完全一样。
其次,在你要运行的类中有且只能有一个public static void main(String[] args)方


这个方法就是你的主程序。


Q2.7  在java xxx的时候显示“Exception in thread "main" 
java.lang.NullPointerEx
ception”。
答:在程序中你试图在值为null的对象变量上调用方法,请检查你的程序确保你的对象
被恰当的初始化。
参见Q4.8以了解java中的异常机制。


Q2.8 package是什么意思?怎么用?
答:为了唯一标识每个类并分组,java使用了package的概念。
每个类都有一个全名,例如String的全名是java.lang.String,其中java.lang是包名,
S
tring是短名。按照java命名惯例,包名是全部小写的,而类名的第一个字母是大写的。
这样,如果你自行定义了同样名字的类String,你可以把它放在mypackage中,
通过使用全名mypackage.String和java.lang.String来区分这两个类。
同时,将逻辑上相关的类放在同一个包中,可以使程序结构更为清楚。
为了定义包,你要做的就是在java文件开头加一行“package mypackage;”。
注意包没有嵌套或包含关系,mypackage包和mypackage.mysubpackage包对JRE来说是并
列的两个包(虽然开发者可
能暗示包含关系)。

Q2.9 我没有声明任何package会怎么样?
答:你的类被认为放在默认包中。这时全名和短名是一致的。

Q2.10 在一个类中怎么使用其他类?
答:如果你使用java.lang包或者默认包中的类,不用做任何事。
如果你的类位于mypackage包中,并且要调用同一包中的其他类,也不用做任何事。
如果你使用其他包中的类,在package声明之后,类声明之前使用import 
otherpackage1.Class
1; 或 import otherpackage2.*;  
这里.*表示引入这个包中的所有类。然后在程序中你可以使用其他类的短名。
如果短名间有重名冲突,必须使用全名来区分。
注意在使用其他包中的类时,你只能使用public的类和接口,参见Q5.4。

Q2.11 我用了package的时候显示"NoClassDefFoundError",但是我把所有package去掉

时候能正常运行。
答:将你的java文件按包名组织存放。
比如你的工作目录是/work,你的类是package1.Class1,那么将它存放
为/work/package1
/Class1.java。
如果没有声明包,那么直接放在/work下。
在/work下执行javac package1/class1.java,再执行java package1.class1,你会发现

切正常。
另外,如果你的类的个数已经多到了你需要使用包来组织的话,你可以考虑开始使用
IDE。

Q2.12 我想把java编译成exe文件,该怎么做?
答:JDK只能将java源文件编译为class文件。
class文件是一种跨平台的字节码,必须依赖平台相关的JRE来运行。Java以此来实现跨

台性。
有些开发工具可以将java文件编译为exe文件。作者反对这种做法,因为这样就取消了跨

台性。
如果你确信你的软件只在Windows平台上运行,你可以考虑使用C++/C#来编程。

Q2.13 我在编译的时候遇到什么"deprecated API",是什么意思?
答:所谓deprecated是指已经过时,但是为了向前兼容起见仍然保留的方法。
这些方法可能会在以后取消支持。你应当改用较新的方法。
在API里面会说明你应当用什么方法来代替之。

三、I/O篇

Q3.1 我怎么给java程序加启动参数,就像dir /p/w那样?
答:还记得public static void main(String[] args)吗?这里的args就是你的启动参


在运行时你输入java package1.class1 arg1 arg2,args中就会有两个String,第一个

arg1,第二个是arg2。

Q3.2 我怎么从键盘输入一个int/double/字符串?
答:java的I/O操作比C++要复杂一点。如果要从键盘输入,样例代码如下:
BufferedReader cin = new BufferedReader( new InputStreamReader( 
System.in ) );

String s = cin.readLine();
这样你就获得了一个字符串,如果你需要数字的话再使用:
int n = Integer.parseInt( s ); 或者 double d = Double.parseDouble( s );
来将字符串"534"转换成int或double。

Q3.3 我怎么输出一个int/double/字符串?
答:使用System.out.println(n)或者System.out.println("Hello")等等。

Q3.4 我发现有些书上直接用System.in输入,比你要简单得多。
答:java使用unicode,是双字节。而System.in是单字节的stream。
如果你要输入双字节文字比如中文,请使用作者的做法。

Q3.5 我怎么从文件输入/输出一个int/double/字符串?
答:类似于从键盘输入,只不过换成
BufferedReader fin = new BufferedReader( new FileReader(" myFileName " ) );
PrintWriter fout = new PrintWriter( new FileWriter(" myFileName " ) );
另外如果你还没下载API,请开始下载并阅读java.io包中的内容。

Q3.6 我想读写文件的指定位置,该怎么办?
答:java.io.RandomAccessFile可以满足你的需要。

Q3.7 怎么判断要读的文件已经到了尽头?
答:在Reader的read方法中明确说明返回-1表示流的结尾。

四、 关键字篇

Q4.1  java里面怎么定义宏?
答:java不支持宏,因为宏代换不能保证类型安全。
如果你需要定义常量,可以将它定义为某个类的static final成员。参见Q4.2和Q4.6。


Q4.2  java里面没法用const。
答:你可以用final关键字。例如 final int m = 9。被声明为final的变量不能被再次

值。唯一的例外是所谓blank final,如下例所示:
public class MyClass1 {
    private final int a = 3;
    private final int b; // blank final

    public MyClass1() {
        a = 5; // 不合法,final变量不能被再次赋值。
        b = 4; // 合法,这是b第一次被赋值。
        b = 6; // 不合法,b不能被再次赋值。
    }
}
final也可以用于声明方法或类,被声明为final的方法或类不能被继承。
注意const是java的保留字以备扩充。

Q4.3  java里面也不能用goto。
答:甚至在面向过程的语言中你也可以完全不用goto。请检查你的程序流程是否合理。

如果你需要从多层循环中迅速跳出,java增强了(和C++相比)break和continue的功
能,
支持label。
例如:
outer : 
while( ... )
{
    inner :
    for( ... )
    {
           ...   break inner; ...
           ... continue outer; ...
    }
}
和const一样,goto也是java的保留字以备扩充。

Q4.4  java里面能不能重载操作符?
答:不能。String的+号是唯一一个内置的重载操作符。你可以通过定义接口和方法来实

类似功能。

Q4.5  我new了一个对象,但是没法delete掉它。
答:java有自动内存回收机制,即所谓Garbarge Collection。你不需要删除对象。你再

不用担心指针错误,内存溢出了。

Q4.6  我想知道为什么main方法必须被声明为public static?为什么在main方法中不能

用非static成员?
答:声明为public是为了这个方法可以被外部调用,详情见Q5.4。
static是为了将某个成员变量/方法关联到类(class)而非实例(instance)。
你不需要创建一个对象就可以直接使用这个类的static成员,因而在static成员中不能

用非static成员,因为后者是关联到对象实例(instance)的。
在A类中调用B类的static成员可以使用B.staticMember的写法。
注意一个类的static成员变量是唯一的,被所有该类对象所共享的,在多线程程序设计
中尤其要谨慎小心。
类的static成员是在类第一次被JRE装载的时候初始化的。
你可以使用如下方法来使用非static成员:
public class A
{
    private void someMethod() //非static成员
    {}
    public static void main(String args)
    {
         A a = new A();  //创建一个对象实例
         a.someMethod();  //现在你可以使用非static方法了
    }
}


Q4.7  throw和throws有什么不同?
答:throws用于方法声明中,声明一个方法会抛出哪些异常。而throw是在方法体中实际
执行抛出异常的
动作。
如果你在方法中throw一个异常,却没有在方法声明中声明之,编译器会报错。
注意Error和RuntimeException的子类是例外,无需特别声明。

Q4.8  什么是异常?
答:异常最早在Ada语言中引入,用于在程序中动态处理错误并恢复。
你可以在方法中拦截底层异常并处理之,也可以抛给更高层的模块去处理。
你也可以抛出自己的异常指示发生了某些不正常情况。常见的拦截处理代码如下:
try
{
    ......//以下是可能发生异常的代码
        ...... //异常被你或低层API抛出,执行流程中断并转向拦截代码。
        ...... 
}
catch(Exception1 e) //如果Exception1是Exception2的子类并要做特别处理,应排在


{
  //发生Exception1时被该段拦截
}
catch(Exception2 e)
{
  //发生Exception2时被该段拦截
}
finally //这是可选的
{
   //无论异常是否发生,均执行此段代码
   //即使在catch段中又向外抛出了新的exception,finally段也会得到执行。
}

Q4.9  final和finally有什么不同?
答:final请见Q4.2。finally用于异常机制,参见Q4.8。

五、 面向对象篇

Q5.1  extends和implements有什么不同?
答:对于class而言,extends用于(单)继承一个类(class),而implements用于实现
一个接口(interf
ace)。
interface的引入是为了部分地提供多继承的功能。
在interface中只需声明方法头,而将方法体留给实现的class来做。
这些实现的class的实例完全可以当作interface的实例来对待。
在interface之间也可以声明为extends(多继承)的关系。
注意一个interface可以extends多个其他interface。

Q5.2  java怎么实现多继承?
答:java不支持显式的多继承。
因为在显式多继承的语言例如c++中,会出现子类被迫声明祖先虚基类构造函数的问题,

而这是违反面向对象的封装性原则的。
java提供了interface和implements关键字来部分地实现多继承。参见Q5.1。

Q5.3 abstract是什么?
答:被声明为abstract的方法无需给出方法体,留给子类来实现。
而如果一个类中有abstract方法,那么这个类也必须声明为abstract。
被声明为abstract的类无法实例化,尽管它可以定义构造方法供子类使用。

Q5.4 public,protected,private有什么不同?
答:这些关键字用于声明类和成员的可见性。
public成员可以被任何类访问,
protected成员限于自己和子类访问,
private成员限于自己访问。
Java还提供了第四种的默认可见性,一般称为package private,当没有任何
public,protected,private修饰符时,成员
是同一包内可见。
类可以用public或默认来修饰。

Q5.5 Override和Overload有什么不同?
答:Override是指父类和子类之间方法的继承关系,这些方法有着相同的名称和参数类


Overload是指同一个类中不同方法(可以在子类也可以在父类中定义)间的关系,
这些方法有着相同的名称和不同的参数类型。


Q5.6 我继承了一个方法,但现在我想调用在父类中定义的方法。
答:用super.xxx()可以在子类中调用父类方法。

Q5.7 我想在子类的构造方法中调用父类的构造方法,该怎么办?
答:在子类构造方法的第一行调用super(...)即可。

Q5.8 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。
答:在构造方法第一行调用this(...)。

Q5.9 我没有定义构造方法会怎么样?
答:自动获得一个无参数的构造方法。

Q5.10 我调用无参数的构造方法失败了。
答:如果你至少定义了一个构造方法,就不再有自动提供的无参数的构造方法了。
你需要另外显式定义一个无参数的构造方法。
另外一种可能是你的构造方法或者类不是public的,参见Q5.4了解java中的可见性。

Q5.11 我该怎么定义类似于C++中的析构方法(destructor)?
答:提供一个void finalize()方法。在Garbarge Collector回收该对象时会调用该方
法。

注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要用到该方法。


Q5.12 我想将一个父类对象转换成一个子类对象该怎么做?
答:强制类型转换。如
public void meth(A a)
{
    B b = (B)a;
}
如果a实际上并不是B的实例,会抛出ClassCastException。所以请确保a确实是B的实
例。


Q5.13 其实我不确定a是不是B的实例,能不能分情况处理?
答:可以使用instanceof操作符。例如
if( a instanceof B )
{
    B b = (B)a;
}
else
{
    ...
}

Q5.14 我在方法里修改了一个对象的值,但是退出方法后我发现这个对象的值没变!
答:很可能你把传入参数重赋了一个新对象,例如下列代码就会造成这种错误:
public void fun1(A a) //a是局部参数,指向了一个外在对象。
{
    a = new A(); //a指向了一个新对象,和外在对象脱钩了。如果你要让a作为
传出变量,
不要写这一句。
        a.setAttr(attr);//修改了新对象的值,外在对象没有被修改。
}
基本类型也会出现这种情况。例如:
public void fun2(int a)
{
    a = 10;//只作用于本方法,外面的变量不会变化。
}

六、java.util篇

Q6.1 java能动态分配数组吗?
答:可以。例如int n = 3; Language[] myLanguages = new Language[n];

Q6.2 我怎么知道数组的长度?
答:用length属性。如上例中的  myLanguages.length 就为 3。

Q6.3 我还想让数组的长度能自动改变,能够增加/删除元素。
答:用顺序表--java.util.List接口。
你可以选择用ArrayList或是LinkedList,前者是数组实现,后者是链表实现。
例如:  List list = new ArrayList(); 或是 List list = new LinkedList();  。

Q6.4 什么是链表?为什么要有ArrayList和LinkedList两种List?
答:请补习数据结构。

Q6.5 我想用队列/栈。
答:用java.util.LinkedList。

Q6.6 我希望不要有重复的元素。
答:用集合--java.util.Set接口。例如:Set set = new HashSet()。

Q6.7 我想遍历集合/Map。
答:用java.util.Iterator。参见API。

Q6.8 我还要能够排序。
答:用java.util.TreeSet。例如:Set set = new TreeSet()。放进去的元素会自动排


你需要为元素实现Comparable接口,还可能需要提供equals()方法,compareTo()方法,
h
ashCode()方法。

Q6.9 但是我想给数组排序。
答:java.util.Arrays类包含了sort等实用方法。

Q6.10 我想按不同方式排序。
答:为每种方式定义一个实现了接口Comparator的排序类并和Arrays或TreeSet综合运
用。


Q6.11 Map有什么用?
答:存储key-value的关键字-值对,你可以通过关键字来快速存取相应的值。

Q6.12 set方法没问题,但是get方法返回的是Object。
答:强制类型转换成你需要的类型。参见Q5.12。

Q6.13 ArrayList和Vector有什么不同?HashMap和Hashtable有什么不同?
答:ArrayList和HashMap是多线程不安全的,在多个线程中访问同一个ArrayList对象可

会引起冲突并导致错误。
而Vector和Hashtable是多线程安全的,即使在多个线程中同时访问同一个Vector对象也

会引起差错。
看起来我们更应该使用Vector和Hashtable,但是实际上Vector和Hashtable的性能太
差,
所以如果你不在多线程中使用的话,还是应该用ArrayList和HashMap。

Q6.14 我要获得一个随机数。
答:使用java.util.Random类。

Q6.15 我比较两个String总是false,但是它们明明都是"abc" !
答:比较String一定要使用equals或equalsIgnoreCase方法,不要使用 == !
==比较的是两个引用(变量)是否指向了同一个对象,而不是比较其内容。

Q6.16 我想修改一个String但是在String类中没找到编辑方法。
答:使用StringBuffer类。
String str = "......."; //待处理的字符串
StringBuffer buffer = new StringBuffer(str); //使用该字符串初始化一个
StringBuf
fer
buffer.append("..."); //调用StringBuffer的相关API来编辑字符串
String str2 = buffer.toString(); //获得编辑后的字符串。
另外,如果你需要将多个字符串连接起来,请尽量避免使用+号直接连接,而是使用
Strin
gBuffer.append()方法。

Q6.17 我想处理日期/时间。
答:使用java.util.Date类。你可以使用java.text.SimpleDateFormat类来在String和
Da
te间互相转换。
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //

定日期格式
Date date = formatter.parse("2003-07-26 18:30:35"); //将符合格式的String转换

Date
String s = formatter.format(date); //将Date转换为符合格式的String
关于定义日期格式的详细信息请参见API。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=427201

 

转自:http://blog.csdn.net/xuetang/archive/2005/07/17/427201.aspx

熟悉Java的类库

【转帖】第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是 
java.lang.*; 
java.io.*; 
java.util.*; 
java.sql.*; 

这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O'reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的: 
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。 

对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That'all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。 

第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些: 
java.text.*; 
java.net.*; 
javax.naming.*; 
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。 

第六步,Java Web 编程,Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。 

在Servlet/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。 

此外Java Web编程学习的重点要放在Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。 

第七步,J2EE编程 
以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。 

首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。 

然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。 

在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。 

在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。 

J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。 

另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。 

Java Learning Path(四) 方法篇 

Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。 

举个例子,我们都编过Hello World 


public class HelloWorld {  public static void main(String[] args) {    System.out.println("Hello World");  }} 


很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。 

我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。 

此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。 

其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose 
java ?verbose 
javac ?verbose 以及其它很多JDK工具都有这个选项 
-verbose 可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。 

另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。 

所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。 

Java Learning Path(五)资源篇 

1、 http://java.sun.com/ (英文) 
Sun的Java网站,是一个应该经常去看的地方。不用多说。 

2、http://www-900.ibm.com/developerWorks/cn/ 
IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!! 

3、http://www.javaworld.com/ (英文) 
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。 

4、http://dev2dev.bea.com.cn/index.jsp 
BEA的开发者园地,BEA作为最重要的App Server厂商,有很多独到的技术,在Weblogic上做开发的朋友不容错过。 

5、http://www.huihoo.com/ 
灰狐动力网站,一个专业的中间件网站,虽然不是专业的Java网站,但是在J2EE企业应用技术方面有深厚的造诣。 

6、http://www.theserverside.com/ (英文) 
TheServerSide是一个著名的专门面向Java Server端应用的网站。 

7、http://www.javaresearch.org/ 
Java研究组织,有很多优秀的Java方面的文章和教程,特别是在JDO方面的文章比较丰富。 

8、http://www.cnjsp.org/ 
JSP技术网站,有相当多的Java方面的文章和资源。 

9、http://www.jdon.com/ 
Jdon论坛,是一个个人性质的中文J2EE专业技术论坛,在众多的Java的中文论坛中,Jdon一个是技术含量非常高,帖子质量非常好的论坛。 

10、http://sourceforge.net/ 
SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件。 

Java Learning Path.doc (78.0k) 

作者Blog:http://blog.csdn.net/mopfoxs/ 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=597937

 

转自:http://blog.csdn.net/hangke20020/archive/2006/02/13/597937.aspx

简单的理解 类的继承 和 多态性

/*
 * Created on 2004-8-31
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author diyer6
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
/*
                                                                    类的继承
   1、在java中通过关键字 extends 继承一个已有的类,被继承的类成为父类(基类),新的类
         称为 子类(派生类)。
   2、在java中,不允许多继承。
   3、在子类中定义一个与父类同名、返回类型、参数类型均相同的一个方法,称为方法的 覆盖。
   4、覆盖 发生在子类与父类之间。
   5、特殊变量super 提供了对父类的访问。
   6、可以使用super 访问父类被子类隐藏的变量和覆盖的方法。
   7、每个子类构造方法的第一条语句,都是隐含的调用super(),如果父类没有构造方法,
         那么在编译的时候就会报错。 
      
                                                                       多态性
    1、通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法。
    2、简单概括多态性:当我们将子类对象的引用传给声明为父类的一个对象变量,如果子类有
          这个方法就调用子类的方法,如果子类没有这个方法就调用父类的这个方法。
    3、多态性的好处:它可以根据在运行的时候,根据我们传递不同对象的引用,
          来调用不同对象的方法。                      
 */
public class Animal {  //父类
 int height,weight; // 变量(数据)
 Animal(int height, int weight)//父类的构造方法 (带参数的父类构造方法)
 {
  System.out.println("animal construct");
 }
 void eat() //父类的方法
 {
  System.out.println("animal eat");
 }
 void sleep()//父类的方法
 {
  System.out.println("animal sleep");
 }
 void breathe()//父类的方法
 {
  System.out.println("animal breathe");
 }
 

}
class Fish extends Animal { //子类 关键字 extends 使 Fish 继承了 Animal 的 变量和方法
 int height;//子类的变量 ,在调用时会隐藏父类的变量。
 Fish()//子类的构造方法
 {
  super(30,40);//利用 super 调用带参数的父类构造方法。
  //不能Animal(30,40)这样直接调用父类构造方法。只能用super()调用。
  //父类的构造方法不能被子类继承。
  
  //super();//在调用子类构造方法的时候,隐含的调用了 super() 变量,
 //也就是先调用父类的构造方法(不带参数)在调用子类的构造方法。如果父类没有构造方法,编译器就会报错。
  System.out.println("fish construct");
 }
 void breathe()//子类的方法
 {
  super.breathe();//通过 super 特殊变量 可以调用被子类覆盖的父类方法。
  super.height=40;//通过 super 特殊变量 可以调用被子类隐藏的父类变量。
  System.out.println("fish bubble");
 }
}
class Integration {
 static void fn(Animal an)
 {
  an.breathe();
 }
 public static void main(String[] args){
  Animal an = new Animal(); //实例化Animal类的对象,an是对象的reference(引用)
  Fish fh = new Fish();//实例化Fish类的对象,fh是对象的reference(引用)
  an.breathe();//an 调用Animal类的void breathe()方法。
  fh.height=30;//fh给Animal类的变量int height 赋值.继承父类的成员变量.
  fh.breathe();//fh调用它自己的方法,假如它自己没有这个方法但父类(Animal)中有这个方法,它就会调用父类中的这个方法。
  //反之(如果有),它就会调用它自己的方法,这就是方法的覆盖。
  
  //多态性
  Animal an;//将an声明为Animal的对象变量。
  Fish fh2 = new Fish();
  fh2.eat();
  an=fh;
  an=fh2;//因为子类没有eat()这个方法,所以这调用的是父类的eat()方法。
  Integration.fn(an);//直接用类名调用静态方法(static)。多态性
 } 
}

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=90624

 

转自http://blog.csdn.net/kafei/archive/2004/09/01/90624.aspx

 
Photo 1 of 1